update next up queries

This commit is contained in:
Luke Pulverenti 2016-12-12 14:40:27 -05:00
parent c2d0fd9985
commit d84bb7160f
5 changed files with 104 additions and 9 deletions

View File

@ -2443,6 +2443,66 @@ namespace Emby.Server.Implementations.Data
return " from TypedBaseItems " + alias; return " from TypedBaseItems " + alias;
} }
public int GetCount(InternalItemsQuery query)
{
if (query == null)
{
throw new ArgumentNullException("query");
}
CheckDisposed();
//Logger.Info("GetItemList: " + _environmentInfo.StackTrace);
var now = DateTime.UtcNow;
// Hack for right now since we currently don't support filtering out these duplicates within a query
if (query.Limit.HasValue && query.EnableGroupByMetadataKey)
{
query.Limit = query.Limit.Value + 4;
}
var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, new [] { "count(distinct PresentationUniqueKey)" })) + GetFromText();
commandText += GetJoinUserDataText(query);
var whereClauses = GetWhereClauses(query, null);
var whereText = whereClauses.Count == 0 ?
string.Empty :
" where " + string.Join(" AND ", whereClauses.ToArray());
commandText += whereText;
//commandText += GetGroupBy(query);
int count = 0;
using (WriteLock.Read())
{
using (var connection = CreateConnection(true))
{
using (var statement = PrepareStatementSafe(connection, commandText))
{
if (EnableJoinUserData(query))
{
statement.TryBind("@UserId", query.User.Id);
}
BindSimilarParams(query, statement);
// Running this again will bind the params
GetWhereClauses(query, statement);
count = statement.ExecuteQuery().SelectScalarInt().First();
}
}
LogQueryTime("GetCount", commandText, now);
}
return count;
}
public List<BaseItem> GetItemList(InternalItemsQuery query) public List<BaseItem> GetItemList(InternalItemsQuery query)
{ {
if (query == null) if (query == null)
@ -2859,7 +2919,7 @@ namespace Emby.Server.Implementations.Data
} }
if (string.Equals(name, ItemSortBy.SeriesDatePlayed, StringComparison.OrdinalIgnoreCase)) if (string.Equals(name, ItemSortBy.SeriesDatePlayed, StringComparison.OrdinalIgnoreCase))
{ {
return new Tuple<string, bool>("(Select MAX(LastPlayedDate) from TypedBaseItems B" + GetJoinUserDataText(query) + " where B.SeriesPresentationUniqueKey=A.PresentationUniqueKey)", false); return new Tuple<string, bool>("(Select MAX(LastPlayedDate) from TypedBaseItems B" + GetJoinUserDataText(query) + " where Played=1 and B.SeriesPresentationUniqueKey=A.PresentationUniqueKey)", false);
} }
return new Tuple<string, bool>(name, false); return new Tuple<string, bool>(name, false);

View File

@ -1279,6 +1279,26 @@ namespace Emby.Server.Implementations.Library
return ItemRepository.GetItemList(query); return ItemRepository.GetItemList(query);
} }
public int GetCount(InternalItemsQuery query)
{
if (query.Recursive && query.ParentId.HasValue)
{
var parent = GetItemById(query.ParentId.Value);
if (parent != null)
{
SetTopParentIdsOrAncestors(query, new List<BaseItem> { parent });
query.ParentId = null;
}
}
if (query.User != null)
{
AddUserToQuery(query, query.User);
}
return ItemRepository.GetCount(query);
}
public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, List<BaseItem> parents) public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, List<BaseItem> parents)
{ {
SetTopParentIdsOrAncestors(query, parents); SetTopParentIdsOrAncestors(query, parents);

View File

@ -138,16 +138,24 @@ namespace MediaBrowser.Controller.Entities.TV
var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
var seriesKey = GetUniqueSeriesKey(this); var seriesKey = GetUniqueSeriesKey(this);
var result = LibraryManager.GetItemsResult(new InternalItemsQuery(user) var result = LibraryManager.GetCount(new InternalItemsQuery(user)
{ {
AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
IncludeItemTypes = new[] { typeof(Season).Name }, IncludeItemTypes = new[] { typeof(Season).Name },
IsVirtualItem = false, IsVirtualItem = false,
Limit = 0 Limit = 0,
DtoOptions = new Dto.DtoOptions
{
Fields = new List<ItemFields>
{
},
EnableImages = false
}
}); });
return result.TotalRecordCount; return result;
} }
public override int GetRecursiveChildCount(User user) public override int GetRecursiveChildCount(User user)
@ -159,19 +167,23 @@ namespace MediaBrowser.Controller.Entities.TV
{ {
AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
DtoOptions = new Dto.DtoOptions
{
Fields = new List<ItemFields>
{
},
EnableImages = false
}
}; };
if (query.SortBy.Length == 0)
{
query.SortBy = new[] { ItemSortBy.SortName };
}
if (query.IncludeItemTypes.Length == 0) if (query.IncludeItemTypes.Length == 0)
{ {
query.IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name }; query.IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name };
} }
query.IsVirtualItem = false; query.IsVirtualItem = false;
query.Limit = 0; query.Limit = 0;
var totalRecordCount = LibraryManager.GetItemsResult(query).TotalRecordCount; var totalRecordCount = LibraryManager.GetCount(query);
return totalRecordCount; return totalRecordCount;
} }

View File

@ -571,5 +571,6 @@ namespace MediaBrowser.Controller.Library
void RegisterIgnoredPath(string path); void RegisterIgnoredPath(string path);
void UnRegisterIgnoredPath(string path); void UnRegisterIgnoredPath(string path);
int GetCount(InternalItemsQuery query);
} }
} }

View File

@ -163,6 +163,8 @@ namespace MediaBrowser.Controller.Persistence
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task UpdateInheritedValues(CancellationToken cancellationToken); Task UpdateInheritedValues(CancellationToken cancellationToken);
int GetCount(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetGenres(InternalItemsQuery query); QueryResult<Tuple<BaseItem, ItemCounts>> GetGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetMusicGenres(InternalItemsQuery query); QueryResult<Tuple<BaseItem, ItemCounts>> GetMusicGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetGameGenres(InternalItemsQuery query); QueryResult<Tuple<BaseItem, ItemCounts>> GetGameGenres(InternalItemsQuery query);