From be74ef76b30e7ad9fc74294c8e94ff1f40e87b4e Mon Sep 17 00:00:00 2001 From: jwijenbergh Date: Thu, 23 May 2024 15:33:11 +0200 Subject: Discovery: Improve search using levenshtein distance and sorting --- client/discovery.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'client') 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 -- cgit v1.2.3