N+1 queries in /projects/:id/boards API
This came out of https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/13052#note_180380372. If I add this spec:
diff --git a/spec/support/api/boards_shared_examples.rb b/spec/support/api/boards_shared_examples.rb
index 592962ebf7c..0d25639ac32 100644
--- a/spec/support/api/boards_shared_examples.rb
+++ b/spec/support/api/boards_shared_examples.rb
@@ -33,6 +33,18 @@ shared_examples_for 'group and project boards' do |route_definition, ee = false|
expect_schema_match_for(response, 'public_api/v4/boards', ee)
end
+ it 'avoids N+1 queries' do
+ pat = create(:personal_access_token, user: user)
+ get api(root_url, personal_access_token: pat)
+
+ control = ActiveRecord::QueryRecorder.new { get api(root_url, personal_access_token: pat) }
+
+ milestone = create(:milestone, project: board_parent)
+ create(:board, project: board_parent)
+
+ expect { get api(root_url, personal_access_token: pat) }.not_to exceed_query_limit(control)
+ end
+
describe "GET #{route_definition}/:board_id" do
let(:url) { "#{root_url}/#{board.id}" }
Then run:
bundle exec rspec --fail-fast spec/requests/api/boards_spec.rb
I get:
1) API::Boards behaves like group and project boards GET /projects/:id/boards when authenticated avoids N+1 queries
Failure/Error: expect { get api(root_url, personal_access_token: pat) }.not_to exceed_query_limit(control)
Expected a maximum of 18 queries, got 21:
Extra queries:
[1] SELECT "lists".* FROM "lists" WHERE "lists"."board_id" = 4 AND "lists"."list_type" IN (1, 3, 4) ORDER BY "lists"."list_type" ASC, "lists"."position" ASC
[1] SELECT "users".* FROM "users" INNER JOIN "board_assignees" ON "users"."id" = "board_assignees"."assignee_id" WHERE "board_assignees"."board_id" = 4 LIMIT 1
[1] SELECT "labels".* FROM "labels" INNER JOIN "board_labels" ON "labels"."id" = "board_labels"."label_id" WHERE "board_labels"."board_id" = 4 ORDER BY "labels"."title" ASC
Shared Example Group: "group and project boards" called from ./spec/requests/api/boards_spec.rb:34
# ./spec/support/api/boards_shared_examples.rb:45:in `block (4 levels) in <main>'
/cc: @cablett