34 lines
1 KiB
Ruby
34 lines
1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module MergeRequests
|
||
|
# OldestPerCommitFinder is used to retrieve the oldest merge requests for
|
||
|
# every given commit, grouped per commit SHA.
|
||
|
#
|
||
|
# This finder is useful when you need to efficiently retrieve the first/oldest
|
||
|
# merge requests for multiple commits, and you want to do so in batches;
|
||
|
# instead of running a query for every commit.
|
||
|
class OldestPerCommitFinder
|
||
|
def initialize(project)
|
||
|
@project = project
|
||
|
end
|
||
|
|
||
|
# Returns a Hash that maps a commit ID to the oldest merge request that
|
||
|
# introduced that commit.
|
||
|
def execute(commits)
|
||
|
id_rows = MergeRequestDiffCommit
|
||
|
.oldest_merge_request_id_per_commit(@project.id, commits.map(&:id))
|
||
|
|
||
|
mrs = MergeRequest
|
||
|
.preload_target_project
|
||
|
.id_in(id_rows.map { |r| r[:merge_request_id] })
|
||
|
.index_by(&:id)
|
||
|
|
||
|
id_rows.each_with_object({}) do |row, hash|
|
||
|
if (mr = mrs[row[:merge_request_id]])
|
||
|
hash[row[:sha]] = mr
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|