From 6ef43d5ba05d4aa09c0ee1abf248e47cee1275fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D1=B5=C2=B5=CF=83=C9=B3=C9=A0?= <3168632+vuon9@users.noreply.github.com> Date: Mon, 25 Oct 2021 22:58:56 +0700 Subject: [PATCH] Support search by /s:keyword - symbol, /n:keyword - name --- cointop/search.go | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/cointop/search.go b/cointop/search.go index dd06844..94dbd99 100644 --- a/cointop/search.go +++ b/cointop/search.go @@ -93,6 +93,28 @@ func (ct *Cointop) Search(q string) error { ct.State.lastSearchQuery = q } + hasPrefix := false + canSearchSymbol := true + canSearchName := true + if strings.HasPrefix(q, "s:") { + canSearchSymbol = true + canSearchName = false + hasPrefix = true + log.Debug("Search, by keyword") + } + + if strings.HasPrefix(q, "n:") { + canSearchSymbol = false + canSearchName = true + hasPrefix = true + log.Debug("Search, by name") + } + + if hasPrefix { + q = q[2:] + log.Debugf("Search, truncated query '%s'", q) + } + idx := -1 min := -1 var hasprefixidx []int @@ -107,16 +129,23 @@ func (ct *Cointop) Search(q string) error { coin := ct.State.allCoins[i] name := strings.ToLower(coin.Name) symbol := strings.ToLower(coin.Symbol) + // if query matches symbol, return immediately - if symbol == q { + if canSearchSymbol && symbol == q { ct.GoToGlobalIndex(i) return nil } + + if !canSearchName { + continue + } + // if query matches name, return immediately if name == q { ct.GoToGlobalIndex(i) return nil } + // store index with the smallest levenshtein dist := levenshtein.DamerauLevenshteinDistance(name, q) if min == -1 || dist <= min { @@ -131,15 +160,22 @@ func (ct *Cointop) Search(q string) error { } } } + + if !canSearchName { + return nil + } + // go to row if prefix match if len(hasprefixidx) > 0 && hasprefixidx[0] != -1 && min > 0 { ct.GoToGlobalIndex(hasprefixidx[0]) return nil } + // go to row if levenshtein distance is small enough if idx > -1 && min <= 6 { ct.GoToGlobalIndex(idx) return nil } + return nil }