...
1
2
3
4
5
6
7 package iterator_test
8
9 import (
10 "testing"
11
12 . "github.com/onsi/ginkgo"
13 . "github.com/onsi/gomega"
14
15 "github.com/syndtr/goleveldb/leveldb/comparer"
16 . "github.com/syndtr/goleveldb/leveldb/iterator"
17 "github.com/syndtr/goleveldb/leveldb/testutil"
18 )
19
20 var _ = testutil.Defer(func() {
21 Describe("Merged iterator", func() {
22 Test := func(filled int, empty int) func() {
23 return func() {
24 It("Should iterates and seeks correctly", func(done Done) {
25 rnd := testutil.NewRand()
26
27
28 filledKV := make([]testutil.KeyValue, filled)
29 kv := testutil.KeyValue_Generate(nil, 100, 1, 1, 10, 4, 4)
30 kv.Iterate(func(i int, key, value []byte) {
31 filledKV[rnd.Intn(filled)].Put(key, value)
32 })
33
34
35 iters := make([]Iterator, filled+empty)
36 for i := range iters {
37 if empty == 0 || (rnd.Int()%2 == 0 && filled > 0) {
38 filled--
39 Expect(filledKV[filled].Len()).ShouldNot(BeZero())
40 iters[i] = NewArrayIterator(filledKV[filled])
41 } else {
42 empty--
43 iters[i] = NewEmptyIterator(nil)
44 }
45 }
46
47
48 t := testutil.IteratorTesting{
49 KeyValue: kv.Clone(),
50 Iter: NewMergedIterator(iters, comparer.DefaultComparer, true),
51 }
52 testutil.DoIteratorTesting(&t)
53 done <- true
54 }, 15.0)
55 }
56 }
57
58 Describe("with three, all filled iterators", Test(3, 0))
59 Describe("with one filled, one empty iterators", Test(1, 1))
60 Describe("with one filled, two empty iterators", Test(1, 2))
61 })
62 })
63
64 func BenchmarkMergedIterator(b *testing.B) {
65 n := 11
66 iters := make([]Iterator, n)
67 for i := range iters {
68 kv := testutil.KeyValue_Generate(nil, 100, 1, 1, 10, 4, 4)
69 iters[i] = NewArrayIterator(kv)
70 }
71
72 mi := NewMergedIterator(iters, comparer.DefaultComparer, true)
73 b.ResetTimer()
74
75 for i := 0; i < b.N; i++ {
76 mi.First()
77 for mi.Next() {
78 mi.Key()
79 }
80 }
81 }
82
View as plain text