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/finders/concerns/merged_at_filter.rb')
-rw-r--r--app/finders/concerns/merged_at_filter.rb20
1 files changed, 19 insertions, 1 deletions
diff --git a/app/finders/concerns/merged_at_filter.rb b/app/finders/concerns/merged_at_filter.rb
index 581bcca3c25..e44354f36d1 100644
--- a/app/finders/concerns/merged_at_filter.rb
+++ b/app/finders/concerns/merged_at_filter.rb
@@ -10,7 +10,7 @@ module MergedAtFilter
mr_metrics_scope = mr_metrics_scope.merged_after(merged_after) if merged_after.present?
mr_metrics_scope = mr_metrics_scope.merged_before(merged_before) if merged_before.present?
- items.join_metrics.merge(mr_metrics_scope)
+ join_metrics(items, mr_metrics_scope)
end
def merged_after
@@ -20,4 +20,22 @@ module MergedAtFilter
def merged_before
params[:merged_before]
end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ #
+ # This join optimizes merged_at queries when the finder is invoked for a project by moving
+ # the target_project_id condition from merge_requests table to merge_request_metrics table.
+ def join_metrics(items, mr_metrics_scope)
+ scope = if project_id = items.where_values_hash["target_project_id"]
+ # removing the original merge_requests.target_project_id condition
+ items = items.unscope(where: :target_project_id)
+ # adding the target_project_id condition to merge_request_metrics
+ items.join_metrics(project_id)
+ else
+ items.join_metrics
+ end
+
+ scope.merge(mr_metrics_scope)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
end