Skip to content

Commit 433bdc9

Browse files
committed
Go: have Advance() return read key-values
1 parent e0d6856 commit 433bdc9

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

bindings/go/src/fdb/range.go

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,22 @@ func (rr RangeResult) GetSliceWithError() ([]KeyValue, error) {
142142
ri.options.Mode = StreamingModeWantAll
143143
}
144144

145-
for ri.Advance() {
146-
if ri.err != nil {
147-
return nil, ri.err
145+
for {
146+
ok, kvs, err := ri.Advance()
147+
if err != nil {
148+
return nil, err
149+
}
150+
if !ok {
151+
break
152+
}
153+
ret = append(ret, kvs...)
154+
155+
ri.index = len(kvs)
156+
if ri.options.Reverse {
157+
ri.sr.End = FirstGreaterOrEqual(kvs[ri.index-1].Key)
158+
} else {
159+
ri.sr.Begin = FirstGreaterThan(kvs[ri.index-1].Key)
148160
}
149-
ret = append(ret, ri.kvs...)
150-
ri.index = len(ri.kvs)
151161
}
152162

153163
return ret, nil
@@ -195,37 +205,36 @@ type RangeIterator struct {
195205
iteration int
196206
done bool
197207
more bool
198-
kvs []KeyValue
199208
index int
200-
err error
201209
snapshot bool
202210
}
203211

204212
// Advance attempts to advance the iterator to the next key-value pair. Advance
205213
// returns true if there are more key-value pairs satisfying the range, or false
206214
// if the range has been exhausted. You must call this before every call to Get
207215
// or MustGet.
208-
func (ri *RangeIterator) Advance() bool {
216+
func (ri *RangeIterator) Advance() (bool, []KeyValue, error) {
209217
if ri.done {
210-
return false
218+
return false, nil, nil
211219
}
212220

213221
f := ri.fetchNextBatch()
214222
if f == nil {
215223
// iterator is done
216-
return false
224+
return false, nil, nil
217225
}
218226
defer f.Close()
219227

220-
ri.kvs, ri.more, ri.err = f.Get()
228+
var err error
229+
var kvs []KeyValue
230+
kvs, ri.more, err = f.Get()
221231
ri.index = 0
222232

223-
if ri.err != nil || len(ri.kvs) > 0 {
224-
// return true in case of error so that next Get() call will retrieve this error
225-
return true
233+
if err != nil || len(kvs) > 0 {
234+
return true, kvs, err
226235
}
227236

228-
return false
237+
return false, nil, nil
229238
}
230239

231240
func (ri *RangeIterator) fetchNextBatch() *futureKeyValueArray {
@@ -239,12 +248,6 @@ func (ri *RangeIterator) fetchNextBatch() *futureKeyValueArray {
239248
ri.options.Limit -= ri.index
240249
}
241250

242-
if ri.options.Reverse {
243-
ri.sr.End = FirstGreaterOrEqual(ri.kvs[ri.index-1].Key)
244-
} else {
245-
ri.sr.Begin = FirstGreaterThan(ri.kvs[ri.index-1].Key)
246-
}
247-
248251
ri.iteration++
249252

250253
f := ri.t.doGetRange(ri.sr, ri.options, ri.snapshot, ri.iteration)

0 commit comments

Comments
 (0)