aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2026-01-31 19:19:26 +0100
committerShadowghost <Ghost_of_Stone@web.de>2026-01-31 19:22:04 +0100
commit2789532aa88ccc899ff8497537642e1d78b31ef5 (patch)
treebc50cc8b536c9487ddaa773f5a411fc2ddd17ac8 /Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs
parent694db80d4c8e83ff381af56d2a3dde29e0855c3d (diff)
Optimize Validator and Filter Performance
Diffstat (limited to 'Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs')
-rw-r--r--Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs47
1 files changed, 36 insertions, 11 deletions
diff --git a/Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs b/Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs
index d7b2567f37..888dacd16b 100644
--- a/Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs
+++ b/Jellyfin.Server.Implementations/Item/FolderAwareFilterExtensions.cs
@@ -26,13 +26,25 @@ internal static class FolderAwareFilterExtensions
JellyfinDbContext context,
Expression<Func<BaseItemEntity, bool>> condition)
{
- // Use correlated Any() subqueries instead of UNION + Contains for better index utilization
- var matchingIds = context.BaseItems.Where(condition).Select(b => b.Id);
+ // Get IDs of items that directly match the condition
+ var directMatchIds = context.BaseItems.Where(condition).Select(b => b.Id);
- return query.Where(e =>
- matchingIds.Contains(e.Id)
- || context.AncestorIds.Any(a => a.ParentItemId == e.Id && matchingIds.Contains(a.ItemId))
- || context.LinkedChildren.Any(lc => lc.ParentId == e.Id && matchingIds.Contains(lc.ChildId)));
+ // Get parent IDs where a descendant (via AncestorIds) matches
+ var ancestorMatchIds = context.AncestorIds
+ .Where(a => directMatchIds.Contains(a.ItemId))
+ .Select(a => a.ParentItemId);
+
+ // Get parent IDs where a linked child matches
+ var linkedMatchIds = context.LinkedChildren
+ .Where(lc => directMatchIds.Contains(lc.ChildId))
+ .Select(lc => lc.ParentId);
+
+ var allMatchingIds = directMatchIds
+ .Concat(ancestorMatchIds)
+ .Concat(linkedMatchIds)
+ .Distinct();
+
+ return query.Where(e => allMatchingIds.Contains(e.Id));
}
/// <summary>
@@ -48,11 +60,24 @@ internal static class FolderAwareFilterExtensions
JellyfinDbContext context,
Expression<Func<BaseItemEntity, bool>> condition)
{
- var matchingIds = context.BaseItems.Where(condition).Select(b => b.Id);
+ // Get IDs of items that directly match the condition
+ var directMatchIds = context.BaseItems.Where(condition).Select(b => b.Id);
+
+ // Get parent IDs where a descendant (via AncestorIds) matches
+ var ancestorMatchIds = context.AncestorIds
+ .Where(a => directMatchIds.Contains(a.ItemId))
+ .Select(a => a.ParentItemId);
+
+ // Get parent IDs where a linked child matches
+ var linkedMatchIds = context.LinkedChildren
+ .Where(lc => directMatchIds.Contains(lc.ChildId))
+ .Select(lc => lc.ParentId);
+
+ var allMatchingIds = directMatchIds
+ .Concat(ancestorMatchIds)
+ .Concat(linkedMatchIds)
+ .Distinct();
- return query.Where(e =>
- !matchingIds.Contains(e.Id)
- && !context.AncestorIds.Any(a => a.ParentItemId == e.Id && matchingIds.Contains(a.ItemId))
- && !context.LinkedChildren.Any(lc => lc.ParentId == e.Id && matchingIds.Contains(lc.ChildId)));
+ return query.Where(e => !allMatchingIds.Contains(e.Id));
}
}