summaryrefslogtreecommitdiffstats
path: root/src/matcher.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-01-10 01:06:08 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-01-10 01:06:18 +0900
commitb7bb1008107fb079e68f9ebeeca699c65cc966c9 (patch)
tree845096d80fc4ef12d8fa3cdea1ccf352623a3fc3 /src/matcher.go
parentaa05bf5206768965e575b6032543745c830e6eea (diff)
Improve response time by only looking at top-N items
Diffstat (limited to 'src/matcher.go')
-rw-r--r--src/matcher.go39
1 files changed, 14 insertions, 25 deletions
diff --git a/src/matcher.go b/src/matcher.go
index ad782bdf..234e7033 100644
--- a/src/matcher.go
+++ b/src/matcher.go
@@ -18,7 +18,7 @@ type Matcher struct {
eventBox *EventBox
reqBox *EventBox
partitions int
- queryCache QueryCache
+ mergerCache map[string]*Merger
}
const (
@@ -44,7 +44,7 @@ func NewMatcher(patternBuilder func([]rune) *Pattern,
eventBox: eventBox,
reqBox: NewEventBox(),
partitions: runtime.NumCPU(),
- queryCache: make(QueryCache)}
+ mergerCache: make(map[string]*Merger)}
}
func (m *Matcher) Loop() {
@@ -67,30 +67,30 @@ func (m *Matcher) Loop() {
// Restart search
patternString := request.pattern.AsString()
- allMatches := []*Item{}
+ var merger *Merger
cancelled := false
count := CountItems(request.chunks)
foundCache := false
if count == prevCount {
- // Look up queryCache
- if cached, found := m.queryCache[patternString]; found {
+ // Look up mergerCache
+ if cached, found := m.mergerCache[patternString]; found {
foundCache = true
- allMatches = cached
+ merger = cached
}
} else {
- // Invalidate queryCache
+ // Invalidate mergerCache
prevCount = count
- m.queryCache = make(QueryCache)
+ m.mergerCache = make(map[string]*Merger)
}
if !foundCache {
- allMatches, cancelled = m.scan(request, 0)
+ merger, cancelled = m.scan(request, 0)
}
if !cancelled {
- m.queryCache[patternString] = allMatches
- m.eventBox.Set(EVT_SEARCH_FIN, allMatches)
+ m.mergerCache[patternString] = merger
+ m.eventBox.Set(EVT_SEARCH_FIN, merger)
}
}
}
@@ -120,12 +120,12 @@ type partialResult struct {
matches []*Item
}
-func (m *Matcher) scan(request MatchRequest, limit int) ([]*Item, bool) {
+func (m *Matcher) scan(request MatchRequest, limit int) (*Merger, bool) {
startedAt := time.Now()
numChunks := len(request.chunks)
if numChunks == 0 {
- return []*Item{}, false
+ return EmptyMerger, false
}
pattern := request.pattern
empty := pattern.IsEmpty()
@@ -188,18 +188,7 @@ func (m *Matcher) scan(request MatchRequest, limit int) ([]*Item, bool) {
partialResult := <-resultChan
partialResults[partialResult.index] = partialResult.matches
}
-
- var allMatches []*Item
- if empty || !m.sort {
- allMatches = []*Item{}
- for _, matches := range partialResults {
- allMatches = append(allMatches, matches...)
- }
- } else {
- allMatches = SortMerge(partialResults)
- }
-
- return allMatches, false
+ return NewMerger(partialResults, !empty && m.sort), false
}
func (m *Matcher) Reset(chunks []*Chunk, patternRunes []rune, cancel bool) {