Commit 8062a7ac authored by Alper Akgun's avatar Alper Akgun

Merge branch '348293-fj-introduce-group-descendants-finder-upto' into 'master'

Introduce linear ancestors upto in GroupDescendantsFinder

See merge request gitlab-org/gitlab!78991
parents 47552665 fb91e449
...@@ -110,8 +110,13 @@ class GroupDescendantsFinder ...@@ -110,8 +110,13 @@ class GroupDescendantsFinder
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def ancestors_of_groups(base_for_ancestors) def ancestors_of_groups(base_for_ancestors)
group_ids = base_for_ancestors.except(:select, :sort).select(:id) group_ids = base_for_ancestors.except(:select, :sort).select(:id)
Gitlab::ObjectHierarchy.new(Group.where(id: group_ids)) groups = Group.where(id: group_ids)
.base_and_ancestors(upto: parent_group.id)
if Feature.enabled?(:linear_group_descendants_finder_upto, current_user, default_enabled: :yaml)
groups.self_and_ancestors(upto: parent_group.id)
else
Gitlab::ObjectHierarchy.new(groups).base_and_ancestors(upto: parent_group.id)
end
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
......
---
name: linear_group_descendants_finder_upto
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78991
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350972
milestone: '14.8'
type: development
group: group::authentication and authorization
default_enabled: false
...@@ -165,8 +165,8 @@ RSpec.describe GroupDescendantsFinder do ...@@ -165,8 +165,8 @@ RSpec.describe GroupDescendantsFinder do
end end
context 'with nested groups' do context 'with nested groups' do
let!(:project) { create(:project, namespace: group) } let_it_be(:project) { create(:project, namespace: group) }
let!(:subgroup) { create(:group, :private, parent: group) } let_it_be_with_reload(:subgroup) { create(:group, :private, parent: group) }
describe '#execute' do describe '#execute' do
it 'contains projects and subgroups' do it 'contains projects and subgroups' do
...@@ -208,57 +208,69 @@ RSpec.describe GroupDescendantsFinder do ...@@ -208,57 +208,69 @@ RSpec.describe GroupDescendantsFinder do
context 'with a filter' do context 'with a filter' do
let(:params) { { filter: 'test' } } let(:params) { { filter: 'test' } }
it 'contains only matching projects and subgroups' do shared_examples 'filter examples' do
matching_project = create(:project, namespace: group, name: 'Testproject') it 'contains only matching projects and subgroups' do
matching_subgroup = create(:group, name: 'testgroup', parent: group) matching_project = create(:project, namespace: group, name: 'Testproject')
matching_subgroup = create(:group, name: 'testgroup', parent: group)
expect(finder.execute).to contain_exactly(matching_subgroup, matching_project) expect(finder.execute).to contain_exactly(matching_subgroup, matching_project)
end end
it 'does not include subgroups the user does not have access to' do it 'does not include subgroups the user does not have access to' do
_invisible_subgroup = create(:group, :private, parent: group, name: 'test1') _invisible_subgroup = create(:group, :private, parent: group, name: 'test1')
other_subgroup = create(:group, :private, parent: group, name: 'test2') other_subgroup = create(:group, :private, parent: group, name: 'test2')
public_subgroup = create(:group, :public, parent: group, name: 'test3') public_subgroup = create(:group, :public, parent: group, name: 'test3')
other_subsubgroup = create(:group, :private, parent: other_subgroup, name: 'test4') other_subsubgroup = create(:group, :private, parent: other_subgroup, name: 'test4')
other_user = create(:user) other_user = create(:user)
other_subgroup.add_developer(other_user) other_subgroup.add_developer(other_user)
finder = described_class.new(current_user: other_user, finder = described_class.new(current_user: other_user,
parent_group: group, parent_group: group,
params: params) params: params)
expect(finder.execute).to contain_exactly(other_subgroup, public_subgroup, other_subsubgroup) expect(finder.execute).to contain_exactly(other_subgroup, public_subgroup, other_subsubgroup)
end end
context 'with matching children' do context 'with matching children' do
it 'includes a group that has a subgroup matching the query and its parent' do it 'includes a group that has a subgroup matching the query and its parent' do
matching_subgroup = create(:group, :private, name: 'testgroup', parent: subgroup) matching_subgroup = create(:group, :private, name: 'testgroup', parent: subgroup)
expect(finder.execute).to contain_exactly(subgroup, matching_subgroup) expect(finder.execute).to contain_exactly(subgroup, matching_subgroup)
end end
it 'includes the parent of a matching project' do it 'includes the parent of a matching project' do
matching_project = create(:project, namespace: subgroup, name: 'Testproject') matching_project = create(:project, namespace: subgroup, name: 'Testproject')
expect(finder.execute).to contain_exactly(subgroup, matching_project) expect(finder.execute).to contain_exactly(subgroup, matching_project)
end end
context 'with a small page size' do
let(:params) { { filter: 'test', per_page: 1 } }
it 'contains all the ancestors of a matching subgroup regardless the page size' do
subgroup = create(:group, :private, parent: group)
matching = create(:group, :private, name: 'testgroup', parent: subgroup)
context 'with a small page size' do expect(finder.execute).to contain_exactly(subgroup, matching)
let(:params) { { filter: 'test', per_page: 1 } } end
end
it 'contains all the ancestors of a matching subgroup regardless the page size' do it 'does not include the parent itself' do
subgroup = create(:group, :private, parent: group) group.update!(name: 'test')
matching = create(:group, :private, name: 'testgroup', parent: subgroup)
expect(finder.execute).to contain_exactly(subgroup, matching) expect(finder.execute).not_to include(group)
end end
end end
end
it 'does not include the parent itself' do it_behaves_like 'filter examples'
group.update!(name: 'test')
expect(finder.execute).not_to include(group) context 'when feature flag :linear_group_descendants_finder_upto is disabled' do
before do
stub_feature_flags(linear_group_descendants_finder_upto: false)
end end
it_behaves_like 'filter examples'
end 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