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)
|
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) {
|
func TestGoLevelDBMerge(t *testing.T) {
|
||||||
s := open(t, &test.TestMergeCounter{})
|
s := open(t, &test.TestMergeCounter{})
|
||||||
defer cleanup(t, s)
|
defer cleanup(t, s)
|
||||||
|
@ -3,6 +3,7 @@ package test
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/blevesearch/bleve/index/store"
|
"github.com/blevesearch/bleve/index/store"
|
||||||
@ -275,3 +276,99 @@ func CommonTestRangeIterator(t *testing.T, s store.KVStore) {
|
|||||||
t.Fatal(err)
|
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