store_test: test RangeIterator.Seek on goleveldb
This commit is contained in:
parent
6cc21346dc
commit
aada2e7333
|
@ -75,6 +75,12 @@ func TestGoLevelDBRangeIterator(t *testing.T) {
|
|||
test.CommonTestRangeIterator(t, s)
|
||||
}
|
||||
|
||||
func TestGoLevelDBRangeIteratorSeek(t *testing.T) {
|
||||
s := open(t, nil)
|
||||
defer cleanup(t, s)
|
||||
test.CommonTestRangeIteratorSeek(t, s)
|
||||
}
|
||||
|
||||
func TestGoLevelDBMerge(t *testing.T) {
|
||||
s := open(t, &test.TestMergeCounter{})
|
||||
defer cleanup(t, s)
|
||||
|
|
|
@ -3,6 +3,7 @@ package test
|
|||
import (
|
||||
"bytes"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/blevesearch/bleve/index/store"
|
||||
|
@ -275,3 +276,99 @@ func CommonTestRangeIterator(t *testing.T, s store.KVStore) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func CommonTestRangeIteratorSeek(t *testing.T, s store.KVStore) {
|
||||
|
||||
data := []struct {
|
||||
key []byte
|
||||
val []byte
|
||||
}{
|
||||
{[]byte("a1"), []byte("val")},
|
||||
{[]byte("b1"), []byte("val")},
|
||||
{[]byte("c1"), []byte("val")},
|
||||
{[]byte("d1"), []byte("val")},
|
||||
{[]byte("e1"), []byte("val")},
|
||||
}
|
||||
|
||||
// open a writer
|
||||
writer, err := s.Writer()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// write the data
|
||||
batch := writer.NewBatch()
|
||||
for _, row := range data {
|
||||
batch.Set(row.key, row.val)
|
||||
}
|
||||
err = writer.ExecuteBatch(batch)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// close the writer
|
||||
err = writer.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// open a reader
|
||||
reader, err := s.Reader()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// get an iterator on a central subset of the data
|
||||
start := []byte("b1")
|
||||
end := []byte("d1")
|
||||
iter := reader.RangeIterator(start, end)
|
||||
|
||||
// seek before, at and after every possible key
|
||||
targets := [][]byte{}
|
||||
for _, row := range data {
|
||||
prefix := string(row.key[:1])
|
||||
targets = append(targets, []byte(prefix+"0"))
|
||||
targets = append(targets, []byte(prefix+"1"))
|
||||
targets = append(targets, []byte(prefix+"2"))
|
||||
}
|
||||
for _, target := range targets {
|
||||
found := []string{}
|
||||
for iter.Seek(target); iter.Valid(); iter.Next() {
|
||||
found = append(found, string(iter.Key()))
|
||||
if len(found) > len(data) {
|
||||
t.Fatalf("enumerated more than data keys after seeking to %s",
|
||||
string(target))
|
||||
}
|
||||
}
|
||||
wanted := []string{}
|
||||
for _, row := range data {
|
||||
if bytes.Compare(row.key, start) < 0 ||
|
||||
bytes.Compare(row.key, target) < 0 ||
|
||||
bytes.Compare(row.key, end) >= 0 {
|
||||
continue
|
||||
}
|
||||
wanted = append(wanted, string(row.key))
|
||||
}
|
||||
fs := strings.Join(found, ", ")
|
||||
ws := strings.Join(wanted, ", ")
|
||||
if fs != ws {
|
||||
t.Fatalf("iterating from %s returned [%s] instead of [%s]",
|
||||
string(target), fs, ws)
|
||||
}
|
||||
}
|
||||
|
||||
err = iter.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// close the reader
|
||||
err = reader.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user