Smart Filter Polish & New Filters (#2283)

This commit is contained in:
Joe Milazzo 2023-09-15 09:39:06 -07:00 committed by GitHub
parent 0d8c081093
commit 45f6fb67d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 375 additions and 181 deletions

View file

@ -6,8 +6,8 @@ namespace API.Extensions.QueryExtensions.Filtering;
public class BookmarkSeriesPair
{
public AppUserBookmark bookmark { get; set; }
public Series series { get; set; }
public AppUserBookmark Bookmark { get; set; }
public Series Series { get; set; }
}
public static class BookmarkSort
@ -31,12 +31,13 @@ public static class BookmarkSort
{
query = sortOptions.SortField switch
{
SortField.SortName => query.OrderBy(s => s.series.SortName.ToLower()),
SortField.CreatedDate => query.OrderBy(s => s.series.Created),
SortField.LastModifiedDate => query.OrderBy(s => s.series.LastModified),
SortField.LastChapterAdded => query.OrderBy(s => s.series.LastChapterAdded),
SortField.TimeToRead => query.OrderBy(s => s.series.AvgHoursToRead),
SortField.ReleaseYear => query.OrderBy(s => s.series.Metadata.ReleaseYear),
SortField.SortName => query.OrderBy(s => s.Series.SortName.ToLower()),
SortField.CreatedDate => query.OrderBy(s => s.Series.Created),
SortField.LastModifiedDate => query.OrderBy(s => s.Series.LastModified),
SortField.LastChapterAdded => query.OrderBy(s => s.Series.LastChapterAdded),
SortField.TimeToRead => query.OrderBy(s => s.Series.AvgHoursToRead),
SortField.ReleaseYear => query.OrderBy(s => s.Series.Metadata.ReleaseYear),
SortField.ReadProgress => query.OrderBy(s => s.Series.Progress.Where(p => p.SeriesId == s.Series.Id).Select(p => p.LastModified).Max()),
_ => query
};
}
@ -44,12 +45,13 @@ public static class BookmarkSort
{
query = sortOptions.SortField switch
{
SortField.SortName => query.OrderByDescending(s => s.series.SortName.ToLower()),
SortField.CreatedDate => query.OrderByDescending(s => s.series.Created),
SortField.LastModifiedDate => query.OrderByDescending(s => s.series.LastModified),
SortField.LastChapterAdded => query.OrderByDescending(s => s.series.LastChapterAdded),
SortField.TimeToRead => query.OrderByDescending(s => s.series.AvgHoursToRead),
SortField.ReleaseYear => query.OrderByDescending(s => s.series.Metadata.ReleaseYear),
SortField.SortName => query.OrderByDescending(s => s.Series.SortName.ToLower()),
SortField.CreatedDate => query.OrderByDescending(s => s.Series.Created),
SortField.LastModifiedDate => query.OrderByDescending(s => s.Series.LastModified),
SortField.LastChapterAdded => query.OrderByDescending(s => s.Series.LastChapterAdded),
SortField.TimeToRead => query.OrderByDescending(s => s.Series.AvgHoursToRead),
SortField.ReleaseYear => query.OrderByDescending(s => s.Series.Metadata.ReleaseYear),
SortField.ReadProgress => query.OrderByDescending(s => s.Series.Progress.Where(p => p.SeriesId == s.Series.Id).Select(p => p.LastModified).Max()),
_ => query
};
}

View file

@ -288,6 +288,64 @@ public static class SeriesFilter
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)
{
if (!condition || !date.HasValue) 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)
.AsEnumerable();
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:
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> HasTags(this IQueryable<Series> queryable, bool condition,
FilterComparison comparison, IList<int> tags)
{

View file

@ -31,7 +31,7 @@ public static class SeriesSort
SortField.LastChapterAdded => query.OrderBy(s => s.LastChapterAdded),
SortField.TimeToRead => query.OrderBy(s => s.AvgHoursToRead),
SortField.ReleaseYear => query.OrderBy(s => s.Metadata.ReleaseYear),
//SortField.ReadProgress => query.OrderBy()
SortField.ReadProgress => query.OrderBy(s => s.Progress.Where(p => p.SeriesId == s.Id).Select(p => p.LastModified).Max()),
_ => query
};
}
@ -45,6 +45,7 @@ public static class SeriesSort
SortField.LastChapterAdded => query.OrderByDescending(s => s.LastChapterAdded),
SortField.TimeToRead => query.OrderByDescending(s => s.AvgHoursToRead),
SortField.ReleaseYear => query.OrderByDescending(s => s.Metadata.ReleaseYear),
SortField.ReadProgress => query.OrderByDescending(s => s.Progress.Where(p => p.SeriesId == s.Id).Select(p => p.LastModified).Max()),
_ => query
};
}