diff options
Diffstat (limited to 'app/finders/concerns/merged_at_filter.rb')
-rw-r--r-- | app/finders/concerns/merged_at_filter.rb | 20 |
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 |