diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2024-05-23 15:33:11 +0200 |
|---|---|---|
| committer | Jeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com> | 2024-05-29 14:36:10 +0200 |
| commit | be74ef76b30e7ad9fc74294c8e94ff1f40e87b4e (patch) | |
| tree | b92150ebaed0d37f4baf822adc7979c846ba5091 /client/discovery.go | |
| parent | ef7f44e4bb7713b18e6c0ab1b6e3510075b6623b (diff) | |
Discovery: Improve search using levenshtein distance and sorting
Diffstat (limited to 'client/discovery.go')
| -rw-r--r-- | client/discovery.go | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/client/discovery.go b/client/discovery.go index 49df8b2..72f0ad5 100644 --- a/client/discovery.go +++ b/client/discovery.go @@ -1,6 +1,7 @@ package client import ( + "sort" "strings" "github.com/eduvpn/eduvpn-common/i18nerr" @@ -34,11 +35,23 @@ func (c *Client) DiscoOrganizations(ck *cookie.Cookie, search string) (*discotyp // convert to public subset var retOrgs []discotypes.Organization for _, v := range orgs.List { - if !v.Matches(search) { + if search == "" { + retOrgs = append(retOrgs, v.Organization) + continue + } + score := v.Score(search) + if score < 0 { continue } + v.Organization.Score = score retOrgs = append(retOrgs, v.Organization) } + if search != "" { + sort.Slice(retOrgs, func(i, j int) bool { + // lower score is better + return retOrgs[i].Score < retOrgs[j].Score + }) + } return &discotypes.Organizations{ List: retOrgs, }, err @@ -65,11 +78,23 @@ func (c *Client) DiscoServers(ck *cookie.Cookie, search string) (*discotypes.Ser // convert to public subset var retServs []discotypes.Server for _, v := range servs.List { - if !v.Matches(search) { + if search == "" { + retServs = append(retServs, v.Server) + continue + } + score := v.Score(search) + if score < 0 { continue } + v.Server.Score = score retServs = append(retServs, v.Server) } + if search != "" { + sort.Slice(retServs, func(i, j int) bool { + // lower score is better + return retServs[i].Score < retServs[j].Score + }) + } return &discotypes.Servers{ List: retServs, }, err |
