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
This commit is contained in:
parent
ebf87fd9c2
commit
6c642c087b
|
@ -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
|
||||||
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 }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue