summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2019-06-23 07:54:08 -0700
committerStan Hu <stanhu@gmail.com>2019-06-24 09:57:38 -0700
commit211a00473b78ada629d1c401ec443b766392185e (patch)
tree4932e6f52a698ec8ffbc6756d53ede7695616ff0
parent7f6de7fe29c2731975166b1a864c5a5cf3141132 (diff)
downloadgitlab-ce-211a00473b78ada629d1c401ec443b766392185e.tar.gz
Eliminate N+1 queries in Dashboard::TodosController
This appears to bring down the number of SQL queries on GitLab.com for my Todos page from 672 to 100. Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/43042
-rw-r--r--app/controllers/dashboard/todos_controller.rb1
-rw-r--r--app/helpers/todos_helper.rb2
-rw-r--r--changelogs/unreleased/sh-optimize-todos-controller.yml5
-rw-r--r--spec/controllers/dashboard/todos_controller_spec.rb28
4 files changed, 35 insertions, 1 deletions
diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb
index f173c263474..6417cb8e933 100644
--- a/app/controllers/dashboard/todos_controller.rb
+++ b/app/controllers/dashboard/todos_controller.rb
@@ -10,6 +10,7 @@ class Dashboard::TodosController < Dashboard::ApplicationController
def index
@sort = params[:sort]
@todos = @todos.page(params[:page])
+ @todos = @todos.with_api_entity_associations
return if redirect_out_of_range(@todos)
end
diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb
index 6bd78336ed3..645160077f5 100644
--- a/app/helpers/todos_helper.rb
+++ b/app/helpers/todos_helper.rb
@@ -170,7 +170,7 @@ module TodosHelper
end
def todo_group_options
- groups = current_user.authorized_groups.map do |group|
+ groups = current_user.authorized_groups.with_route.map do |group|
{ id: group.id, text: group.full_name }
end
diff --git a/changelogs/unreleased/sh-optimize-todos-controller.yml b/changelogs/unreleased/sh-optimize-todos-controller.yml
new file mode 100644
index 00000000000..181ddd1b3bc
--- /dev/null
+++ b/changelogs/unreleased/sh-optimize-todos-controller.yml
@@ -0,0 +1,5 @@
+---
+title: Eliminate N+1 queries in Dashboard::TodosController
+merge_request: 29954
+author:
+type: performance
diff --git a/spec/controllers/dashboard/todos_controller_spec.rb b/spec/controllers/dashboard/todos_controller_spec.rb
index 6243ddc03c0..9a3fbfaac51 100644
--- a/spec/controllers/dashboard/todos_controller_spec.rb
+++ b/spec/controllers/dashboard/todos_controller_spec.rb
@@ -44,6 +44,34 @@ describe Dashboard::TodosController do
end
end
+ context "with render_views" do
+ render_views
+
+ it 'avoids N+1 queries', :request_store do
+ merge_request = create(:merge_request, source_project: project)
+ create(:todo, project: project, author: author, user: user, target: merge_request)
+ create(:issue, project: project, assignees: [user])
+
+ group = create(:group)
+ group.add_owner(user)
+
+ get :index
+
+ control = ActiveRecord::QueryRecorder.new { get :index }
+
+ create(:issue, project: project, assignees: [user])
+ group_2 = create(:group)
+ group_2.add_owner(user)
+ project_2 = create(:project)
+ project_2.add_developer(user)
+ merge_request_2 = create(:merge_request, source_project: project_2)
+ create(:todo, project: project, author: author, user: user, target: merge_request_2)
+
+ expect { get :index }.not_to exceed_query_limit(control)
+ expect(response.status).to eq(200)
+ end
+ end
+
context 'group authorization' do
it 'renders 404 when user does not have read access on given group' do
unauthorized_group = create(:group, :private)