FEATURE: prioritize group search order based on prefix match (#16093)

Our @mention user search prioritized users based on prefix matches.

So if searching for `sa` we will display `sam`, `asam` in that order

Previously, we did not prioritize group matches based on prefix. This change ensures better parity.

Implementation notes:

1. User search only prioritizes based on username prefix, not name prefix. TBD if we want to change that.
2. @mention on client side will show 0 group matches if we fill up all the spots with user matches. TBD if we want to unconditionally show the first / second group match.

Co-authored-by: Alan Guo Xiang Tan <gxtan1990@gmail.com>
This commit is contained in:
Sam
2022-03-03 16:57:52 +11:00
committed by GitHub
parent 2d79275481
commit 3bf5692c72
4 changed files with 63 additions and 28 deletions

View File

@ -923,21 +923,36 @@ describe Group do
end
describe '.search_groups' do
fab!(:group) { Fabricate(:group, name: 'tEsT_more_things', full_name: 'Abc something awesome') }
let(:messageable_group) { Fabricate(:group, name: "MessageableGroup", messageable_level: Group::ALIAS_LEVELS[:everyone]) }
def search_group_names(name)
Group.search_groups(name, sort: :auto).map(&:name)
end
it 'should return the right groups' do
group
group_name = Fabricate(:group, name: 'tEsT_more_things', full_name: 'Abc something awesome').name
expect(Group.search_groups('te')).to eq([group])
expect(Group.search_groups('TE')).to eq([group])
expect(Group.search_groups('es')).to eq([group])
expect(Group.search_groups('ES')).to eq([group])
expect(Group.search_groups('ngs')).to eq([group])
expect(Group.search_groups('sOmEthi')).to eq([group])
expect(Group.search_groups('abc')).to eq([group])
expect(Group.search_groups('sOmEthi')).to eq([group])
expect(Group.search_groups('test2')).to eq([])
expect(search_group_names('te')).to eq([group_name])
expect(search_group_names('TE')).to eq([group_name])
expect(search_group_names('es')).to eq([group_name])
expect(search_group_names('ES')).to eq([group_name])
expect(search_group_names('ngs')).to eq([group_name])
expect(search_group_names('sOmEthi')).to eq([group_name])
expect(search_group_names('abc')).to eq([group_name])
expect(search_group_names('sOmEthi')).to eq([group_name])
expect(search_group_names('test2')).to eq([])
end
it "should prioritize prefix matches on group's name or fullname" do
Fabricate(:group, name: 'pears_11', full_name: 'fred apple')
Fabricate(:group, name: 'apples', full_name: 'jane orange')
Fabricate(:group, name: 'oranges2', full_name: 'nothing')
Fabricate(:group, name: 'oranges1', full_name: 'ms fred')
expect(search_group_names('ap')).to eq(['apples', 'pears_11'])
expect(search_group_names('fr')).to eq(['pears_11', 'oranges1'])
expect(search_group_names('oran')).to eq(['oranges1', 'oranges2', 'apples'])
expect(search_group_names('pearsX11')).to eq([])
end
end