Commit 4def47b3 authored by Dylan Griffith's avatar Dylan Griffith

Merge branch...

Merge branch '327224-investigate-elevated-db_duration_s-during-enabled-use_traversal_ids-ff-recursive' into 'master'

Resolve "Investigate elevated `db_duration_s`during enabled `use_traversal_ids` FF"

See merge request gitlab-org/gitlab!59095
parents a560d34d b9f38e32
...@@ -22,6 +22,7 @@ module Namespaces ...@@ -22,6 +22,7 @@ module Namespaces
object_hierarchy(self.class.where(id: id)) object_hierarchy(self.class.where(id: id))
.all_objects .all_objects
end end
alias_method :recursive_self_and_hierarchy, :self_and_hierarchy
# Returns all the ancestors of the current namespaces. # Returns all the ancestors of the current namespaces.
def ancestors def ancestors
...@@ -30,6 +31,7 @@ module Namespaces ...@@ -30,6 +31,7 @@ module Namespaces
object_hierarchy(self.class.where(id: parent_id)) object_hierarchy(self.class.where(id: parent_id))
.base_and_ancestors .base_and_ancestors
end end
alias_method :recursive_ancestors, :ancestors
# returns all ancestors upto but excluding the given namespace # returns all ancestors upto but excluding the given namespace
# when no namespace is given, all ancestors upto the top are returned # when no namespace is given, all ancestors upto the top are returned
...@@ -44,17 +46,20 @@ module Namespaces ...@@ -44,17 +46,20 @@ module Namespaces
object_hierarchy(self.class.where(id: id)) object_hierarchy(self.class.where(id: id))
.base_and_ancestors(hierarchy_order: hierarchy_order) .base_and_ancestors(hierarchy_order: hierarchy_order)
end end
alias_method :recursive_self_and_ancestors, :self_and_ancestors
# Returns all the descendants of the current namespace. # Returns all the descendants of the current namespace.
def descendants def descendants
object_hierarchy(self.class.where(parent_id: id)) object_hierarchy(self.class.where(parent_id: id))
.base_and_descendants .base_and_descendants
end end
alias_method :recursive_descendants, :descendants
def self_and_descendants def self_and_descendants
object_hierarchy(self.class.where(id: id)) object_hierarchy(self.class.where(id: id))
.base_and_descendants .base_and_descendants
end end
alias_method :recursive_self_and_descendants, :self_and_descendants
def object_hierarchy(ancestors_base) def object_hierarchy(ancestors_base)
Gitlab::ObjectHierarchy.new(ancestors_base, options: { use_distinct: Feature.enabled?(:use_distinct_in_object_hierarchy, self) }) Gitlab::ObjectHierarchy.new(ancestors_base, options: { use_distinct: Feature.enabled?(:use_distinct_in_object_hierarchy, self) })
......
...@@ -162,7 +162,7 @@ class EpicsFinder < IssuableFinder ...@@ -162,7 +162,7 @@ class EpicsFinder < IssuableFinder
elsif include_ancestors elsif include_ancestors
group.self_and_ancestors group.self_and_ancestors
elsif include_descendants elsif include_descendants
group.self_and_descendants group.recursive_self_and_descendants
else else
Group.id_in(group.id) Group.id_in(group.id)
end end
......
# frozen_string_literal: true # frozen_string_literal: true
RSpec.shared_examples 'namespace traversal' do RSpec.shared_examples 'namespace traversal' do
shared_examples 'recursive version' do |method|
let(:recursive_method) { "recursive_#{method}" }
it "is equivalent to ##{method}" do
groups.each do |group|
expect(group.public_send(method)).to match_array group.public_send(recursive_method)
end
end
it "makes a recursive query" do
groups.each do |group|
expect { group.public_send(recursive_method).load }.to make_queries_matching(/WITH RECURSIVE/)
end
end
end
describe '#self_and_hierarchy' do describe '#self_and_hierarchy' do
let!(:group) { create(:group, path: 'git_lab') } let!(:group) { create(:group, path: 'git_lab') }
let!(:nested_group) { create(:group, parent: group) } let!(:nested_group) { create(:group, parent: group) }
...@@ -14,6 +30,12 @@ RSpec.shared_examples 'namespace traversal' do ...@@ -14,6 +30,12 @@ RSpec.shared_examples 'namespace traversal' do
expect(nested_group.self_and_hierarchy).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group) expect(nested_group.self_and_hierarchy).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group)
expect(very_deep_nested_group.self_and_hierarchy).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group) expect(very_deep_nested_group.self_and_hierarchy).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group)
end end
describe '#recursive_self_and_hierarchy' do
let(:groups) { [group, nested_group, very_deep_nested_group] }
it_behaves_like 'recursive version', :self_and_hierarchy
end
end end
describe '#ancestors' do describe '#ancestors' do
...@@ -28,6 +50,12 @@ RSpec.shared_examples 'namespace traversal' do ...@@ -28,6 +50,12 @@ RSpec.shared_examples 'namespace traversal' do
expect(nested_group.ancestors).to include(group) expect(nested_group.ancestors).to include(group)
expect(group.ancestors).to eq([]) expect(group.ancestors).to eq([])
end end
describe '#recursive_ancestors' do
let(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
it_behaves_like 'recursive version', :ancestors
end
end end
describe '#self_and_ancestors' do describe '#self_and_ancestors' do
...@@ -42,6 +70,12 @@ RSpec.shared_examples 'namespace traversal' do ...@@ -42,6 +70,12 @@ RSpec.shared_examples 'namespace traversal' do
expect(nested_group.self_and_ancestors).to contain_exactly(group, nested_group) expect(nested_group.self_and_ancestors).to contain_exactly(group, nested_group)
expect(group.self_and_ancestors).to contain_exactly(group) expect(group.self_and_ancestors).to contain_exactly(group)
end end
describe '#recursive_self_and_ancestors' do
let(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
it_behaves_like 'recursive version', :self_and_ancestors
end
end end
describe '#descendants' do describe '#descendants' do
...@@ -58,6 +92,12 @@ RSpec.shared_examples 'namespace traversal' do ...@@ -58,6 +92,12 @@ RSpec.shared_examples 'namespace traversal' do
expect(nested_group.descendants.to_a).to include(deep_nested_group, very_deep_nested_group) expect(nested_group.descendants.to_a).to include(deep_nested_group, very_deep_nested_group)
expect(group.descendants.to_a).to include(nested_group, deep_nested_group, very_deep_nested_group) expect(group.descendants.to_a).to include(nested_group, deep_nested_group, very_deep_nested_group)
end end
describe '#recursive_descendants' do
let(:groups) { [group, nested_group, deep_nested_group, very_deep_nested_group] }
it_behaves_like 'recursive version', :descendants
end
end end
describe '#self_and_descendants' do describe '#self_and_descendants' do
...@@ -74,5 +114,11 @@ RSpec.shared_examples 'namespace traversal' do ...@@ -74,5 +114,11 @@ RSpec.shared_examples 'namespace traversal' do
expect(nested_group.self_and_descendants).to contain_exactly(nested_group, deep_nested_group, very_deep_nested_group) expect(nested_group.self_and_descendants).to contain_exactly(nested_group, deep_nested_group, very_deep_nested_group)
expect(group.self_and_descendants).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group) expect(group.self_and_descendants).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group)
end end
describe '#recursive_self_and_descendants' do
let(:groups) { [group, nested_group, deep_nested_group, very_deep_nested_group] }
it_behaves_like 'recursive version', :self_and_descendants
end
end end
end end
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