Skip to content

Commit 3bfb1f2

Browse files
authored
Merge pull request #10 from letterbeezps/dev
Dev
2 parents 6b4e1af + c7de105 commit 3bfb1f2

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

internal/merge_iterator.go

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package keytype
2+
3+
import (
4+
"github.com/letterbeezps/miniKV/internal/iface"
5+
"github.com/pkg/errors"
6+
)
7+
8+
type TwoMergeIterator struct {
9+
First iface.Iterator
10+
Second iface.Iterator
11+
ChooseFirst bool
12+
Less func(f, s string) bool
13+
Equal func(f, s string) bool
14+
}
15+
16+
func NewTwoMergeIterstor(f, s iface.Iterator, less, equal func(f, s string) bool) (*TwoMergeIterator, error) {
17+
ret := &TwoMergeIterator{
18+
First: f,
19+
Second: s,
20+
Less: less,
21+
Equal: equal,
22+
}
23+
if err := ret.skipSecond(); err != nil {
24+
return nil, errors.Wrap(err, "skipSecond")
25+
}
26+
ret.ChooseFirst = ret.chooseFirst()
27+
return ret, nil
28+
}
29+
30+
func (iter *TwoMergeIterator) chooseFirst() bool {
31+
if !iter.First.IsValid() {
32+
return false
33+
}
34+
if !iter.Second.IsValid() {
35+
return true
36+
}
37+
return iter.Less(iter.First.Key(), iter.Second.Key())
38+
}
39+
40+
func (iter *TwoMergeIterator) skipSecond() error {
41+
if iter.First.IsValid() && iter.Second.IsValid() && iter.Equal(iter.First.Key(), iter.Second.Key()) {
42+
return iter.Second.Next()
43+
}
44+
return nil
45+
}
46+
47+
func (iter *TwoMergeIterator) Value() []byte {
48+
if iter.chooseFirst() {
49+
return iter.First.Value()
50+
} else {
51+
return iter.Second.Value()
52+
}
53+
}
54+
55+
func (iter *TwoMergeIterator) Key() string {
56+
if iter.chooseFirst() {
57+
return iter.First.Key()
58+
} else {
59+
return iter.Second.Key()
60+
}
61+
}
62+
63+
func (iter *TwoMergeIterator) IsValid() bool {
64+
if iter.chooseFirst() {
65+
return iter.First.IsValid()
66+
} else {
67+
return iter.Second.IsValid()
68+
}
69+
}
70+
71+
func (iter *TwoMergeIterator) Next() error {
72+
if iter.ChooseFirst {
73+
if err := iter.First.Next(); err != nil {
74+
return errors.Wrap(err, "First Next")
75+
}
76+
} else {
77+
if err := iter.Second.Next(); err != nil {
78+
return errors.Wrap(err, "Second Next")
79+
}
80+
}
81+
if err := iter.skipSecond(); err != nil {
82+
return errors.Wrap(err, "skipSecond")
83+
}
84+
iter.ChooseFirst = iter.chooseFirst()
85+
return nil
86+
}

mvcc/iterator_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,27 @@ func Test_Tx_Iteraotr(t *testing.T) {
130130
assert.Nil(t, iter.Next())
131131
i++
132132
}
133+
134+
iter, err = tx6.Iter("c", "f")
135+
assert.Nil(t, err)
136+
datas = []struct {
137+
key string
138+
val []byte
139+
}{
140+
{"e", []byte("e_1")},
141+
{"f", []byte("f_2")},
142+
}
143+
i = 0
144+
for iter.IsValid() {
145+
assert.Equal(t, datas[i].key, iter.Key())
146+
assert.Equal(t, datas[i].val, iter.Value())
147+
t.Log(iter.Key())
148+
t.Log(string(iter.Value()))
149+
assert.Nil(t, iter.Next())
150+
i++
151+
}
152+
153+
iter, err = tx6.Iter("g", "y")
154+
assert.Nil(t, err)
155+
assert.False(t, iter.IsValid())
133156
}

0 commit comments

Comments
 (0)