diff options
Diffstat (limited to 'app/finders/merge_requests/oldest_per_commit_finder.rb')
-rw-r--r-- | app/finders/merge_requests/oldest_per_commit_finder.rb | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/app/finders/merge_requests/oldest_per_commit_finder.rb b/app/finders/merge_requests/oldest_per_commit_finder.rb new file mode 100644 index 00000000000..f50db43d7d2 --- /dev/null +++ b/app/finders/merge_requests/oldest_per_commit_finder.rb @@ -0,0 +1,33 @@ +# 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 |