From aada2e7333600a95695050b9a71725e5cdaa4505 Mon Sep 17 00:00:00 2001 From: Patrick Mezard Date: Tue, 20 Oct 2015 19:05:53 +0200 Subject: [PATCH] store_test: test RangeIterator.Seek on goleveldb --- index/store/goleveldb/store_test.go | 6 ++ index/store/test/iterator.go | 97 +++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/index/store/goleveldb/store_test.go b/index/store/goleveldb/store_test.go index e643fd4c..6fceee78 100644 --- a/index/store/goleveldb/store_test.go +++ b/index/store/goleveldb/store_test.go @@ -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) diff --git a/index/store/test/iterator.go b/index/store/test/iterator.go index ff5be9e7..aaf6149f 100644 --- a/index/store/test/iterator.go +++ b/index/store/test/iterator.go @@ -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) + } +}