diff options
-rw-r--r-- | changelogs/unreleased/load_project_features.yml | 5 | ||||
-rw-r--r-- | lib/banzai/reference_parser/base_parser.rb | 2 | ||||
-rw-r--r-- | spec/lib/banzai/reference_parser/commit_parser_spec.rb | 18 | ||||
-rw-r--r-- | spec/support/helpers/reference_parser_helpers.rb | 6 |
4 files changed, 29 insertions, 2 deletions
diff --git a/changelogs/unreleased/load_project_features.yml b/changelogs/unreleased/load_project_features.yml new file mode 100644 index 00000000000..0cf7f0e3a74 --- /dev/null +++ b/changelogs/unreleased/load_project_features.yml @@ -0,0 +1,5 @@ +--- +title: Mitigate N+1 queries when parsing commit references in comments. +merge_request: +author: +type: performance diff --git a/lib/banzai/reference_parser/base_parser.rb b/lib/banzai/reference_parser/base_parser.rb index 3ab154a7b1c..334ba97bfb3 100644 --- a/lib/banzai/reference_parser/base_parser.rb +++ b/lib/banzai/reference_parser/base_parser.rb @@ -215,7 +215,7 @@ module Banzai # def projects_for_nodes(nodes) @projects_for_nodes ||= - grouped_objects_for_nodes(nodes, Project, 'data-project') + grouped_objects_for_nodes(nodes, Project.includes(:project_feature), 'data-project') end def can?(user, permission, subject = :global) diff --git a/spec/lib/banzai/reference_parser/commit_parser_spec.rb b/spec/lib/banzai/reference_parser/commit_parser_spec.rb index cca53a8b9b9..f558dea209f 100644 --- a/spec/lib/banzai/reference_parser/commit_parser_spec.rb +++ b/spec/lib/banzai/reference_parser/commit_parser_spec.rb @@ -120,4 +120,22 @@ describe Banzai::ReferenceParser::CommitParser do expect(subject.find_commits(project, %w{123})).to eq([]) end end + + context 'when checking commits on another projects' do + let(:control_links) do + [commit_link] + end + + let(:actual_links) do + control_links + [commit_link, commit_link] + end + + def commit_link + project = create(:project, :repository, :public) + + Nokogiri::HTML.fragment(%Q{<a data-commit="#{project.commit.id}" data-project="#{project.id}"></a>}).children[0] + end + + it_behaves_like 'no project N+1 queries' + end end diff --git a/spec/support/helpers/reference_parser_helpers.rb b/spec/support/helpers/reference_parser_helpers.rb index c01897ed1a1..9f27502aa52 100644 --- a/spec/support/helpers/reference_parser_helpers.rb +++ b/spec/support/helpers/reference_parser_helpers.rb @@ -3,7 +3,7 @@ module ReferenceParserHelpers Nokogiri::HTML.fragment('<a></a>').children[0] end - shared_examples 'no N+1 queries' do + shared_examples 'no project N+1 queries' do it 'avoids N+1 queries in #nodes_visible_to_user', :request_store do context = Banzai::RenderContext.new(project, user) @@ -19,6 +19,10 @@ module ReferenceParserHelpers expect(actual.count).to be <= control.count expect(actual.cached_count).to be <= control.cached_count end + end + + shared_examples 'no N+1 queries' do + it_behaves_like 'no project N+1 queries' it 'avoids N+1 queries in #records_for_nodes', :request_store do context = Banzai::RenderContext.new(project, user) |