OrderMapper.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Linq;
  3. using System.Linq.Expressions;
  4. using Jellyfin.Data.Enums;
  5. using Jellyfin.Database.Implementations.Entities;
  6. using MediaBrowser.Controller.Entities;
  7. using Microsoft.EntityFrameworkCore;
  8. namespace Jellyfin.Server.Implementations.Item;
  9. /// <summary>
  10. /// Static class for methods which maps types of ordering to their respecting ordering functions.
  11. /// </summary>
  12. public static class OrderMapper
  13. {
  14. /// <summary>
  15. /// Creates Func to be executed later with a given BaseItemEntity input for sorting items on query.
  16. /// </summary>
  17. /// <param name="sortBy">Item property to sort by.</param>
  18. /// <param name="query">Context Query.</param>
  19. /// <returns>Func to be executed later for sorting query.</returns>
  20. public static Expression<Func<BaseItemEntity, object?>> MapOrderByField(ItemSortBy sortBy, InternalItemsQuery query)
  21. {
  22. return sortBy switch
  23. {
  24. ItemSortBy.AirTime => e => e.SortName, // TODO
  25. ItemSortBy.Runtime => e => e.RunTimeTicks,
  26. ItemSortBy.Random => e => EF.Functions.Random(),
  27. ItemSortBy.DatePlayed => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.LastPlayedDate,
  28. ItemSortBy.PlayCount => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.PlayCount,
  29. ItemSortBy.IsFavoriteOrLiked => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.IsFavorite,
  30. ItemSortBy.IsFolder => e => e.IsFolder,
  31. ItemSortBy.IsPlayed => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played,
  32. ItemSortBy.IsUnplayed => e => !e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played,
  33. ItemSortBy.DateLastContentAdded => e => e.DateLastMediaAdded,
  34. ItemSortBy.Artist => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Artist).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
  35. ItemSortBy.AlbumArtist => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.AlbumArtist).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
  36. ItemSortBy.Studio => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Studios).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
  37. ItemSortBy.OfficialRating => e => e.InheritedParentalRatingValue,
  38. // ItemSortBy.SeriesDatePlayed => "(Select MAX(LastPlayedDate) from TypedBaseItems B" + GetJoinUserDataText(query) + " where Played=1 and B.SeriesPresentationUniqueKey=A.PresentationUniqueKey)",
  39. ItemSortBy.SeriesSortName => e => e.SeriesName,
  40. // ItemSortBy.AiredEpisodeOrder => "AiredEpisodeOrder",
  41. ItemSortBy.Album => e => e.Album,
  42. ItemSortBy.DateCreated => e => e.DateCreated,
  43. ItemSortBy.PremiereDate => e => (e.PremiereDate ?? (e.ProductionYear.HasValue ? DateTime.MinValue.AddYears(e.ProductionYear.Value - 1) : null)),
  44. ItemSortBy.StartDate => e => e.StartDate,
  45. ItemSortBy.Name => e => e.CleanName,
  46. ItemSortBy.CommunityRating => e => e.CommunityRating,
  47. ItemSortBy.ProductionYear => e => e.ProductionYear,
  48. ItemSortBy.CriticRating => e => e.CriticRating,
  49. ItemSortBy.VideoBitRate => e => e.TotalBitrate,
  50. ItemSortBy.ParentIndexNumber => e => e.ParentIndexNumber,
  51. ItemSortBy.IndexNumber => e => e.IndexNumber,
  52. _ => e => e.SortName
  53. };
  54. }
  55. }