@ -343,6 +343,9 @@ namespace Emby.Server.Implementations.Data
// series
"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
"create index if not exists idx_TypeTopParentIdStartDate on TypedBaseItems(Type,TopParentId,StartDate)" ,
@ -2263,6 +2266,10 @@ namespace Emby.Server.Implementations.Data
{
return true ;
}
if ( sortingFields . Contains ( ItemSortBy . SeriesDatePlayed , StringComparer . OrdinalIgnoreCase ) )
{
return true ;
}
if ( query . IsFavoriteOrLiked . HasValue )
{
@ -2436,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 < BaseItem > GetItemList ( InternalItemsQuery query )
{
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 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 ) ;
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 ) )
{
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 ) ;
@ -3094,7 +3158,7 @@ namespace Emby.Server.Implementations.Data
{
using ( var connection = CreateConnection ( true ) )
{
var totalRecordCount = 0 ;
var result = new QueryResult < Guid > ( ) ;
connection . RunInTransaction ( db = >
{
@ -3136,7 +3200,7 @@ namespace Emby.Server.Implementations.Data
// Running this again will bind the params
GetWhereClauses ( query , statement ) ;
totalRecordCount = statement . ExecuteQuery ( ) . SelectScalarInt ( ) . First ( ) ;
resul t. T otalRecordCount = statement . ExecuteQuery ( ) . SelectScalarInt ( ) . First ( ) ;
}
}
@ -3144,11 +3208,8 @@ namespace Emby.Server.Implementations.Data
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 list = new List < Tuple < BaseItem , ItemCounts > > ( ) ;
var count = 0 ;
var result = new QueryResult < Tuple < BaseItem , ItemCounts > > ( ) ;
var statementTexts = new List < string > ( ) ;
if ( ! isReturningZeroItems )
@ -5106,7 +5167,7 @@ namespace Emby.Server.Implementations.Data
GetWhereClauses ( innerQuery , statement ) ;
GetWhereClauses ( outerQuery , statement ) ;
count = statement . ExecuteQuery ( ) . SelectScalarInt ( ) . First ( ) ;
result. TotalRe cordC ount = statement . ExecuteQuery ( ) . SelectScalarInt ( ) . First ( ) ;
LogQueryTime ( "GetItemValues" , commandText , now ) ;
}
@ -5115,16 +5176,13 @@ namespace Emby.Server.Implementations.Data
}
}
if ( count = = 0 )
if ( result. TotalRe cordC ount = = 0 )
{
count = list . Count ;
result. TotalRe cordC ount = 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 )