| 24 | } |
| 25 | |
| 26 | func newMergeIterator(it iterator, cs []GenericChunk) *mergeIterator { |
| 27 | css := partitionChunks(cs) |
| 28 | |
| 29 | var c *mergeIterator |
| 30 | |
| 31 | if mIterator, ok := it.(*mergeIterator); ok && cap(mIterator.its) >= len(css) { |
| 32 | c = mIterator.Reset(len(css)) |
| 33 | } else { |
| 34 | c = &mergeIterator{ |
| 35 | h: make(iteratorHeap, 0, len(css)), |
| 36 | batches: make(batchStream, 0, len(css)), |
| 37 | batchesBuf: make(batchStream, len(css)), |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | if cap(c.its) < len(css) { |
| 42 | c.its = make([]*nonOverlappingIterator, 0, len(css)) |
| 43 | } |
| 44 | |
| 45 | for _, cs := range css { |
| 46 | c.its = append(c.its, newNonOverlappingIterator(cs)) |
| 47 | } |
| 48 | |
| 49 | for _, iter := range c.its { |
| 50 | if iter.Next(1) != chunkenc.ValNone { |
| 51 | c.h = append(c.h, iter) |
| 52 | continue |
| 53 | } |
| 54 | |
| 55 | if err := iter.Err(); err != nil { |
| 56 | c.currErr = err |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | heap.Init(&c.h) |
| 61 | return c |
| 62 | } |
| 63 | |
| 64 | func (c *mergeIterator) Reset(size int) *mergeIterator { |
| 65 | c.its = c.its[:0] |