diff --git a/index/store/forestdb/iterator.go b/index/store/forestdb/iterator.go index 5210352d..727bc488 100644 --- a/index/store/forestdb/iterator.go +++ b/index/store/forestdb/iterator.go @@ -43,6 +43,16 @@ func newIteratorWithSnapshot(store *Store, snapshot *forestdb.KVStore) *Iterator return &rv } +func newIteratorWithSnapshotAndRange(store *Store, snapshot *forestdb.KVStore, start, end []byte) *Iterator { + itr, err := snapshot.IteratorInit(start, end, forestdb.ITR_NONE) + rv := Iterator{ + store: store, + iterator: itr, + valid: err == nil, + } + return &rv +} + func (i *Iterator) SeekFirst() { err := i.iterator.SeekMin() if err != nil { diff --git a/index/store/forestdb/reader.go b/index/store/forestdb/reader.go index 76f97875..19f184de 100644 --- a/index/store/forestdb/reader.go +++ b/index/store/forestdb/reader.go @@ -52,6 +52,12 @@ func (r *Reader) Iterator(key []byte) store.KVIterator { return rv } +func (r *Reader) RangeIterator(start, end []byte) store.KVIterator { + rv := newIteratorWithSnapshotAndRange(r.store, r.snapshot, start, end) + rv.Seek(start) + return rv +} + func (r *Reader) Close() error { return r.snapshot.Close() } diff --git a/index/store/forestdb/store.go b/index/store/forestdb/store.go index c77d7a89..b6ffe6ba 100644 --- a/index/store/forestdb/store.go +++ b/index/store/forestdb/store.go @@ -42,6 +42,7 @@ func New(path string, createIfMissing bool, forestDBDefaultConfig := forestdb.DefaultConfig() forestDBDefaultConfig.SetCompactionMode(forestdb.COMPACT_AUTO) + forestDBDefaultConfig.SetMultiKVInstances(false) forestDBConfig, err := applyConfig(forestDBDefaultConfig, config) if err != nil { return nil, err @@ -284,5 +285,8 @@ func applyConfig(c *forestdb.Config, config map[string]interface{}) ( if v, exists := config["walThreshold"].(float64); exists { c.SetWalThreshold(uint64(v)) } + if v, exists := config["maxWriterLockProb"].(float64); exists { + c.SetMaxWriterLockProb(uint8(v)) + } return c, nil } diff --git a/index/store/kvstore.go b/index/store/kvstore.go index 4be8e0a5..b96fce8b 100644 --- a/index/store/kvstore.go +++ b/index/store/kvstore.go @@ -51,3 +51,8 @@ type KVReader interface { Iterator(key []byte) KVIterator Close() error } + +type RangeIterable interface { + // iterates keys >= start and < end + RangeIterator(start, end []byte) KVIterator +} diff --git a/index/upside_down/reader.go b/index/upside_down/reader.go index 967875bc..cf511186 100644 --- a/index/upside_down/reader.go +++ b/index/upside_down/reader.go @@ -46,7 +46,16 @@ func newUpsideDownCouchTermFieldReader(indexReader *IndexReader, term []byte, fi tfr := NewTermFrequencyRow(term, field, "", 0, 0) readerPrefix := tfr.Key() - it := indexReader.kvreader.Iterator(readerPrefix) + + var it store.KVIterator + switch kvreader := indexReader.kvreader.(type) { + case store.RangeIterable: + etfr := NewTermFrequencyRow(term[:len(term)-1], field, "", 0, 0) + nextTermPrefix := etfr.Key() + it = kvreader.RangeIterator(readerPrefix, nextTermPrefix) + default: + it = kvreader.Iterator(readerPrefix) + } return &UpsideDownCouchTermFieldReader{ indexReader: indexReader,