Commit 7085ed1c authored by Jonathan Schafer's avatar Jonathan Schafer

Add feature flag and fix sorting logic

Added feature flag `project_finder_similarity_sort`
Put the sorting in the conditional
parent 7eb70dc1
...@@ -49,14 +49,13 @@ class ProjectsFinder < UnionFinder ...@@ -49,14 +49,13 @@ class ProjectsFinder < UnionFinder
use_cte = params.delete(:use_cte) use_cte = params.delete(:use_cte)
collection = Project.wrap_with_cte(collection) if use_cte collection = Project.wrap_with_cte(collection) if use_cte
collection = filter_projects(collection)
collection = if params[:sort] == 'similarity' && params[:search] if params[:sort] == 'similarity' && params[:search] && Feature.enabled?(:project_finder_similarity_sort)
by_search(collection).sorted_by_similarity_desc(params[:search]) collection.sorted_by_similarity_desc(params[:search])
else else
filter_projects(collection) sort(collection)
end end
sort(collection)
end end
private private
......
---
name: project_finder_similarity_sort
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43136
rollout_issue_url:
type: development
group: group::threat_insights
default_enabled: false
...@@ -223,6 +223,7 @@ export default { ...@@ -223,6 +223,7 @@ export default {
first: this.$options.PROJECTS_PER_PAGE, first: this.$options.PROJECTS_PER_PAGE,
after: pageInfo.endCursor, after: pageInfo.endCursor,
searchNamespaces: true, searchNamespaces: true,
sort: 'similarity',
}, },
}); });
}, },
......
...@@ -87,6 +87,7 @@ describe('Project Manager component', () => { ...@@ -87,6 +87,7 @@ describe('Project Manager component', () => {
first: wrapper.vm.$options.PROJECTS_PER_PAGE, first: wrapper.vm.$options.PROJECTS_PER_PAGE,
after: '', after: '',
searchNamespaces: true, searchNamespaces: true,
sort: 'similarity',
}, },
}); });
}); });
......
...@@ -31,6 +31,10 @@ RSpec.describe ProjectsFinder, :do_not_mock_admin_mode do ...@@ -31,6 +31,10 @@ RSpec.describe ProjectsFinder, :do_not_mock_admin_mode do
let(:use_cte) { true } let(:use_cte) { true }
let(:finder) { described_class.new(params: params.merge(use_cte: use_cte), current_user: current_user, project_ids_relation: project_ids_relation) } let(:finder) { described_class.new(params: params.merge(use_cte: use_cte), current_user: current_user, project_ids_relation: project_ids_relation) }
before do
stub_feature_flags(project_finder_similarity_sort: false)
end
subject { finder.execute } subject { finder.execute }
shared_examples 'ProjectFinder#execute examples' do shared_examples 'ProjectFinder#execute examples' do
...@@ -325,6 +329,10 @@ RSpec.describe ProjectsFinder, :do_not_mock_admin_mode do ...@@ -325,6 +329,10 @@ RSpec.describe ProjectsFinder, :do_not_mock_admin_mode do
create(:project, :internal, group: group, name: 'projAB', path: 'projAB') create(:project, :internal, group: group, name: 'projAB', path: 'projAB')
end end
before do
stub_feature_flags(project_finder_similarity_sort: true)
end
it { is_expected.to eq([internal_project2, internal_project4, internal_project3]) } it { is_expected.to eq([internal_project2, internal_project4, internal_project3]) }
end end
end end
......
...@@ -27,6 +27,10 @@ RSpec.describe Resolvers::ProjectsResolver do ...@@ -27,6 +27,10 @@ RSpec.describe Resolvers::ProjectsResolver do
private_group.add_developer(user) private_group.add_developer(user)
end end
before do
stub_feature_flags(project_finder_similarity_sort: false)
end
context 'when user is not logged in' do context 'when user is not logged in' do
let(:current_user) { nil } let(:current_user) { nil }
...@@ -118,14 +122,20 @@ RSpec.describe Resolvers::ProjectsResolver do ...@@ -118,14 +122,20 @@ RSpec.describe Resolvers::ProjectsResolver do
end end
context 'when sort is similarity' do context 'when sort is similarity' do
let_it_be(:named_project1) { create(:project, :public, name: 'projABC', path: 'projABC') } let_it_be(:named_project1) { create(:project, :public, name: 'projAB', path: 'projAB') }
let_it_be(:named_project2) { create(:project, :public, name: 'projA', path: 'projA') } let_it_be(:named_project2) { create(:project, :public, name: 'projABC', path: 'projABC') }
let_it_be(:named_project3) { create(:project, :public, name: 'projAB', path: 'projAB') } let_it_be(:named_project3) { create(:project, :public, name: 'projA', path: 'projA') }
let(:filters) { { search: 'projA', sort: 'similarity' } } let(:filters) { { search: 'projA', sort: 'similarity' } }
it 'returns projects in order of similarity to search' do it 'returns projects in order of similarity to search' do
is_expected.to match_array([named_project2, named_project3, named_project1]) stub_feature_flags(project_finder_similarity_sort: true)
is_expected.to eq([named_project3, named_project1, named_project2])
end
it 'returns projects not in order of similarity to search if flag is off' do
is_expected.not_to eq([named_project3, named_project1, named_project2])
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