@@ -142,12 +142,22 @@ func (rr RangeResult) GetSliceWithError() ([]KeyValue, error) {
142
142
ri .options .Mode = StreamingModeWantAll
143
143
}
144
144
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 )
148
160
}
149
- ret = append (ret , ri .kvs ... )
150
- ri .index = len (ri .kvs )
151
161
}
152
162
153
163
return ret , nil
@@ -195,37 +205,36 @@ type RangeIterator struct {
195
205
iteration int
196
206
done bool
197
207
more bool
198
- kvs []KeyValue
199
208
index int
200
- err error
201
209
snapshot bool
202
210
}
203
211
204
212
// Advance attempts to advance the iterator to the next key-value pair. Advance
205
213
// returns true if there are more key-value pairs satisfying the range, or false
206
214
// if the range has been exhausted. You must call this before every call to Get
207
215
// or MustGet.
208
- func (ri * RangeIterator ) Advance () bool {
216
+ func (ri * RangeIterator ) Advance () ( bool , [] KeyValue , error ) {
209
217
if ri .done {
210
- return false
218
+ return false , nil , nil
211
219
}
212
220
213
221
f := ri .fetchNextBatch ()
214
222
if f == nil {
215
223
// iterator is done
216
- return false
224
+ return false , nil , nil
217
225
}
218
226
defer f .Close ()
219
227
220
- ri .kvs , ri .more , ri .err = f .Get ()
228
+ var err error
229
+ var kvs []KeyValue
230
+ kvs , ri .more , err = f .Get ()
221
231
ri .index = 0
222
232
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
226
235
}
227
236
228
- return false
237
+ return false , nil , nil
229
238
}
230
239
231
240
func (ri * RangeIterator ) fetchNextBatch () * futureKeyValueArray {
@@ -239,12 +248,6 @@ func (ri *RangeIterator) fetchNextBatch() *futureKeyValueArray {
239
248
ri .options .Limit -= ri .index
240
249
}
241
250
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
-
248
251
ri .iteration ++
249
252
250
253
f := ri .t .doGetRange (ri .sr , ri .options , ri .snapshot , ri .iteration )
0 commit comments