Last Read Filter + A lot of bug fixes (#3312)
This commit is contained in:
parent
953d80de1a
commit
6b13db129e
42 changed files with 620 additions and 198 deletions
|
@ -257,9 +257,9 @@ public static class SeriesFilter
|
|||
.Select(s => new
|
||||
{
|
||||
Series = s,
|
||||
Percentage = ((float) s.Progress
|
||||
Percentage = s.Progress
|
||||
.Where(p => p != null && p.AppUserId == userId)
|
||||
.Sum(p => p != null ? (p.PagesRead * 1.0f / s.Pages) : 0) * 100)
|
||||
.Sum(p => p != null ? (p.PagesRead * 1.0f / s.Pages) : 0) * 100
|
||||
})
|
||||
.AsSplitQuery()
|
||||
.AsEnumerable();
|
||||
|
@ -361,6 +361,72 @@ public static class SeriesFilter
|
|||
return queryable.Where(s => ids.Contains(s.Id));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// HasReadingDate but used to filter where last reading point was TODAY() - timeDeltaDays. This allows the user
|
||||
/// to build smart filters "Haven't read in a month"
|
||||
/// </summary>
|
||||
public static IQueryable<Series> HasReadLast(this IQueryable<Series> queryable, bool condition,
|
||||
FilterComparison comparison, int timeDeltaDays, int userId)
|
||||
{
|
||||
if (!condition || timeDeltaDays == 0) return queryable;
|
||||
|
||||
var subQuery = queryable
|
||||
.Include(s => s.Progress)
|
||||
.Where(s => s.Progress != null)
|
||||
.Select(s => new
|
||||
{
|
||||
Series = s,
|
||||
MaxDate = s.Progress.Where(p => p != null && p.AppUserId == userId)
|
||||
.Select(p => (DateTime?) p.LastModified)
|
||||
.DefaultIfEmpty()
|
||||
.Max()
|
||||
})
|
||||
.Where(s => s.MaxDate != null)
|
||||
.AsSplitQuery()
|
||||
.AsEnumerable();
|
||||
|
||||
var date = DateTime.Now.AddDays(-timeDeltaDays);
|
||||
|
||||
switch (comparison)
|
||||
{
|
||||
case FilterComparison.Equal:
|
||||
subQuery = subQuery.Where(s => s.MaxDate != null && s.MaxDate.Equals(date));
|
||||
break;
|
||||
case FilterComparison.IsAfter:
|
||||
case FilterComparison.GreaterThan:
|
||||
subQuery = subQuery.Where(s => s.MaxDate != null && s.MaxDate > date);
|
||||
break;
|
||||
case FilterComparison.GreaterThanEqual:
|
||||
subQuery = subQuery.Where(s => s.MaxDate != null && s.MaxDate >= date);
|
||||
break;
|
||||
case FilterComparison.IsBefore:
|
||||
case FilterComparison.LessThan:
|
||||
subQuery = subQuery.Where(s => s.MaxDate != null && s.MaxDate < date);
|
||||
break;
|
||||
case FilterComparison.LessThanEqual:
|
||||
subQuery = subQuery.Where(s => s.MaxDate != null && s.MaxDate <= date);
|
||||
break;
|
||||
case FilterComparison.NotEqual:
|
||||
subQuery = subQuery.Where(s => s.MaxDate != null && !s.MaxDate.Equals(date));
|
||||
break;
|
||||
case FilterComparison.Matches:
|
||||
case FilterComparison.Contains:
|
||||
case FilterComparison.NotContains:
|
||||
case FilterComparison.BeginsWith:
|
||||
case FilterComparison.EndsWith:
|
||||
case FilterComparison.IsInLast:
|
||||
case FilterComparison.IsNotInLast:
|
||||
case FilterComparison.MustContains:
|
||||
case FilterComparison.IsEmpty:
|
||||
throw new KavitaException($"{comparison} not applicable for Series.ReadProgress");
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(comparison), comparison, null);
|
||||
}
|
||||
|
||||
var ids = subQuery.Select(s => s.Series.Id).ToList();
|
||||
return queryable.Where(s => ids.Contains(s.Id));
|
||||
}
|
||||
|
||||
public static IQueryable<Series> HasReadingDate(this IQueryable<Series> queryable, bool condition,
|
||||
FilterComparison comparison, DateTime? date, int userId)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue