Line data Source code
1 : // Copyright 2024 The LevelDB-Go and Pebble Authors. All rights reserved. Use
2 : // of this source code is governed by a BSD-style license that can be found in
3 : // the LICENSE file.
4 :
5 : package base
6 :
7 : import (
8 : "context"
9 : "io"
10 : "strconv"
11 : "strings"
12 : )
13 :
14 : // NewDeletableSumValueMerger return a ValueMerger which computes the sum of its
15 : // arguments, but transforms a zero sum into a non-existent entry.
16 0 : func NewDeletableSumValueMerger(key, value []byte) (ValueMerger, error) {
17 0 : m := &deletableSumValueMerger{}
18 0 : return m, m.MergeNewer(value)
19 0 : }
20 :
21 : type deletableSumValueMerger struct {
22 : sum int64
23 : }
24 :
25 0 : func (m *deletableSumValueMerger) parseAndCalculate(value []byte) error {
26 0 : v, err := strconv.ParseInt(string(value), 10, 64)
27 0 : if err == nil {
28 0 : m.sum += v
29 0 : }
30 0 : return err
31 : }
32 :
33 0 : func (m *deletableSumValueMerger) MergeNewer(value []byte) error {
34 0 : return m.parseAndCalculate(value)
35 0 : }
36 :
37 0 : func (m *deletableSumValueMerger) MergeOlder(value []byte) error {
38 0 : return m.parseAndCalculate(value)
39 0 : }
40 :
41 0 : func (m *deletableSumValueMerger) Finish(includesBase bool) ([]byte, io.Closer, error) {
42 0 : if m.sum == 0 {
43 0 : return nil, nil, nil
44 0 : }
45 0 : return []byte(strconv.FormatInt(m.sum, 10)), nil, nil
46 : }
47 :
48 : func (m *deletableSumValueMerger) DeletableFinish(
49 : includesBase bool,
50 0 : ) ([]byte, bool, io.Closer, error) {
51 0 : value, closer, err := m.Finish(includesBase)
52 0 : return value, len(value) == 0, closer, err
53 0 : }
54 :
55 : // FakeKVs constructs InternalKVs from the given key strings, in the format
56 : // "key:seq-num". The values are empty.
57 0 : func FakeKVs(keys ...string) []InternalKV {
58 0 : kvs := make([]InternalKV, len(keys))
59 0 : for i, k := range keys {
60 0 : kvs[i] = InternalKV{K: fakeIkey(k)}
61 0 : }
62 0 : return kvs
63 : }
64 :
65 0 : func fakeIkey(s string) InternalKey {
66 0 : j := strings.Index(s, ":")
67 0 : seqNum, err := strconv.Atoi(s[j+1:])
68 0 : if err != nil {
69 0 : panic(err)
70 : }
71 0 : return MakeInternalKey([]byte(s[:j]), uint64(seqNum), InternalKeyKindSet)
72 : }
73 :
74 : // NewFakeIter returns an iterator over the given KVs.
75 0 : func NewFakeIter(kvs []InternalKV) *FakeIter {
76 0 : return &FakeIter{
77 0 : kvs: kvs,
78 0 : index: 0,
79 0 : valid: len(kvs) > 0,
80 0 : }
81 0 : }
82 :
83 : // FakeIter is an iterator over a fixed set of KVs.
84 : type FakeIter struct {
85 : lower []byte
86 : upper []byte
87 : kvs []InternalKV
88 : index int
89 : valid bool
90 : closeErr error
91 : }
92 :
93 : // FakeIter implements the InternalIterator interface.
94 : var _ InternalIterator = (*FakeIter)(nil)
95 :
96 : // SetCloseErr causes future calls to Error() and Close() to return this error.
97 0 : func (f *FakeIter) SetCloseErr(closeErr error) {
98 0 : f.closeErr = closeErr
99 0 : }
100 :
101 0 : func (f *FakeIter) String() string {
102 0 : return "fake"
103 0 : }
104 :
105 : // SeekGE is part of the InternalIterator interface.
106 0 : func (f *FakeIter) SeekGE(key []byte, flags SeekGEFlags) *InternalKV {
107 0 : f.valid = false
108 0 : for f.index = 0; f.index < len(f.kvs); f.index++ {
109 0 : if DefaultComparer.Compare(key, f.key().UserKey) <= 0 {
110 0 : if f.upper != nil && DefaultComparer.Compare(f.upper, f.key().UserKey) <= 0 {
111 0 : return nil
112 0 : }
113 0 : f.valid = true
114 0 : return f.KV()
115 : }
116 : }
117 0 : return nil
118 : }
119 :
120 : // SeekPrefixGE is part of the InternalIterator interface.
121 0 : func (f *FakeIter) SeekPrefixGE(prefix, key []byte, flags SeekGEFlags) *InternalKV {
122 0 : return f.SeekGE(key, flags)
123 0 : }
124 :
125 : // SeekLT is part of the InternalIterator interface.
126 0 : func (f *FakeIter) SeekLT(key []byte, flags SeekLTFlags) *InternalKV {
127 0 : f.valid = false
128 0 : for f.index = len(f.kvs) - 1; f.index >= 0; f.index-- {
129 0 : if DefaultComparer.Compare(key, f.key().UserKey) > 0 {
130 0 : if f.lower != nil && DefaultComparer.Compare(f.lower, f.key().UserKey) > 0 {
131 0 : return nil
132 0 : }
133 0 : f.valid = true
134 0 : return f.KV()
135 : }
136 : }
137 0 : return nil
138 : }
139 :
140 : // First is part of the InternalIterator interface.
141 0 : func (f *FakeIter) First() *InternalKV {
142 0 : f.valid = false
143 0 : f.index = -1
144 0 : if kv := f.Next(); kv == nil {
145 0 : return nil
146 0 : }
147 0 : if f.upper != nil && DefaultComparer.Compare(f.upper, f.key().UserKey) <= 0 {
148 0 : return nil
149 0 : }
150 0 : f.valid = true
151 0 : return f.KV()
152 : }
153 :
154 : // Last is part of the InternalIterator interface.
155 0 : func (f *FakeIter) Last() *InternalKV {
156 0 : f.valid = false
157 0 : f.index = len(f.kvs)
158 0 : if kv := f.Prev(); kv == nil {
159 0 : return nil
160 0 : }
161 0 : if f.lower != nil && DefaultComparer.Compare(f.lower, f.key().UserKey) > 0 {
162 0 : return nil
163 0 : }
164 0 : f.valid = true
165 0 : return f.KV()
166 : }
167 :
168 : // Next is part of the InternalIterator interface.
169 0 : func (f *FakeIter) Next() *InternalKV {
170 0 : f.valid = false
171 0 : if f.index == len(f.kvs) {
172 0 : return nil
173 0 : }
174 0 : f.index++
175 0 : if f.index == len(f.kvs) {
176 0 : return nil
177 0 : }
178 0 : if f.upper != nil && DefaultComparer.Compare(f.upper, f.key().UserKey) <= 0 {
179 0 : return nil
180 0 : }
181 0 : f.valid = true
182 0 : return f.KV()
183 : }
184 :
185 : // Prev is part of the InternalIterator interface.
186 0 : func (f *FakeIter) Prev() *InternalKV {
187 0 : f.valid = false
188 0 : if f.index < 0 {
189 0 : return nil
190 0 : }
191 0 : f.index--
192 0 : if f.index < 0 {
193 0 : return nil
194 0 : }
195 0 : if f.lower != nil && DefaultComparer.Compare(f.lower, f.key().UserKey) > 0 {
196 0 : return nil
197 0 : }
198 0 : f.valid = true
199 0 : return f.KV()
200 : }
201 :
202 : // NextPrefix is part of the InternalIterator interface.
203 0 : func (f *FakeIter) NextPrefix(succKey []byte) *InternalKV {
204 0 : return f.SeekGE(succKey, SeekGEFlagsNone)
205 0 : }
206 :
207 : // key returns the current Key the iterator is positioned at regardless of the
208 : // value of f.valid.
209 0 : func (f *FakeIter) key() *InternalKey {
210 0 : return &f.kvs[f.index].K
211 0 : }
212 :
213 : // KV is part of the InternalIterator interface.
214 0 : func (f *FakeIter) KV() *InternalKV {
215 0 : if f.valid {
216 0 : return &f.kvs[f.index]
217 0 : }
218 : // It is invalid to call Key() when Valid() returns false. Rather than
219 : // returning nil here which would technically be more correct, return a
220 : // non-nil key which is the behavior of some InternalIterator
221 : // implementations. This provides better testing of users of
222 : // InternalIterators.
223 0 : if f.index < 0 {
224 0 : return &f.kvs[0]
225 0 : }
226 0 : return &f.kvs[len(f.kvs)-1]
227 : }
228 :
229 : // Valid is part of the InternalIterator interface.
230 0 : func (f *FakeIter) Valid() bool {
231 0 : return f.index >= 0 && f.index < len(f.kvs) && f.valid
232 0 : }
233 :
234 : // Error is part of the InternalIterator interface.
235 0 : func (f *FakeIter) Error() error {
236 0 : return f.closeErr
237 0 : }
238 :
239 : // Close is part of the InternalIterator interface.
240 0 : func (f *FakeIter) Close() error {
241 0 : return f.closeErr
242 0 : }
243 :
244 : // SetBounds is part of the InternalIterator interface.
245 0 : func (f *FakeIter) SetBounds(lower, upper []byte) {
246 0 : f.lower = lower
247 0 : f.upper = upper
248 0 : }
249 :
250 : // SetContext is part of the InternalIterator interface.
251 0 : func (f *FakeIter) SetContext(_ context.Context) {}
|