0
0
Fork 0

optimize upside-down FieldDict reader with prealloc'ed objects

As part of this commit, there's also a newly added
Dictionaryrow.parseDictionaryK() helper method.
This commit is contained in:
Steve Yen 2016-10-10 16:16:30 -07:00
parent d026a44230
commit 2d72b542c0
2 changed files with 27 additions and 13 deletions

View File

@ -24,6 +24,8 @@ import (
type UpsideDownCouchFieldDict struct {
indexReader *IndexReader
iterator store.KVIterator
dictRow *DictionaryRow
dictEntry *index.DictEntry
field uint16
}
@ -42,6 +44,8 @@ func newUpsideDownCouchFieldDict(indexReader *IndexReader, field uint16, startTe
return &UpsideDownCouchFieldDict{
indexReader: indexReader,
iterator: it,
dictRow: &DictionaryRow{}, // Pre-alloced, reused row.
dictEntry: &index.DictEntry{}, // Pre-alloced, reused entry.
field: field,
}, nil
@ -53,17 +57,19 @@ func (r *UpsideDownCouchFieldDict) Next() (*index.DictEntry, error) {
return nil, nil
}
currRow, err := NewDictionaryRowKV(key, val)
err := r.dictRow.parseDictionaryK(key)
if err != nil {
return nil, fmt.Errorf("unexpected error parsing dictionary row kv: %v", err)
return nil, fmt.Errorf("unexpected error parsing dictionary row key: %v", err)
}
rv := index.DictEntry{
Term: string(currRow.term),
Count: currRow.count,
err = r.dictRow.parseDictionaryV(val)
if err != nil {
return nil, fmt.Errorf("unexpected error parsing dictionary row val: %v", err)
}
r.dictEntry.Term = string(r.dictRow.term)
r.dictEntry.Count = r.dictRow.count
// advance the iterator to the next term
r.iterator.Next()
return &rv, nil
return r.dictEntry, nil
}

View File

@ -306,25 +306,33 @@ func NewDictionaryRowKV(key, value []byte) (*DictionaryRow, error) {
}
func NewDictionaryRowK(key []byte) (*DictionaryRow, error) {
rv := DictionaryRow{}
rv := &DictionaryRow{}
err := rv.parseDictionaryK(key)
if err != nil {
return nil, err
}
return rv, nil
}
func (dr *DictionaryRow) parseDictionaryK(key []byte) error {
buf := bytes.NewBuffer(key)
_, err := buf.ReadByte() // type
if err != nil {
return nil, err
return err
}
err = binary.Read(buf, binary.LittleEndian, &rv.field)
err = binary.Read(buf, binary.LittleEndian, &dr.field)
if err != nil {
return nil, err
return err
}
rv.term, err = buf.ReadBytes(ByteSeparator)
dr.term, err = buf.ReadBytes(ByteSeparator)
// there is no separator expected here, should get EOF
if err != io.EOF {
return nil, err
return err
}
return &rv, nil
return nil
}
func (dr *DictionaryRow) parseDictionaryV(value []byte) error {