// Ensure auxilary iterators can be created for auxilary fields. func TestFloatAuxIterator(t *testing.T) { itr := influxql.NewAuxIterator( &FloatIterator{Points: []influxql.FloatPoint{ {Time: 0, Value: 1, Aux: []interface{}{float64(100), float64(200)}}, {Time: 1, Value: 2, Aux: []interface{}{float64(500), math.NaN()}}, }}, []influxql.Series{ {Aux: []influxql.DataType{influxql.Float, influxql.Float}}, }, influxql.IteratorOptions{Aux: []string{"f0", "f1"}}, ) itrs := []influxql.Iterator{ itr, itr.Iterator("f0"), itr.Iterator("f1"), itr.Iterator("f0"), } itr.Start() if a, err := Iterators(itrs).ReadAll(); err != nil { t.Fatalf("unexpected error: %s", err) } else if !deep.Equal(a, [][]influxql.Point{ { &influxql.FloatPoint{Time: 0, Value: 1, Aux: []interface{}{float64(100), float64(200)}}, &influxql.FloatPoint{Time: 0, Value: float64(100)}, &influxql.FloatPoint{Time: 0, Value: float64(200)}, &influxql.FloatPoint{Time: 0, Value: float64(100)}, }, { &influxql.FloatPoint{Time: 1, Value: 2, Aux: []interface{}{float64(500), math.NaN()}}, &influxql.FloatPoint{Time: 1, Value: float64(500)}, &influxql.FloatPoint{Time: 1, Value: math.NaN()}, &influxql.FloatPoint{Time: 1, Value: float64(500)}, }, }) { t.Fatalf("unexpected points: %s", spew.Sdump(a)) } }
func (e *StatementExecutor) createMeasurementsIterator(stmt *influxql.SelectStatement, index *tsdb.DatabaseIndex) ([]influxql.Iterator, error) { opt := influxql.IteratorOptions{ Condition: stmt.Condition, Aux: []influxql.VarRef{{Val: "name", Type: influxql.String}}, Limit: stmt.Limit, Offset: stmt.Offset, } var input influxql.Iterator input, err := tsdb.NewMeasurementIterator(index, opt) if err != nil { return nil, err } // Apply limit & offset. if opt.Limit > 0 || opt.Offset > 0 { input = influxql.NewLimitIterator(input, opt) } aitr := influxql.NewAuxIterator(input, opt) itr := aitr.Iterator("name", influxql.String) aitr.Background() return []influxql.Iterator{itr}, nil }