// NewIterator creates a new Iterator for the given source and metric. func (db *DB) NewIterator(source, metric string) (*Iterator, error) { var p partition.Partition = nil i := db.partitionList.NewIterator() for i.Next() { val, _ := i.Value() val.Hold() if val.HasMetric(source, metric) { if p != nil { p.Release() } p = val } else { val.Release() } } if p == nil { return nil, errors.New("catena: couldn't find metric for iterator") } partitionIter, err := p.NewIterator(source, metric) p.Release() if err != nil { return nil, err } return &Iterator{ source: source, metric: metric, db: db, curPartition: p, Iterator: partitionIter, }, nil }
// Reset moves i to the first available timestamp. func (i *Iterator) Reset() error { i.Iterator.Close() var p partition.Partition partitionListIter := i.db.partitionList.NewIterator() for partitionListIter.Next() { val, _ := partitionListIter.Value() val.Hold() if val.HasMetric(i.source, i.metric) { if p != nil { p.Release() } p = val } else { val.Release() } } if p == nil { return errors.New("catena: couldn't find metric for iterator") } defer p.Release() i.curPartition = p partitionIter, err := p.NewIterator(i.source, i.metric) if err != nil { return err } i.Iterator = partitionIter return nil }