52d049b4f8
N in this case is low, as it's the number of distinct projects referenced from MRs, rather than the number of MRs referenced (issues use their own optimization). Still, on issues or MRs which are often referenced from MRs, it will save a few queries.
45 lines
1.3 KiB
Ruby
45 lines
1.3 KiB
Ruby
module Banzai
|
|
module ReferenceParser
|
|
class MergeRequestParser < BaseParser
|
|
self.reference_type = :merge_request
|
|
|
|
def nodes_visible_to_user(user, nodes)
|
|
merge_requests = merge_requests_for_nodes(nodes)
|
|
|
|
nodes.select do |node|
|
|
merge_request = merge_requests[node]
|
|
|
|
merge_request && can?(user, :read_merge_request, merge_request.project)
|
|
end
|
|
end
|
|
|
|
def referenced_by(nodes)
|
|
merge_requests = merge_requests_for_nodes(nodes)
|
|
|
|
nodes.map { |node| merge_requests[node] }.compact.uniq
|
|
end
|
|
|
|
def merge_requests_for_nodes(nodes)
|
|
@merge_requests_for_nodes ||= grouped_objects_for_nodes(
|
|
nodes,
|
|
MergeRequest.includes(
|
|
:author,
|
|
:assignee,
|
|
{
|
|
# These associations are primarily used for checking permissions.
|
|
# Eager loading these ensures we don't end up running dozens of
|
|
# queries in this process.
|
|
target_project: [
|
|
{ namespace: :owner },
|
|
{ group: [:owners, :group_members] },
|
|
:invited_groups,
|
|
:project_members,
|
|
:project_feature
|
|
]
|
|
}),
|
|
self.class.data_attribute
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|