MCPcopy Create free account
hub / github.com/couchbase/moss / SeekTo

Method SeekTo

iterator.go:303–349  ·  view source on GitHub ↗
(seekToKey []byte)

Source from the content-addressed store, hash-verified

301}
302
303func (iter *iterator) SeekTo(seekToKey []byte) error {
304 key, _, err := iter.Current()
305 if err != nil && err != ErrIteratorDone {
306 return err
307 }
308
309 if key != nil {
310 cmp := bytes.Compare(seekToKey, key)
311 if cmp == 0 {
312 return nil
313 }
314
315 if cmp > 0 {
316 // Try a loop of naive Next()'s for several attempts.
317 err = naiveSeekTo(iter, seekToKey, DefaultNaiveSeekToMaxTries)
318 if err != ErrMaxTries {
319 return err
320 }
321 }
322 }
323
324 // The seekToKey is before our current position, or we gave up on
325 // the naiveSeekTo(), so start a brand new iterator to replace our
326 // current iterator, bounded by the startKeyInclusive.
327 //
328 if bytes.Compare(seekToKey, iter.startKeyInclusive) < 0 {
329 seekToKey = iter.startKeyInclusive
330 }
331
332 iterNew, err := iter.ss.startIterator(seekToKey,
333 iter.endKeyExclusive, iter.iteratorOptions)
334 if err != nil {
335 return err
336 }
337
338 iterOld := *iter // Clone current iterator before overwriting it.
339 iterOld.closer = nil
340
341 iter.cursors = iterNew.cursors
342 iter.lowerLevelIter = iterNew.lowerLevelIter
343
344 iterOld.Close()
345
346 _, _, err = iter.Current()
347
348 return err
349}
350
351func naiveSeekTo(iter Iterator, seekToKey []byte, maxTries int) error {
352 for i := 0; maxTries <= 0 || i < maxTries; i++ {

Callers

nothing calls this directly

Calls 4

CurrentMethod · 0.95
naiveSeekToFunction · 0.85
startIteratorMethod · 0.80
CloseMethod · 0.65

Tested by

no test coverage detected