Implement exact-boundary match type

Close #3963
This commit is contained in:
Junegunn Choi
2024-08-13 11:19:54 +09:00
parent e8a690928d
commit 6a67712944
3 changed files with 38 additions and 11 deletions

View File

@@ -23,6 +23,7 @@ type termType int
const (
termFuzzy termType = iota
termExact
termExactBoundary
termPrefix
termSuffix
termEqual
@@ -147,6 +148,7 @@ func BuildPattern(cache *ChunkCache, patternCache map[string]*Pattern, fuzzy boo
ptr.procFun[termFuzzy] = fuzzyAlgo
ptr.procFun[termEqual] = algo.EqualMatch
ptr.procFun[termExact] = algo.ExactMatchNaive
ptr.procFun[termExactBoundary] = algo.ExactMatchBoundary
ptr.procFun[termPrefix] = algo.PrefixMatch
ptr.procFun[termSuffix] = algo.SuffixMatch
@@ -193,7 +195,14 @@ func parseTerms(fuzzy bool, caseMode Case, normalize bool, str string) []termSet
text = text[:len(text)-1]
}
if strings.HasPrefix(text, "'") {
if fuzzy && len(text) > 2 && strings.HasPrefix(text, "'") && strings.HasSuffix(text, "'") ||
!fuzzy && !strings.HasPrefix(text, "'") && strings.HasSuffix(text, "'") {
typ = termExactBoundary
if fuzzy {
text = text[1:]
}
text = text[:len(text)-1]
} else if strings.HasPrefix(text, "'") {
// Flip exactness
if fuzzy && !inv {
typ = termExact