|
|
|
@ -115,29 +115,7 @@ public sealed class BaseItemRepository(
|
|
|
|
|
PrepareFilterQuery(filter);
|
|
|
|
|
|
|
|
|
|
using var context = dbProvider.CreateDbContext();
|
|
|
|
|
var dbQuery = TranslateQuery(context.BaseItems.AsNoTracking(), context, filter);
|
|
|
|
|
|
|
|
|
|
var enableGroupByPresentationUniqueKey = EnableGroupByPresentationUniqueKey(filter);
|
|
|
|
|
if (enableGroupByPresentationUniqueKey && filter.GroupBySeriesPresentationUniqueKey)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.GroupBy(e => new { e.PresentationUniqueKey, e.SeriesPresentationUniqueKey }).Select(e => e.First());
|
|
|
|
|
}
|
|
|
|
|
else if (enableGroupByPresentationUniqueKey)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.GroupBy(e => e.PresentationUniqueKey).Select(e => e.First());
|
|
|
|
|
}
|
|
|
|
|
else if (filter.GroupBySeriesPresentationUniqueKey)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.GroupBy(e => e.SeriesPresentationUniqueKey).Select(e => e.First());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.Distinct();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dbQuery = ApplyOrder(dbQuery, filter);
|
|
|
|
|
|
|
|
|
|
return Pageinate(dbQuery, filter).Select(e => e.Id).ToImmutableArray();
|
|
|
|
|
return ApplyQueryFilter(context.BaseItems.AsNoTracking(), context, filter).Select(e => e.Id).ToImmutableArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
@ -223,42 +201,8 @@ public sealed class BaseItemRepository(
|
|
|
|
|
var result = new QueryResult<BaseItemDto>();
|
|
|
|
|
|
|
|
|
|
using var context = dbProvider.CreateDbContext();
|
|
|
|
|
IQueryable<BaseItemEntity> dbQuery = context.BaseItems.AsNoTracking()
|
|
|
|
|
.Include(e => e.TrailerTypes)
|
|
|
|
|
.Include(e => e.Provider)
|
|
|
|
|
.Include(e => e.LockedFields);
|
|
|
|
|
|
|
|
|
|
if (filter.DtoOptions.EnableImages)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.Include(e => e.Images);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dbQuery = TranslateQuery(dbQuery, context, filter);
|
|
|
|
|
dbQuery = dbQuery.Distinct();
|
|
|
|
|
// .DistinctBy(e => e.Id);
|
|
|
|
|
if (filter.EnableTotalRecordCount)
|
|
|
|
|
{
|
|
|
|
|
result.TotalRecordCount = dbQuery.Count();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dbQuery = ApplyOrder(dbQuery, filter);
|
|
|
|
|
|
|
|
|
|
if (filter.Limit.HasValue || filter.StartIndex.HasValue)
|
|
|
|
|
{
|
|
|
|
|
var offset = filter.StartIndex ?? 0;
|
|
|
|
|
|
|
|
|
|
if (offset > 0)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.Skip(offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (filter.Limit.HasValue)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.Take(filter.Limit.Value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result.Items = dbQuery.AsEnumerable().Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToImmutableArray();
|
|
|
|
|
result.Items = PrepareItemQuery(context, filter).AsEnumerable().Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToImmutableArray();
|
|
|
|
|
result.StartIndex = filter.StartIndex ?? 0;
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
@ -270,16 +214,12 @@ public sealed class BaseItemRepository(
|
|
|
|
|
PrepareFilterQuery(filter);
|
|
|
|
|
|
|
|
|
|
using var context = dbProvider.CreateDbContext();
|
|
|
|
|
IQueryable<BaseItemEntity> dbQuery = context.BaseItems.AsNoTracking()
|
|
|
|
|
.Include(e => e.TrailerTypes)
|
|
|
|
|
.Include(e => e.Provider)
|
|
|
|
|
.Include(e => e.LockedFields);
|
|
|
|
|
|
|
|
|
|
if (filter.DtoOptions.EnableImages)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.Include(e => e.Images);
|
|
|
|
|
}
|
|
|
|
|
return PrepareItemQuery(context, filter).AsEnumerable().Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToImmutableArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<BaseItemEntity> ApplyQueryFilter(IQueryable<BaseItemEntity> dbQuery, JellyfinDbContext context, InternalItemsQuery filter)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = TranslateQuery(dbQuery, context, filter);
|
|
|
|
|
dbQuery = ApplyOrder(dbQuery, filter);
|
|
|
|
|
|
|
|
|
@ -316,7 +256,22 @@ public sealed class BaseItemRepository(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return dbQuery.AsEnumerable().Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToImmutableArray();
|
|
|
|
|
return dbQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<BaseItemEntity> PrepareItemQuery(JellyfinDbContext context, InternalItemsQuery filter)
|
|
|
|
|
{
|
|
|
|
|
IQueryable<BaseItemEntity> dbQuery = context.BaseItems.AsNoTracking()
|
|
|
|
|
.Include(e => e.TrailerTypes)
|
|
|
|
|
.Include(e => e.Provider)
|
|
|
|
|
.Include(e => e.LockedFields);
|
|
|
|
|
|
|
|
|
|
if (filter.DtoOptions.EnableImages)
|
|
|
|
|
{
|
|
|
|
|
dbQuery = dbQuery.Include(e => e.Images);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ApplyQueryFilter(dbQuery, context, filter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
@ -2038,26 +1993,6 @@ public sealed class BaseItemRepository(
|
|
|
|
|
return query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains(type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IQueryable<T> Pageinate<T>(IQueryable<T> query, InternalItemsQuery filter)
|
|
|
|
|
{
|
|
|
|
|
if (filter.Limit.HasValue || filter.StartIndex.HasValue)
|
|
|
|
|
{
|
|
|
|
|
var offset = filter.StartIndex ?? 0;
|
|
|
|
|
|
|
|
|
|
if (offset > 0)
|
|
|
|
|
{
|
|
|
|
|
query = query.Skip(offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (filter.Limit.HasValue)
|
|
|
|
|
{
|
|
|
|
|
query = query.Take(filter.Limit.Value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return query;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Expression<Func<BaseItemEntity, object>> MapOrderByField(ItemSortBy sortBy, InternalItemsQuery query)
|
|
|
|
|
{
|
|
|
|
|
#pragma warning disable CS8603 // Possible null reference return.
|
|
|
|
|