Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/resolvers/project_merge_requests_resolver.rb')
-rw-r--r--app/graphql/resolvers/project_merge_requests_resolver.rb33
1 files changed, 33 insertions, 0 deletions
diff --git a/app/graphql/resolvers/project_merge_requests_resolver.rb b/app/graphql/resolvers/project_merge_requests_resolver.rb
index 830649d5e52..9628a6dfd7a 100644
--- a/app/graphql/resolvers/project_merge_requests_resolver.rb
+++ b/app/graphql/resolvers/project_merge_requests_resolver.rb
@@ -6,5 +6,38 @@ module Resolvers
accept_assignee
accept_author
accept_reviewer
+
+ def resolve(**args)
+ scope = super
+
+ if only_count_is_selected_with_merged_at_filter?(args) && Feature.enabled?(:optimized_merge_request_count_with_merged_at_filter, default_enabled: :yaml)
+ MergeRequest::MetricsFinder
+ .new(current_user, args.merge(target_project: project))
+ .execute
+ else
+ scope
+ end
+ end
+
+ def only_count_is_selected_with_merged_at_filter?(args)
+ return unless lookahead
+
+ argument_names = args.compact.except(:lookahead, :sort, :merged_before, :merged_after).keys
+
+ # no extra filtering arguments are provided
+ return unless argument_names.empty?
+ return unless args[:merged_after] || args[:merged_before]
+
+ # Detecting a specific query pattern:
+ # mergeRequests(mergedAfter: "X", mergedBefore: "Y") {
+ # count
+ # totalTimeToMerge
+ # }
+ allowed_selected_fields = [:count, :total_time_to_merge]
+ selected_fields = lookahead.selections.map(&:field).map(&:original_name) - [:__typename] # ignore __typename meta field
+
+ # only the allowed_selected_fields are present
+ (selected_fields - allowed_selected_fields).empty?
+ end
end
end