42 lines
1.3 KiB
Ruby
42 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module MergedAtFilter
|
|
private
|
|
|
|
def by_merged_at(items)
|
|
return items unless merged_after || merged_before
|
|
|
|
mr_metrics_scope = MergeRequest::Metrics
|
|
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?
|
|
|
|
join_metrics(items, mr_metrics_scope)
|
|
end
|
|
|
|
def merged_after
|
|
params[:merged_after]
|
|
end
|
|
|
|
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
|