// createVarRefIterator creates an iterator for a variable reference. func (e *Engine) createVarRefIterator(opt influxql.IteratorOptions) ([]influxql.Iterator, error) { ref, _ := opt.Expr.(*influxql.VarRef) var itrs []influxql.Iterator if err := func() error { mms := tsdb.Measurements(e.index.MeasurementsByName(influxql.Sources(opt.Sources).Names())) // Retrieve the maximum number of fields (without time). conditionFields := make([]string, len(influxql.ExprNames(opt.Condition))) for _, mm := range mms { // Determine tagsets for this measurement based on dimensions and filters. tagSets, err := mm.TagSets(opt.Dimensions, opt.Condition) if err != nil { return err } // Calculate tag sets and apply SLIMIT/SOFFSET. tagSets = influxql.LimitTagSets(tagSets, opt.SLimit, opt.SOffset) for _, t := range tagSets { for i, seriesKey := range t.SeriesKeys { fields := 0 if t.Filters[i] != nil { // Retrieve non-time fields from this series filter and filter out tags. for _, f := range influxql.ExprNames(t.Filters[i]) { if mm.HasField(f) { conditionFields[fields] = f fields++ } } } itr, err := e.createVarRefSeriesIterator(ref, mm, seriesKey, t, t.Filters[i], conditionFields[:fields], opt) if err != nil { return err } else if itr == nil { continue } itrs = append(itrs, itr) } } } return nil }(); err != nil { influxql.Iterators(itrs).Close() return nil, err } return itrs, nil }
// createTagSetGroupIterators creates a set of iterators for a subset of a tagset's series. func (e *Engine) createTagSetGroupIterators(ref *influxql.VarRef, mm *tsdb.Measurement, seriesKeys []string, t *influxql.TagSet, filters []influxql.Expr, opt influxql.IteratorOptions) ([]influxql.Iterator, error) { conditionFields := make([]influxql.VarRef, len(influxql.ExprNames(opt.Condition))) itrs := make([]influxql.Iterator, 0, len(seriesKeys)) for i, seriesKey := range seriesKeys { fields := 0 if filters[i] != nil { // Retrieve non-time fields from this series filter and filter out tags. for _, f := range influxql.ExprNames(filters[i]) { conditionFields[fields] = f fields++ } } itr, err := e.createVarRefSeriesIterator(ref, mm, seriesKey, t, filters[i], conditionFields[:fields], opt) if err != nil { return itrs, err } else if itr == nil { continue } itrs = append(itrs, itr) } return itrs, nil }