From 794e1361d79374df7a07dcb9092eb1d981a9e80b Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Mon, 13 Oct 2025 10:09:09 -0500 Subject: Fix contributing artist query (#14991) --- .../JellyfinQueryHelperExtensions.cs | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs') diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs index 4d5cfb8c9b..8cb483f491 100644 --- a/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs +++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs @@ -53,6 +53,33 @@ public static class JellyfinQueryHelperExtensions return baseQuery.Where(ReferencedItemFilterExpressionBuilder(context, itemValueType, referenceIds, invert)); } + /// + /// Builds a query that checks referenced ItemValues for a cross BaseItem lookup. + /// + /// The source query. + /// The database context. + /// The type of item value to reference. + /// The list of BaseItem ids to check matches. + /// If set an exclusion check is performed instead. + /// A Query. + public static IQueryable WhereReferencedItemMultipleTypes( + this IQueryable baseQuery, + JellyfinDbContext context, + IList itemValueTypes, + IList referenceIds, + bool invert = false) + { + var itemFilter = OneOrManyExpressionBuilder(referenceIds, f => f.Id); + + return baseQuery.Where(item => + context.ItemValues + .Join(context.ItemValuesMap, e => e.ItemValueId, e => e.ItemValueId, (itemVal, map) => new { itemVal, map }) + .Any(val => + itemValueTypes.Contains(val.itemVal.Type) + && context.BaseItems.Where(itemFilter).Any(e => e.CleanName == val.itemVal.CleanValue) + && val.map.ItemId == item.Id) == EF.Constant(!invert)); + } + /// /// Builds a query expression that checks referenced ItemValues for a cross BaseItem lookup. /// -- cgit v1.2.3 From adfa5200573bcba070b6872945fe5ade8850b7f6 Mon Sep 17 00:00:00 2001 From: theguymadmax <171496228+theguymadmax@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:43:10 -0400 Subject: Backport pull request #15087 from jellyfin/release-10.11.z Optimize WhereReferencedItemMultipleTypes filtering Original-merge: a5bc4524d8a882efa12a17b6251894322745be78 Merged-by: crobibero Backported-by: Bond_009 --- Jellyfin.Server.Implementations/Item/BaseItemRepository.cs | 2 +- .../JellyfinQueryHelperExtensions.cs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs') diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs index 883c4542c3..20a40c80de 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs @@ -2053,7 +2053,7 @@ public sealed class BaseItemRepository if (filter.ExcludeArtistIds.Length > 0) { - baseQuery = baseQuery.WhereReferencedItem(context, ItemValueType.Artist, filter.ExcludeArtistIds, true); + baseQuery = baseQuery.WhereReferencedItemMultipleTypes(context, [ItemValueType.Artist, ItemValueType.AlbumArtist], filter.ExcludeArtistIds, true); } if (filter.GenreIds.Count > 0) diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs index 8cb483f491..f386e882e2 100644 --- a/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs +++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs @@ -70,13 +70,14 @@ public static class JellyfinQueryHelperExtensions bool invert = false) { var itemFilter = OneOrManyExpressionBuilder(referenceIds, f => f.Id); + var typeFilter = OneOrManyExpressionBuilder(itemValueTypes, iv => iv.Type); return baseQuery.Where(item => context.ItemValues + .Where(typeFilter) .Join(context.ItemValuesMap, e => e.ItemValueId, e => e.ItemValueId, (itemVal, map) => new { itemVal, map }) .Any(val => - itemValueTypes.Contains(val.itemVal.Type) - && context.BaseItems.Where(itemFilter).Any(e => e.CleanName == val.itemVal.CleanValue) + context.BaseItems.Where(itemFilter).Any(e => e.CleanName == val.itemVal.CleanValue) && val.map.ItemId == item.Id) == EF.Constant(!invert)); } -- cgit v1.2.3