diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 1f0f5a5217..14b81022dd 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -2443,6 +2443,66 @@ namespace Emby.Server.Implementations.Data 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 GetItemList(InternalItemsQuery query) { if (query == null) @@ -2859,7 +2919,7 @@ namespace Emby.Server.Implementations.Data } if (string.Equals(name, ItemSortBy.SeriesDatePlayed, StringComparison.OrdinalIgnoreCase)) { - return new Tuple("(Select MAX(LastPlayedDate) from TypedBaseItems B" + GetJoinUserDataText(query) + " where B.SeriesPresentationUniqueKey=A.PresentationUniqueKey)", false); + return new Tuple("(Select MAX(LastPlayedDate) from TypedBaseItems B" + GetJoinUserDataText(query) + " where Played=1 and B.SeriesPresentationUniqueKey=A.PresentationUniqueKey)", false); } return new Tuple(name, false); diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 3db8c7213c..ad91988e53 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1279,6 +1279,26 @@ namespace Emby.Server.Implementations.Library 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 { parent }); + query.ParentId = null; + } + } + + if (query.User != null) + { + AddUserToQuery(query, query.User); + } + + return ItemRepository.GetCount(query); + } + public IEnumerable GetItemList(InternalItemsQuery query, List parents) { SetTopParentIdsOrAncestors(query, parents); diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index caebff16f2..872011ce8d 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -138,16 +138,24 @@ namespace MediaBrowser.Controller.Entities.TV var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var seriesKey = GetUniqueSeriesKey(this); - var result = LibraryManager.GetItemsResult(new InternalItemsQuery(user) + var result = LibraryManager.GetCount(new InternalItemsQuery(user) { AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, IncludeItemTypes = new[] { typeof(Season).Name }, IsVirtualItem = false, - Limit = 0 + Limit = 0, + DtoOptions = new Dto.DtoOptions + { + Fields = new List + { + + }, + EnableImages = false + } }); - return result.TotalRecordCount; + return result; } public override int GetRecursiveChildCount(User user) @@ -159,19 +167,23 @@ namespace MediaBrowser.Controller.Entities.TV { AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, + DtoOptions = new Dto.DtoOptions + { + Fields = new List + { + + }, + EnableImages = false + } }; - if (query.SortBy.Length == 0) - { - query.SortBy = new[] { ItemSortBy.SortName }; - } if (query.IncludeItemTypes.Length == 0) { query.IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name }; } query.IsVirtualItem = false; query.Limit = 0; - var totalRecordCount = LibraryManager.GetItemsResult(query).TotalRecordCount; + var totalRecordCount = LibraryManager.GetCount(query); return totalRecordCount; } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 955230b8ab..d297fd0065 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -571,5 +571,6 @@ namespace MediaBrowser.Controller.Library void RegisterIgnoredPath(string path); void UnRegisterIgnoredPath(string path); + int GetCount(InternalItemsQuery query); } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index 7a822e7b4e..58ae1f3b0e 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -163,6 +163,8 @@ namespace MediaBrowser.Controller.Persistence /// Task. Task UpdateInheritedValues(CancellationToken cancellationToken); + int GetCount(InternalItemsQuery query); + QueryResult> GetGenres(InternalItemsQuery query); QueryResult> GetMusicGenres(InternalItemsQuery query); QueryResult> GetGameGenres(InternalItemsQuery query);