Added series progress/rating information back in. Left attempts at doing via a JOIN or raw SQL.

This commit is contained in:
Joseph Milazzo 2021-02-17 15:28:57 -06:00
parent 222959981f
commit 922c0153d3
9 changed files with 269 additions and 7 deletions

View file

@ -69,7 +69,174 @@ namespace API.Data
var sw = Stopwatch.StartNew();
//
// // var query = QueryableExtensions.LeftJoin(_context.Series
// // .Join(_context.AppUserProgresses, series => series.Id, progress => progress.SeriesId,
// // (series, progress) =>
// // new {
// // series.LibraryId,
// // series.Id,
// // series.Created,
// // series.Name,
// // series.Pages,
// // series.Summary,
// // series.CoverImage,
// // series.OriginalName,
// // series.SortName,
// // progress.PagesRead
// // }), _context.AppUserRating, series => series.Id, rating => rating.SeriesId,
// // (series, rating) =>
// // new {
// // series.LibraryId,
// // series.Id,
// // series.Created,
// // series.Name,
// // series.Pages,
// // series.Summary,
// // series.CoverImage,
// // series.OriginalName,
// // series.SortName,
// // series.PagesRead,
// // rating.Review,
// // rating.Rating,
// // rating.AppUserId
// // })
// // .Where(s => s.LibraryId == libraryId && s.AppUserId == userId)
// // .OrderBy(s => s.SortName)
// // .Select(arg => new SeriesDto()
// // {
// // PagesRead = arg.PagesRead,
// // UserRating = arg.Rating,
// // UserReview = arg.Review,
// // Summary = arg.Summary,
// // Name = arg.Name,
// // OriginalName = arg.OriginalName,
// // SortName = arg.SortName,
// // Id = arg.Id,
// // Pages = arg.Pages,
// // CoverImage = arg.CoverImage
// // })
// // //.ProjectTo<SeriesDto>(_mapper.ConfigurationProvider)
// // .AsNoTracking();
//
//
// // var query2 = _context.Series
// // .Join(_context.AppUserProgresses, series => series.Id, progress => progress.SeriesId,
// // (series, progress) => new { series, progress}
// // /*new
// // {
// // series.LibraryId,
// // series.Id,
// // series.Created,
// // series.Name,
// // series.Pages,
// // series.Summary,
// // series.CoverImage,
// // series.OriginalName,
// // series.SortName,
// // progress.PagesRead
// // }*/)
// // .LeftJoin(_context.AppUserRating, series => series.series.Id, rating => rating.SeriesId,
// // (series, rating) => new {series.series, series.progress, rating}
// // /*
// // * new
// // {
// // series.LibraryId,
// // series.Id,
// // series.Name,
// // series.Pages,
// // series.Summary,
// // series.CoverImage,
// // series.OriginalName,
// // series.SortName,
// // series.PagesRead,
// // rating.Review,
// // rating.Rating,
// // rating.AppUserId
// // }
// // */)
// // // .Select(arg => new SeriesDto()
// // // {
// // // // Where is failing because this select changes what we select
// // // PagesRead = arg.PagesRead,
// // // UserRating = arg.Rating,
// // // UserReview = arg.Review,
// // // Summary = arg.Summary,
// // // Name = arg.Name,
// // // OriginalName = arg.OriginalName,
// // // SortName = arg.SortName,
// // // Id = arg.Id,
// // // Pages = arg.Pages,
// // // CoverImage = arg.CoverImage,
// // // })
// .Select(arg => new SeriesDto()
// {
// // Where is failing because this select changes what we select
// LibraryId = arg.series.LibraryId,
// PagesRead = arg.progress.PagesRead,
// UserRating = arg.rating.Rating,
// UserReview = arg.rating.Review,
// Summary = arg.series.Summary,
// Name = arg.series.Name,
// OriginalName = arg.series.OriginalName,
// SortName = arg.series.SortName,
// Id = arg.series.Id,
// Pages = arg.series.Pages,
// CoverImage = arg.series.CoverImage,
// })
// // .Where(s => s.LibraryId == libraryId && s.AppUserId == userId)
// // .OrderBy(s => s.SortName)
// // .AsNoTracking();
//
// var query = _context.Series
// .FromSqlRaw(@"select S.*, Rating AS UserRating, Review AS UserReview from Series AS S
// INNER JOIN AppUserProgresses AS AP ON AP.SeriesId = S.Id AND AP.AppUserId = {0}
// LEFT OUTER JOIN AppUserRating AUR on AUR.SeriesId = S.Id AND AUR.AppUserId = {0}
// WHERE (S.LibraryId = {1}) AND (AP.AppUserId = {0})
// ORDER BY S.SortName", userId, libraryId)
// .Select(series => new SeriesDto()
// {
// // Where is failing because this select changes what we select
// PagesRead = series.PagesRead,
// UserRating = series.UserRating,
// UserReview = arg.rating.Review,
// Summary = arg.series.Summary,
// Name = arg.series.Name,
// OriginalName = arg.series.OriginalName,
// SortName = arg.series.SortName,
// Id = arg.series.Id,
// Pages = arg.series.Pages,
// CoverImage = arg.series.CoverImage,
// })
// .AsNoTracking();
/*
* select S.*, Rating AS UserRating, Review AS UserReview from Series AS S
INNER JOIN AppUserProgresses AS AP ON AP.SeriesId = S.Id AND AP.AppUserId = 1
LEFT OUTER JOIN AppUserRating AUR on AUR.SeriesId = S.Id AND AUR.AppUserId = 1;
*/
//await AddSeriesModifiers(userId, series);
// var userProgress = await _context.AppUserProgresses
// .Where(p => p.AppUserId == userId && series.Select(s => s.Id).Contains(p.SeriesId) )
// .ToListAsync();
//
// var userRatings = await _context.AppUserRating
// .Where(r => r.AppUserId == userId && series.Select(s => s.Id).Contains(r.SeriesId))
// .ToListAsync();
//
// foreach (var s in series)
// {
// s.PagesRead = userProgress.Where(p => p.SeriesId == s.Id).Sum(p => p.PagesRead);
// var rating = userRatings.SingleOrDefault(r => r.SeriesId == s.Id);
// if (rating == null) continue;
// s.UserRating = rating.Rating;
// s.UserReview = rating.Review;
// }
var query = _context.Series
.Where(s => s.LibraryId == libraryId)
.OrderBy(s => s.SortName)
@ -77,10 +244,6 @@ namespace API.Data
.AsNoTracking();
// TODO: Refactor this into JOINs
//await AddSeriesModifiers(userId, series);
_logger.LogDebug("Processed GetSeriesDtoForLibraryIdAsync in {ElapsedMilliseconds} milliseconds", sw.ElapsedMilliseconds);
return await PagedList<SeriesDto>.CreateAsync(query, userParams.PageNumber, userParams.PageSize);
}
@ -222,7 +385,7 @@ namespace API.Data
return chapterIds.ToArray();
}
private async Task AddSeriesModifiers(int userId, List<SeriesDto> series)
public async Task AddSeriesModifiers(int userId, List<SeriesDto> series)
{
var userProgress = await _context.AppUserProgresses
.Where(p => p.AppUserId == userId && series.Select(s => s.Id).Contains(p.SeriesId))