...

Source file src/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter_test.go

Documentation: github.com/syndtr/goleveldb/leveldb/iterator

     1  // Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>
     2  // All rights reserved.
     3  //
     4  // Use of this source code is governed by a BSD-style license that can be
     5  // found in the LICENSE file.
     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  					// Build key/value.
    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  					// Create itearators.
    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  					// Test the iterator.
    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