< Summary - Jellyfin

Information
Class: Jellyfin.Server.Implementations.Item.OrderMapper
Assembly: Jellyfin.Server.Implementations
File(s): /srv/git/jellyfin/Jellyfin.Server.Implementations/Item/OrderMapper.cs
Line coverage
28%
Covered lines: 12
Uncovered lines: 30
Coverable lines: 42
Total lines: 71
Line coverage: 28.5%
Branch coverage
16%
Covered branches: 5
Total branches: 31
Branch coverage: 16.1%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 8/14/2025 - 12:11:05 AM Line coverage: 31.2% (10/32) Branch coverage: 20.6% (6/29) Total lines: 5711/18/2025 - 12:11:25 AM Line coverage: 28.5% (12/42) Branch coverage: 16.1% (5/31) Total lines: 71 8/14/2025 - 12:11:05 AM Line coverage: 31.2% (10/32) Branch coverage: 20.6% (6/29) Total lines: 5711/18/2025 - 12:11:25 AM Line coverage: 28.5% (12/42) Branch coverage: 16.1% (5/31) Total lines: 71

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
MapOrderByField(...)16.12%4173126.19%

File(s)

/srv/git/jellyfin/Jellyfin.Server.Implementations/Item/OrderMapper.cs

#LineLine coverage
 1#pragma warning disable RS0030 // Do not use banned APIs
 2
 3using System;
 4using System.Linq;
 5using System.Linq.Expressions;
 6using Jellyfin.Data.Enums;
 7using Jellyfin.Database.Implementations;
 8using Jellyfin.Database.Implementations.Entities;
 9using MediaBrowser.Controller.Entities;
 10using Microsoft.EntityFrameworkCore;
 11
 12namespace Jellyfin.Server.Implementations.Item;
 13
 14/// <summary>
 15/// Static class for methods which maps types of ordering to their respecting ordering functions.
 16/// </summary>
 17public static class OrderMapper
 18{
 19    /// <summary>
 20    /// Creates Func to be executed later with a given BaseItemEntity input for sorting items on query.
 21    /// </summary>
 22    /// <param name="sortBy">Item property to sort by.</param>
 23    /// <param name="query">Context Query.</param>
 24    /// <param name="jellyfinDbContext">Context.</param>
 25    /// <returns>Func to be executed later for sorting query.</returns>
 26    public static Expression<Func<BaseItemEntity, object?>> MapOrderByField(ItemSortBy sortBy, InternalItemsQuery query,
 27    {
 13728        return (sortBy, query.User) switch
 13729        {
 030            (ItemSortBy.AirTime, _) => e => e.SortName, // TODO
 031            (ItemSortBy.Runtime, _) => e => e.RunTimeTicks,
 4732            (ItemSortBy.Random, _) => e => EF.Functions.Random(),
 133            (ItemSortBy.DatePlayed, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.LastPla
 034            (ItemSortBy.PlayCount, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.PlayCoun
 035            (ItemSortBy.IsFavoriteOrLiked, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.
 4436            (ItemSortBy.IsFolder, _) => e => e.IsFolder,
 037            (ItemSortBy.IsPlayed, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played,
 038            (ItemSortBy.IsUnplayed, _) => e => !e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played
 039            (ItemSortBy.DateLastContentAdded, _) => e => e.DateLastMediaAdded,
 040            (ItemSortBy.Artist, _) => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Artist).Select(f =
 041            (ItemSortBy.AlbumArtist, _) => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.AlbumArtist).
 042            (ItemSortBy.Studio, _) => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Studios).Select(f 
 043            (ItemSortBy.OfficialRating, _) => e => e.InheritedParentalRatingValue,
 044            (ItemSortBy.SeriesSortName, _) => e => e.SeriesName,
 045            (ItemSortBy.Album, _) => e => e.Album,
 046            (ItemSortBy.DateCreated, _) => e => e.DateCreated,
 147            (ItemSortBy.PremiereDate, _) => e => (e.PremiereDate ?? (e.ProductionYear.HasValue ? DateTime.MinValue.AddYe
 048            (ItemSortBy.StartDate, _) => e => e.StartDate,
 049            (ItemSortBy.Name, _) => e => e.CleanName,
 050            (ItemSortBy.CommunityRating, _) => e => e.CommunityRating,
 051            (ItemSortBy.ProductionYear, _) => e => e.ProductionYear,
 052            (ItemSortBy.CriticRating, _) => e => e.CriticRating,
 053            (ItemSortBy.VideoBitRate, _) => e => e.TotalBitrate,
 054            (ItemSortBy.ParentIndexNumber, _) => e => e.ParentIndexNumber,
 055            (ItemSortBy.IndexNumber, _) => e => e.IndexNumber,
 056            (ItemSortBy.SeriesDatePlayed, not null) => e =>
 057                            jellyfinDbContext.BaseItems
 058                                .Where(w => w.SeriesPresentationUniqueKey == e.PresentationUniqueKey)
 059                                .Join(jellyfinDbContext.UserData.Where(w => w.UserId == query.User.Id && w.Played), f =>
 060                                .Max(f => f),
 061            (ItemSortBy.SeriesDatePlayed, null) => e => jellyfinDbContext.BaseItems.Where(w => w.SeriesPresentationUniqu
 062                                .Join(jellyfinDbContext.UserData.Where(w => w.Played), f => f.Id, f => f.ItemId, (item, 
 063                                .Max(f => f),
 13764            // ItemSortBy.SeriesDatePlayed => e => jellyfinDbContext.UserData
 13765            //     .Where(u => u.Item!.SeriesPresentationUniqueKey == e.PresentationUniqueKey && u.Played)
 13766            //     .Max(f => f.LastPlayedDate),
 13767            // ItemSortBy.AiredEpisodeOrder => "AiredEpisodeOrder",
 4468            _ => e => e.SortName
 13769        };
 70    }
 71}