influxdb/query/iterator_mapper.go

68 lines
1.8 KiB
Go

package query
import (
"fmt"
"math"
"github.com/influxdata/influxql"
)
type IteratorMap interface {
Value(row *Row) interface{}
}
type FieldMap struct {
Index int
Type influxql.DataType
}
func (f FieldMap) Value(row *Row) interface{} {
v := castToType(row.Values[f.Index], f.Type)
if v == NullFloat {
// If the value is a null float, then convert it back to NaN
// so it is treated as a float for eval.
v = math.NaN()
}
return v
}
type TagMap string
func (s TagMap) Value(row *Row) interface{} { return row.Series.Tags.Value(string(s)) }
type NullMap struct{}
func (NullMap) Value(row *Row) interface{} { return nil }
func NewIteratorMapper(cur Cursor, driver IteratorMap, fields []IteratorMap, opt IteratorOptions) Iterator {
if driver != nil {
switch driver := driver.(type) {
case FieldMap:
switch driver.Type {
case influxql.Float:
return newFloatIteratorMapper(cur, driver, fields, opt)
case influxql.Integer:
return newIntegerIteratorMapper(cur, driver, fields, opt)
case influxql.Unsigned:
return newUnsignedIteratorMapper(cur, driver, fields, opt)
case influxql.String, influxql.Tag:
return newStringIteratorMapper(cur, driver, fields, opt)
case influxql.Boolean:
return newBooleanIteratorMapper(cur, driver, fields, opt)
default:
// The driver doesn't appear to to have a valid driver type.
// We should close the cursor and return a blank iterator.
// We close the cursor because we own it and have a responsibility
// to close it once it is passed into this function.
cur.Close()
return &nilFloatIterator{}
}
case TagMap:
return newStringIteratorMapper(cur, driver, fields, opt)
default:
panic(fmt.Sprintf("unable to create iterator mapper with driver expression type: %T", driver))
}
}
return newFloatIteratorMapper(cur, nil, fields, opt)
}