Optimize API /groups/:id/projects by preloading associations

Closes #40308
This commit is contained in:
Stan Hu 2017-11-19 06:35:25 -08:00 committed by Francisco Lopez
parent c594659fea
commit 88e3ce30ae
3 changed files with 20 additions and 0 deletions

View File

@ -0,0 +1,5 @@
---
title: Optimize API /groups/:id/projects by preloading fork_networks table
merge_request:
author:
type: performance

View File

@ -172,6 +172,7 @@ module API
get ":id/projects" do
group = find_group!(params[:id])
projects = GroupProjectsFinder.new(group: group, current_user: current_user, params: project_finder_params).execute
projects = projects.preload(:fork_network, :forked_project_link, :project_feature, :project_group_links, :tags, :taggings, :group, :namespace)
projects = reorder_projects(projects)
entity = params[:simple] ? Entities::BasicProjectDetails : Entities::Project
present paginate(projects), with: entity, current_user: current_user

View File

@ -401,6 +401,20 @@ describe API::Groups do
expect(response).to have_gitlab_http_status(404)
end
it 'avoids N+1 queries' do
get api("/groups/#{group1.id}/projects", admin)
control_count = ActiveRecord::QueryRecorder.new do
get api("/groups/#{group1.id}/projects", admin)
end.count
create(:project, namespace: group1)
expect do
get api("/groups/#{group1.id}/projects", admin)
end.not_to exceed_query_limit(control_count)
end
end
context 'when using group path in URL' do