func (c *compaction) newIterator() iterator.Iterator { s := c.s icmp := s.cmp level := c.level icap := 2 if c.level == 0 { icap = len(c.tables[0]) + 1 } its := make([]iterator.Iterator, 0, icap) ro := &opt.ReadOptions{ DontFillCache: true, } strict := s.o.GetStrict(opt.StrictIterator) for i, tt := range c.tables { if len(tt) == 0 { continue } if level+i == 0 { for _, t := range tt { its = append(its, s.tops.newIterator(t, nil, ro)) } } else { it := iterator.NewIndexedIterator(tt.newIndexIterator(s.tops, icmp, nil, ro), strict, true) its = append(its, it) } } return iterator.NewMergedIterator(its, icmp, true) }
func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { if r.err != nil { return iterator.NewEmptyIterator(r.err) } index := &indexIter{ blockIter: *r.indexBlock.newIterator(slice, true, nil), tableReader: r, slice: slice, checksum: ro.GetStrict(opt.StrictBlockChecksum), fillCache: !ro.GetDontFillCache(), } return iterator.NewIndexedIterator(index, r.strictIter || ro.GetStrict(opt.StrictIterator), false) }
func (v *version) getIterators(slice *util.Range, ro *opt.ReadOptions) (its []iterator.Iterator) { s := v.s icmp := s.cmp // Merge all level zero files together since they may overlap for _, t := range v.tables[0] { it := s.tops.newIterator(t, slice, ro) its = append(its, it) } strict := s.o.GetStrict(opt.StrictIterator) || ro.GetStrict(opt.StrictIterator) for _, tt := range v.tables[1:] { if len(tt) == 0 { continue } it := iterator.NewIndexedIterator(tt.newIndexIterator(s.tops, icmp, slice, ro), strict, true) its = append(its, it) } return }