Improve prefix/suffix cache lookup

This commit is contained in:
Junegunn Choi 2015-01-11 03:53:07 +09:00
parent bd7331ecf5
commit 313578a1a0

View File

@ -194,24 +194,19 @@ func (p *Pattern) Match(chunk *Chunk) []*Item {
} }
} }
// ChunkCache: Prefix match // ChunkCache: Prefix/suffix match
foundPrefixCache := false Loop:
for idx := len(cacheKey) - 1; idx > 0; idx-- {
if cached, found := _cache.Find(chunk, cacheKey[:idx]); found {
cachedChunk := Chunk(cached)
space = &cachedChunk
foundPrefixCache = true
break
}
}
// ChunkCache: Suffix match
if !foundPrefixCache {
for idx := 1; idx < len(cacheKey); idx++ { for idx := 1; idx < len(cacheKey); idx++ {
if cached, found := _cache.Find(chunk, cacheKey[idx:]); found { // [---------| ] | [ |---------]
// [--------| ] | [ |--------]
// [-------| ] | [ |-------]
prefix := cacheKey[:len(cacheKey)-idx]
suffix := cacheKey[idx:]
for _, substr := range [2]*string{&prefix, &suffix} {
if cached, found := _cache.Find(chunk, *substr); found {
cachedChunk := Chunk(cached) cachedChunk := Chunk(cached)
space = &cachedChunk space = &cachedChunk
break break Loop
} }
} }
} }