Commit 6c642c08 authored by Thong Kuah's avatar Thong Kuah

Eager load clusters to prevent N+1

This also means we need to apply the `current_scope` otherwise this
method will return all clusters associated with the groups regardless of
any scopes applied to this method
parent ebf87fd9
...@@ -94,7 +94,8 @@ module Clusters ...@@ -94,7 +94,8 @@ module Clusters
end end
def self.ancestor_clusters_for_clusterable(clusterable, hierarchy_order: :asc) def self.ancestor_clusters_for_clusterable(clusterable, hierarchy_order: :asc)
hierarchy_groups = clusterable.ancestors_upto(hierarchy_order: hierarchy_order) hierarchy_groups = clusterable.ancestors_upto(hierarchy_order: hierarchy_order).eager_load(:clusters)
hierarchy_groups = hierarchy_groups.merge(current_scope) if current_scope
hierarchy_groups.flat_map(&:clusters) hierarchy_groups.flat_map(&:clusters)
end end
......
...@@ -292,6 +292,22 @@ describe Clusters::Cluster do ...@@ -292,6 +292,22 @@ describe Clusters::Cluster do
is_expected.to eq([group_cluster, sub_group_cluster]) is_expected.to eq([group_cluster, sub_group_cluster])
end end
it 'avoids N+1 queries' do
another_project = create(:project)
control_count = ActiveRecord::QueryRecorder.new do
described_class.ancestor_clusters_for_clusterable(another_project, hierarchy_order: hierarchy_order)
end.count
cluster2 = create(:cluster, :provided_by_gcp, :group)
child2 = cluster2.group
child2.update!(parent: sub_group)
project = create(:project, group: child2)
expect do
described_class.ancestor_clusters_for_clusterable(project, hierarchy_order: hierarchy_order)
end.not_to exceed_query_limit(control_count)
end
context 'for a group' do context 'for a group' do
let(:clusterable) { sub_group } let(:clusterable) { sub_group }
......
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