Allow excluding group-level work items in WorkItemsFinder
When looking at the performance for the new group issues list, which will use the GQL query ``, we noticed that the DB query for fetching the items is different. This is because
The reason the queries are different is that WorkItemsFinder does not have an option to exclude group-level work items when passing a group, so the query looks for items in the group and its descendants as well.
Because the issues list at the group level only includes project-level issues, we should add an option to exclude group-level issues when passing a group to WorkItemsFinder.
Proposed solution
diff
Index: app/graphql/resolvers/namespaces/work_items_resolver.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/graphql/resolvers/namespaces/work_items_resolver.rb b/app/graphql/resolvers/namespaces/work_items_resolver.rb
--- a/app/graphql/resolvers/namespaces/work_items_resolver.rb (revision 4089699d880efc91a1a8b29ad90e05c6dce5a9b7)
+++ b/app/graphql/resolvers/namespaces/work_items_resolver.rb (date 1756209257641)
@@ -6,7 +6,13 @@
class WorkItemsResolver < ::Resolvers::WorkItemsResolver
include TimeFrameHelpers
- GROUP_NAMESPACE_ONLY_ARGS = %i[include_ancestors include_descendants exclude_projects timeframe].freeze
+ GROUP_NAMESPACE_ONLY_ARGS = %i[
+ include_ancestors
+ include_descendants
+ exclude_projects
+ timeframe
+ exclude_group_work_items
+ ].freeze
argument :include_ancestors, GraphQL::Types::Boolean,
required: false,
@@ -24,6 +30,13 @@
description: 'Exclude work items from projects within the group. Ignored for project namespaces.',
experiment: { milestone: '17.5' }
+ argument :exclude_group_work_items, GraphQL::Types::Boolean,
+ required: false,
+ default_value: false,
+ description: 'Exclude group-level work items within the group and its descendants.' \
+ 'Ignored for project namespaces.',
+ experiment: { milestone: '18.4' }
+
argument :timeframe, Types::TimeframeInputType,
required: false,
description: 'List items overlapping the given timeframe. Ignored for project namespaces.'
Index: ee/app/finders/ee/work_items/work_items_finder.rb
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/ee/app/finders/ee/work_items/work_items_finder.rb b/ee/app/finders/ee/work_items/work_items_finder.rb
--- a/ee/app/finders/ee/work_items/work_items_finder.rb (revision 4089699d880efc91a1a8b29ad90e05c6dce5a9b7)
+++ b/ee/app/finders/ee/work_items/work_items_finder.rb (date 1756209407036)
@@ -1,5 +1,12 @@
# frozen_string_literal: true
+# EE::WorkItems::WorkItemsFinder
+#
+# Extends WorkItems::WorkItemsFinder
+#
+# Added arguments:
+# params:
+# exclude_group_work_items: boolean
module EE
module WorkItems
module WorkItemsFinder
@@ -93,12 +100,20 @@
end
def include_group_work_items?
- params.group? && params.group.supports_group_work_items?
+ return false unless params.group?
+ return false if exclude_group_level_work_items?
+
+ params.group.supports_group_work_items?
end
def with_namespace_cte
include_group_work_items?
end
+
+ def exclude_group_level_work_items?
+ params.fetch(:exclude_group_work_items, false)
+ end
+ strong_memoize_attr :exclude_group_level_work_items?
end
end
end