func (db *DB) newRawIterator(auxm *memDB, auxt tFiles, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { strict := opt.GetStrict(db.s.o.Options, ro, opt.StrictReader) em, fm := db.getMems() v := db.s.version() tableIts := v.getIterators(slice, ro) n := len(tableIts) + len(auxt) + 3 its := make([]iterator.Iterator, 0, n) if auxm != nil { ami := auxm.NewIterator(slice) ami.SetReleaser(&memdbReleaser{m: auxm}) its = append(its, ami) } for _, t := range auxt { its = append(its, v.s.tops.newIterator(t, slice, ro)) } emi := em.NewIterator(slice) emi.SetReleaser(&memdbReleaser{m: em}) its = append(its, emi) if fm != nil { fmi := fm.NewIterator(slice) fmi.SetReleaser(&memdbReleaser{m: fm}) its = append(its, fmi) } its = append(its, tableIts...) mi := iterator.NewMergedIterator(its, db.s.icmp, strict) mi.SetReleaser(&versionReleaser{v: v}) return mi }
// Creates an iterator. func (c *compaction) newIterator() iterator.Iterator { // Creates iterator slice. icap := len(c.levels) if c.sourceLevel == 0 { // Special case for level-0. icap = len(c.levels[0]) + 1 } its := make([]iterator.Iterator, 0, icap) // Options. ro := &opt.ReadOptions{ DontFillCache: true, Strict: opt.StrictOverride, } strict := c.s.o.GetStrict(opt.StrictCompaction) if strict { ro.Strict |= opt.StrictReader } for i, tables := range c.levels { if len(tables) == 0 { continue } // Level-0 is not sorted and may overlaps each other. if c.sourceLevel+i == 0 { for _, t := range tables { its = append(its, c.s.tops.newIterator(t, nil, ro)) } } else { it := iterator.NewIndexedIterator(tables.newIndexIterator(c.s.tops, c.s.icmp, nil, ro), strict) its = append(its, it) } } return iterator.NewMergedIterator(its, c.s.icmp, strict) }