diff --git a/app/controllers/concerns/renders_member_access.rb b/app/controllers/concerns/renders_member_access.rb index 745830181c1ecad56760eb3a2872b61c270a186b..133d797c8ac82600a33515a4a62c8a1e24692fd7 100644 --- a/app/controllers/concerns/renders_member_access.rb +++ b/app/controllers/concerns/renders_member_access.rb @@ -15,7 +15,8 @@ def preload_max_member_access_for_collection(klass, collection) method_name = "max_member_access_for_#{klass.name.underscore}_ids" - current_user.public_send(method_name, collection.ids) # rubocop:disable GitlabSecurity/PublicSend + collection_ids = collection.try(:map, &:id) || collection.ids + current_user.public_send(method_name, collection_ids) # rubocop:disable GitlabSecurity/PublicSend end # rubocop: enable CodeReuse/ActiveRecord end diff --git a/app/controllers/concerns/renders_projects_list.rb b/app/controllers/concerns/renders_projects_list.rb index 739b2be3fe9e254ca2f24ae77973c54cc8453fb4..2d37bc3f9a56e4e422bc60b316a9ca757fe1c3e6 100644 --- a/app/controllers/concerns/renders_projects_list.rb +++ b/app/controllers/concerns/renders_projects_list.rb @@ -1,8 +1,11 @@ # frozen_string_literal: true module RendersProjectsList + include RendersMemberAccess + def prepare_projects_for_rendering(projects) preload_max_member_access_for_collection(Project, projects) + current_user.preloaded_member_roles_for_projects(projects) if current_user # Call the count methods on every project, so the BatchLoader would load them all at # once when the entities are rendered diff --git a/app/presenters/search_service_presenter.rb b/app/presenters/search_service_presenter.rb index d7d959217b05e864d89089c37d242b21f8b3bdea..91e67c379c44bfbc8719c64e50f7673f9cae4acd 100644 --- a/app/presenters/search_service_presenter.rb +++ b/app/presenters/search_service_presenter.rb @@ -2,6 +2,7 @@ class SearchServicePresenter < Gitlab::View::Presenter::Delegated include RendersCommits + include RendersProjectsList presents ::SearchService, as: :search_service @@ -28,6 +29,8 @@ def search_objects objects.respond_to?(:eager_load) ? objects.eager_load(:status) : objects # rubocop:disable CodeReuse/ActiveRecord when 'commits' prepare_commits_for_rendering(objects) + when 'projects' + prepare_projects_for_rendering(objects) else objects end diff --git a/ee/spec/requests/search_controller_spec.rb b/ee/spec/requests/search_controller_spec.rb index ddf147f3ff78a79f3e5b993f5d612dfbd7d7e216..4497fa26eeb86c884845aeed93908d27408fe8dc 100644 --- a/ee/spec/requests/search_controller_spec.rb +++ b/ee/spec/requests/search_controller_spec.rb @@ -75,14 +75,9 @@ def send_search_request(params) let(:creation_args) { { name: 'foo' } } let(:params) { { search: 'foo', scope: 'projects' } } # some N+1 queries still exist - # each project requires 3 extra queries - # - one count for forks - # - one count for open MRs - # - one count for open Issues - # there are 4 additional queries run for the logged in user: - # (1) user preferences, (1) user statuses, (1) user details, (1) users - # the threshold accounts for 6 projects - let(:threshold) { 42 } + # 1 for users + # 1 for root ancestor for each project + let(:threshold) { 7 } it_behaves_like 'an efficient database result' end diff --git a/spec/requests/search_controller_spec.rb b/spec/requests/search_controller_spec.rb index 98dda75a2b0d77f177aaa36516c5257994e14313..f2d4e288ddc300691c5b0da14b264858dc7b1c4c 100644 --- a/spec/requests/search_controller_spec.rb +++ b/spec/requests/search_controller_spec.rb @@ -66,13 +66,9 @@ def send_search_request(params) let(:creation_args) { { name: 'project' } } let(:params) { { search: 'project', scope: 'projects' } } # some N+1 queries still exist - # each project requires 3 extra queries - # - one count for forks - # - one count for open MRs - # - one count for open Issues - # there are 4 additional queries run for the logged in user: - # (1) user preferences, (1) user statuses, (1) user details, (1) users - let(:threshold) { 17 } + # 1 for users + # 1 for root ancestor for each project + let(:threshold) { 7 } it_behaves_like 'an efficient database result' end