68 lines
1.8 KiB
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)
|
|
}
|