func (c *compaction) newIterator() iterator.Iterator { s := c.s 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, s.icmp, nil, ro), strict, true) its = append(its, it) } } return iterator.NewMergedIterator(its, s.icmp, true) }
// Creates an iterator. func (c *compaction) newIterator() iterator.Iterator { // Creates iterator slice. icap := len(c.tables) if c.level == 0 { // Special case for level-0 icap = len(c.tables[0]) + 1 } its := make([]iterator.Iterator, 0, icap) // Options. ro := &opt.ReadOptions{ DontFillCache: true, } strict := c.s.o.GetStrict(opt.StrictIterator) for i, tables := range c.tables { if len(tables) == 0 { continue } // Level-0 is not sorted and may overlaps each other. if c.level+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, true) its = append(its, it) } } return iterator.NewMergedIterator(its, c.s.icmp, true) }
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{ Flag: opt.RFDontFillCache, } if s.o.HasFlag(opt.OFParanoidCheck) { ro.Flag |= opt.RFVerifyChecksums } 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, ro)) } } else { it := iterator.NewIndexedIterator(tt.newIndexIterator(s.tops, icmp, ro)) its = append(its, it) } } return iterator.NewMergedIterator(its, icmp) }
// NewIterator returns an iterator of the table. // // The returned iterator is not goroutine-safe and should be released // when not used. // // Also read Iterator documentation of the leveldb/iterator package. func (r *Reader) NewIterator(ro *opt.ReadOptions) iterator.Iterator { if r.err != nil { return iterator.NewEmptyIterator(r.err) } index := &indexIter{ blockIter: *r.indexBlock.newIterator(nil), tableReader: r, checksum: ro.GetStrict(opt.StrictBlockChecksum), fillCache: !ro.GetDontFillCache(), } return iterator.NewIndexedIterator(index, r.strictIter || ro.GetStrict(opt.StrictIterator)) }
func (v *version) getIterators(slice *util.Range, ro *opt.ReadOptions) (its []iterator.Iterator) { strict := opt.GetStrict(v.s.o.Options, ro, opt.StrictReader) for level, tables := range v.levels { if level == 0 { // Merge all level zero files together since they may overlap. for _, t := range tables { its = append(its, v.s.tops.newIterator(t, slice, ro)) } } else if len(tables) != 0 { its = append(its, iterator.NewIndexedIterator(tables.newIndexIterator(v.s.tops, v.s.icmp, slice, ro), strict)) } } return }
// NewIterator creates an iterator from the table. // // Slice allows slicing the iterator to only contains keys in the given // range. A nil Range.Start is treated as a key before all keys in the // table. And a nil Range.Limit is treated as a key after all keys in // the table. // // The returned iterator is not goroutine-safe and should be released // when not used. // // Also read Iterator documentation of the leveldb/iterator package. func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { if r.err != nil { return iterator.NewEmptyIterator(r.err) } fillCache := !ro.GetDontFillCache() b, rel, err := r.readBlockCached(r.indexBH, true, fillCache) if err != nil { return iterator.NewEmptyIterator(err) } index := &indexIter{ blockIter: b.newIterator(slice, true, rel), 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) { // Merge all level zero files together since they may overlap for _, t := range v.tables[0] { it := v.s.tops.newIterator(t, slice, ro) its = append(its, it) } strict := v.s.o.GetStrict(opt.StrictIterator) || ro.GetStrict(opt.StrictIterator) for _, tables := range v.tables[1:] { if len(tables) == 0 { continue } it := iterator.NewIndexedIterator(tables.newIndexIterator(v.s.tops, v.s.icmp, slice, ro), strict, true) its = append(its, it) } return }
// NewIterator creates an iterator from the table. // // Slice allows slicing the iterator to only contains keys in the given // range. A nil Range.Start is treated as a key before all keys in the // table. And a nil Range.Limit is treated as a key after all keys in // the table. // // The returned iterator is not goroutine-safe and should be released // when not used. // // Also read Iterator documentation of the leveldb/iterator package. func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { r.mu.RLock() defer r.mu.RUnlock() if r.err != nil { return iterator.NewEmptyIterator(r.err) } fillCache := !ro.GetDontFillCache() indexBlock, rel, err := r.getIndexBlock(fillCache) if err != nil { return iterator.NewEmptyIterator(err) } index := &indexIter{ blockIter: r.newBlockIter(indexBlock, rel, slice, true), tr: r, slice: slice, fillCache: !ro.GetDontFillCache(), } return iterator.NewIndexedIterator(index, opt.GetStrict(r.o, ro, opt.StrictReader)) }
func (v *version) getIterators(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, ro) its = append(its, it) } for _, tt := range v.tables[1:] { if len(tt) == 0 { continue } it := iterator.NewIndexedIterator(tt.newIndexIterator(s.tops, icmp, ro)) its = append(its, it) } return }
// NewIterator creates an iterator from the table. // // Slice allows slicing the iterator to only contains keys in the given // range. A nil Range.Start is treated as a key before all keys in the // table. And a nil Range.Limit is treated as a key after all keys in // the table. // // The returned iterator is not goroutine-safe and should be released // when not used. // // Also read Iterator documentation of the leveldb/iterator package. func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { r.mu.RLock() defer r.mu.RUnlock() if r.err != nil { return iterator.NewEmptyIterator(r.err) } fillCache := !ro.GetDontFillCache() indexBlock, rel, err := r.getIndexBlock(fillCache) if err != nil { return iterator.NewEmptyIterator(err) } index := &indexIter{ blockIter: indexBlock.newIterator(slice, true, rel), slice: slice, checksum: ro.GetStrict(opt.StrictBlockChecksum), fillCache: !ro.GetDontFillCache(), } return iterator.NewIndexedIterator(index, r.strictIter || ro.GetStrict(opt.StrictIterator), true) }
// NewIterator create new iterator over the table. func (t *Reader) NewIterator(ro opt.ReadOptionsGetter) iterator.Iterator { index_iter := &indexIter{t: t, ro: ro} t.indexBlock.InitIterator(&index_iter.Iterator) return iterator.NewIndexedIterator(index_iter) }