|
@@ -343,6 +343,9 @@ namespace Emby.Server.Implementations.Data
|
|
// series
|
|
// series
|
|
"create index if not exists idx_TypeSeriesPresentationUniqueKey1 on TypedBaseItems(Type,SeriesPresentationUniqueKey,PresentationUniqueKey,SortName)",
|
|
"create index if not exists idx_TypeSeriesPresentationUniqueKey1 on TypedBaseItems(Type,SeriesPresentationUniqueKey,PresentationUniqueKey,SortName)",
|
|
|
|
|
|
|
|
+ // series next up
|
|
|
|
+ "create index if not exists idx_SeriesPresentationUniqueKey on TypedBaseItems(SeriesPresentationUniqueKey)",
|
|
|
|
+
|
|
// live tv programs
|
|
// live tv programs
|
|
"create index if not exists idx_TypeTopParentIdStartDate on TypedBaseItems(Type,TopParentId,StartDate)",
|
|
"create index if not exists idx_TypeTopParentIdStartDate on TypedBaseItems(Type,TopParentId,StartDate)",
|
|
|
|
|
|
@@ -2263,6 +2266,10 @@ namespace Emby.Server.Implementations.Data
|
|
{
|
|
{
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
+ if (sortingFields.Contains(ItemSortBy.SeriesDatePlayed, StringComparer.OrdinalIgnoreCase))
|
|
|
|
+ {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
|
|
if (query.IsFavoriteOrLiked.HasValue)
|
|
if (query.IsFavoriteOrLiked.HasValue)
|
|
{
|
|
{
|
|
@@ -2436,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)
|
|
@@ -2656,7 +2723,7 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- var totalRecordCount = 0;
|
|
|
|
|
|
+ var result = new QueryResult<BaseItem>();
|
|
var isReturningZeroItems = query.Limit.HasValue && query.Limit <= 0;
|
|
var isReturningZeroItems = query.Limit.HasValue && query.Limit <= 0;
|
|
|
|
|
|
var statementTexts = new List<string>();
|
|
var statementTexts = new List<string>();
|
|
@@ -2714,23 +2781,23 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
|
|
- if (query.EnableTotalRecordCount)
|
|
|
|
|
|
+ if (query.EnableTotalRecordCount)
|
|
|
|
+ {
|
|
|
|
+ using (var statement = statements[statements.Count - 1])
|
|
{
|
|
{
|
|
- using (var statement = statements[statements.Count - 1])
|
|
|
|
|
|
+ if (EnableJoinUserData(query))
|
|
{
|
|
{
|
|
- if (EnableJoinUserData(query))
|
|
|
|
- {
|
|
|
|
- statement.TryBind("@UserId", query.User.Id);
|
|
|
|
- }
|
|
|
|
|
|
+ statement.TryBind("@UserId", query.User.Id);
|
|
|
|
+ }
|
|
|
|
|
|
- BindSimilarParams(query, statement);
|
|
|
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
|
|
|
- // Running this again will bind the params
|
|
|
|
- GetWhereClauses(query, statement);
|
|
|
|
|
|
+ // Running this again will bind the params
|
|
|
|
+ GetWhereClauses(query, statement);
|
|
|
|
|
|
- totalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
|
- }
|
|
|
|
|
|
+ result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2738,11 +2805,8 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
LogQueryTime("GetItems", commandText, now);
|
|
LogQueryTime("GetItems", commandText, now);
|
|
|
|
|
|
- return new QueryResult<BaseItem>()
|
|
|
|
- {
|
|
|
|
- Items = list.ToArray(),
|
|
|
|
- TotalRecordCount = totalRecordCount
|
|
|
|
- };
|
|
|
|
|
|
+ result.Items = list.ToArray();
|
|
|
|
+ return result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2855,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.Guid in (Select ItemId from AncestorIds where AncestorId in (select guid from typedbaseitems c where C.Type = 'MediaBrowser.Controller.Entities.TV.Series' And C.Guid in (Select AncestorId from AncestorIds where ItemId=A.Guid))))", 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);
|
|
@@ -3094,7 +3158,7 @@ namespace Emby.Server.Implementations.Data
|
|
{
|
|
{
|
|
using (var connection = CreateConnection(true))
|
|
using (var connection = CreateConnection(true))
|
|
{
|
|
{
|
|
- var totalRecordCount = 0;
|
|
|
|
|
|
+ var result = new QueryResult<Guid>();
|
|
|
|
|
|
connection.RunInTransaction(db =>
|
|
connection.RunInTransaction(db =>
|
|
{
|
|
{
|
|
@@ -3136,7 +3200,7 @@ namespace Emby.Server.Implementations.Data
|
|
// Running this again will bind the params
|
|
// Running this again will bind the params
|
|
GetWhereClauses(query, statement);
|
|
GetWhereClauses(query, statement);
|
|
|
|
|
|
- totalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
|
|
|
+ result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3144,11 +3208,8 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
LogQueryTime("GetItemIds", commandText, now);
|
|
LogQueryTime("GetItemIds", commandText, now);
|
|
|
|
|
|
- return new QueryResult<Guid>()
|
|
|
|
- {
|
|
|
|
- Items = list.ToArray(),
|
|
|
|
- TotalRecordCount = totalRecordCount
|
|
|
|
- };
|
|
|
|
|
|
+ result.Items = list.ToArray();
|
|
|
|
+ return result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -5026,7 +5087,7 @@ namespace Emby.Server.Implementations.Data
|
|
var isReturningZeroItems = query.Limit.HasValue && query.Limit <= 0;
|
|
var isReturningZeroItems = query.Limit.HasValue && query.Limit <= 0;
|
|
|
|
|
|
var list = new List<Tuple<BaseItem, ItemCounts>>();
|
|
var list = new List<Tuple<BaseItem, ItemCounts>>();
|
|
- var count = 0;
|
|
|
|
|
|
+ var result = new QueryResult<Tuple<BaseItem, ItemCounts>>();
|
|
|
|
|
|
var statementTexts = new List<string>();
|
|
var statementTexts = new List<string>();
|
|
if (!isReturningZeroItems)
|
|
if (!isReturningZeroItems)
|
|
@@ -5106,7 +5167,7 @@ namespace Emby.Server.Implementations.Data
|
|
GetWhereClauses(innerQuery, statement);
|
|
GetWhereClauses(innerQuery, statement);
|
|
GetWhereClauses(outerQuery, statement);
|
|
GetWhereClauses(outerQuery, statement);
|
|
|
|
|
|
- count = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
|
|
|
+ result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
|
|
|
LogQueryTime("GetItemValues", commandText, now);
|
|
LogQueryTime("GetItemValues", commandText, now);
|
|
}
|
|
}
|
|
@@ -5115,16 +5176,13 @@ namespace Emby.Server.Implementations.Data
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (count == 0)
|
|
|
|
|
|
+ if (result.TotalRecordCount == 0)
|
|
{
|
|
{
|
|
- count = list.Count;
|
|
|
|
|
|
+ result.TotalRecordCount = list.Count;
|
|
}
|
|
}
|
|
|
|
+ result.Items = list.ToArray();
|
|
|
|
|
|
- return new QueryResult<Tuple<BaseItem, ItemCounts>>
|
|
|
|
- {
|
|
|
|
- Items = list.ToArray(),
|
|
|
|
- TotalRecordCount = count
|
|
|
|
- };
|
|
|
|
|
|
+ return result;
|
|
}
|
|
}
|
|
|
|
|
|
private ItemCounts GetItemCounts(IReadOnlyList<IResultSetValue> reader, int countStartColumn, List<string> typesToCount)
|
|
private ItemCounts GetItemCounts(IReadOnlyList<IResultSetValue> reader, int countStartColumn, List<string> typesToCount)
|