0
0

support using end key on forestdb iterator for term freq lookup

also additoanl forestdb configs
This commit is contained in:
Marty Schoch 2015-08-18 16:22:02 -04:00
parent d3dda3d0ea
commit 3e60ca24ec
5 changed files with 35 additions and 1 deletions

View File

@ -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 {

View File

@ -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()
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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,