summaryrefslogtreecommitdiffstats
path: root/src/pattern.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2018-12-19 23:05:29 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2018-12-19 23:05:29 +0900
commit5624a892311e96ffe019786c5507929d9427ad0f (patch)
tree89441a7b04f50989937935bb01071c80ee6de4ff /src/pattern.go
parent63c42b14f24c7b82515cf13d6372dd302f5d11a5 (diff)
Inverse-only matches should not reorder the remaining results
Fix #1458
Diffstat (limited to 'src/pattern.go')
-rw-r--r--src/pattern.go13
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,