github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/querier/batch/non_overlapping.go (about)

     1  package batch
     2  
     3  import (
     4  	promchunk "github.com/cortexproject/cortex/pkg/chunk/encoding"
     5  )
     6  
     7  type nonOverlappingIterator struct {
     8  	curr   int
     9  	chunks []GenericChunk
    10  	iter   chunkIterator
    11  }
    12  
    13  // newNonOverlappingIterator returns a single iterator over an slice of sorted,
    14  // non-overlapping iterators.
    15  func newNonOverlappingIterator(chunks []GenericChunk) *nonOverlappingIterator {
    16  	it := &nonOverlappingIterator{
    17  		chunks: chunks,
    18  	}
    19  	it.iter.reset(it.chunks[0])
    20  	return it
    21  }
    22  
    23  func (it *nonOverlappingIterator) Seek(t int64, size int) bool {
    24  	for {
    25  		if it.iter.Seek(t, size) {
    26  			return true
    27  		} else if it.iter.Err() != nil {
    28  			return false
    29  		} else if !it.next() {
    30  			return false
    31  		}
    32  	}
    33  }
    34  
    35  func (it *nonOverlappingIterator) Next(size int) bool {
    36  	for {
    37  		if it.iter.Next(size) {
    38  			return true
    39  		} else if it.iter.Err() != nil {
    40  			return false
    41  		} else if !it.next() {
    42  			return false
    43  		}
    44  	}
    45  }
    46  
    47  func (it *nonOverlappingIterator) next() bool {
    48  	it.curr++
    49  	if it.curr < len(it.chunks) {
    50  		it.iter.reset(it.chunks[it.curr])
    51  	}
    52  	return it.curr < len(it.chunks)
    53  }
    54  
    55  func (it *nonOverlappingIterator) AtTime() int64 {
    56  	return it.iter.AtTime()
    57  }
    58  
    59  func (it *nonOverlappingIterator) Batch() promchunk.Batch {
    60  	return it.iter.Batch()
    61  }
    62  
    63  func (it *nonOverlappingIterator) Err() error {
    64  	if it.curr < len(it.chunks) {
    65  		return it.iter.Err()
    66  	}
    67  	return nil
    68  }