Commit 6940968e authored by Terri Chu's avatar Terri Chu Committed by Peter Leitzen

Fix N+1 queries for Elastic Search milestones scope

parent 9149d54a
...@@ -28,6 +28,7 @@ class Milestone < ApplicationRecord ...@@ -28,6 +28,7 @@ class Milestone < ApplicationRecord
scope :order_by_name_asc, -> { order(Arel::Nodes::Ascending.new(arel_table[:title].lower)) } scope :order_by_name_asc, -> { order(Arel::Nodes::Ascending.new(arel_table[:title].lower)) }
scope :reorder_by_due_date_asc, -> { reorder(Gitlab::Database.nulls_last_order('due_date', 'ASC')) } scope :reorder_by_due_date_asc, -> { reorder(Gitlab::Database.nulls_last_order('due_date', 'ASC')) }
scope :with_api_entity_associations, -> { preload(project: [:project_feature, :route, namespace: :route]) }
validates_associated :milestone_releases, message: -> (_, obj) { obj[:value].map(&:errors).map(&:full_messages).join(",") } validates_associated :milestone_releases, message: -> (_, obj) { obj[:value].map(&:errors).map(&:full_messages).join(",") }
......
---
title: Fix N+1 queries for Elastic Search milestones scope.
merge_request: 33327
author:
type: performance
...@@ -212,6 +212,16 @@ RSpec.describe API::Search do ...@@ -212,6 +212,16 @@ RSpec.describe API::Search do
end end
it_behaves_like 'pagination', scope: 'milestones' it_behaves_like 'pagination', scope: 'milestones'
it 'avoids N+1 queries' do
control = ActiveRecord::QueryRecorder.new { get api(endpoint, user), params: { scope: 'milestones', search: '*' } }
create_list(:milestone, 3, project: project)
create_list(:milestone, 2, project: create(:project, :public))
ensure_elasticsearch_index!
expect { get api(endpoint, user), params: { scope: 'milestones', search: '*' } }.not_to exceed_query_limit(control.count)
end
end end
context 'for users scope', :sidekiq_inline do context 'for users scope', :sidekiq_inline do
......
...@@ -23,7 +23,8 @@ module API ...@@ -23,7 +23,8 @@ module API
SCOPE_PRELOAD_METHOD = { SCOPE_PRELOAD_METHOD = {
merge_requests: :with_api_entity_associations, merge_requests: :with_api_entity_associations,
projects: :with_api_entity_associations, projects: :with_api_entity_associations,
issues: :with_api_entity_associations issues: :with_api_entity_associations,
milestones: :with_api_entity_associations
}.freeze }.freeze
def search(additional_params = {}) def search(additional_params = {})
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment