diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2018-12-19 23:05:29 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2018-12-19 23:05:29 +0900 |
commit | 5624a892311e96ffe019786c5507929d9427ad0f (patch) | |
tree | 89441a7b04f50989937935bb01071c80ee6de4ff /src/pattern.go | |
parent | 63c42b14f24c7b82515cf13d6372dd302f5d11a5 (diff) |
Inverse-only matches should not reorder the remaining results
Fix #1458
Diffstat (limited to 'src/pattern.go')
-rw-r--r-- | src/pattern.go | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/pattern.go b/src/pattern.go index 2627dea6..4880d6e9 100644 --- a/src/pattern.go +++ b/src/pattern.go @@ -52,6 +52,7 @@ type Pattern struct { forward bool text []rune termSets []termSet + sortable bool cacheable bool cacheKey string delimiter Delimiter @@ -101,18 +102,27 @@ func BuildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case, } caseSensitive := true + sortable := true termSets := []termSet{} if extended { termSets = parseTerms(fuzzy, caseMode, normalize, asString) + // We should not sort the result if there are only inverse search terms + sortable = false Loop: for _, termSet := range termSets { for idx, term := range termSet { + if !term.inv { + sortable = true + } // If the query contains inverse search terms or OR operators, // we cannot cache the search scope if !cacheable || idx > 0 || term.inv || fuzzy && term.typ != termFuzzy || !fuzzy && term.typ != termExact { cacheable = false - break Loop + if sortable { + // Can't break until we see at least one non-inverse term + break Loop + } } } } @@ -134,6 +144,7 @@ func BuildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case, forward: forward, text: []rune(asString), termSets: termSets, + sortable: sortable, cacheable: cacheable, nth: nth, delimiter: delimiter, |