Browse Source

Backport pull request #15087 from jellyfin/release-10.11.z

Optimize WhereReferencedItemMultipleTypes filtering

Original-merge: a5bc4524d8a882efa12a17b6251894322745be78

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
theguymadmax 1 week ago
parent
commit
adfa520057

+ 1 - 1
Jellyfin.Server.Implementations/Item/BaseItemRepository.cs

@@ -2053,7 +2053,7 @@ public sealed class BaseItemRepository
 
 
         if (filter.ExcludeArtistIds.Length > 0)
         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)
         if (filter.GenreIds.Count > 0)

+ 3 - 2
src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs

@@ -70,13 +70,14 @@ public static class JellyfinQueryHelperExtensions
         bool invert = false)
         bool invert = false)
     {
     {
         var itemFilter = OneOrManyExpressionBuilder<BaseItemEntity, Guid>(referenceIds, f => f.Id);
         var itemFilter = OneOrManyExpressionBuilder<BaseItemEntity, Guid>(referenceIds, f => f.Id);
+        var typeFilter = OneOrManyExpressionBuilder<ItemValue, ItemValueType>(itemValueTypes, iv => iv.Type);
 
 
         return baseQuery.Where(item =>
         return baseQuery.Where(item =>
             context.ItemValues
             context.ItemValues
+                .Where(typeFilter)
                 .Join(context.ItemValuesMap, e => e.ItemValueId, e => e.ItemValueId, (itemVal, map) => new { itemVal, map })
                 .Join(context.ItemValuesMap, e => e.ItemValueId, e => e.ItemValueId, (itemVal, map) => new { itemVal, map })
                 .Any(val =>
                 .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));
                     && val.map.ItemId == item.Id) == EF.Constant(!invert));
     }
     }