89 lines
1.6 KiB
Go
89 lines
1.6 KiB
Go
package query
|
|
|
|
import "github.com/influxdata/influxql"
|
|
|
|
// castToType will coerce the underlying interface type to another
|
|
// interface depending on the type.
|
|
func castToType(v interface{}, typ influxql.DataType) interface{} {
|
|
switch typ {
|
|
case influxql.Float:
|
|
if val, ok := castToFloat(v); ok {
|
|
v = val
|
|
}
|
|
case influxql.Integer:
|
|
if val, ok := castToInteger(v); ok {
|
|
v = val
|
|
}
|
|
case influxql.Unsigned:
|
|
if val, ok := castToUnsigned(v); ok {
|
|
v = val
|
|
}
|
|
case influxql.String, influxql.Tag:
|
|
if val, ok := castToString(v); ok {
|
|
v = val
|
|
}
|
|
case influxql.Boolean:
|
|
if val, ok := castToBoolean(v); ok {
|
|
v = val
|
|
}
|
|
}
|
|
return v
|
|
}
|
|
|
|
func castToFloat(v interface{}) (float64, bool) {
|
|
switch v := v.(type) {
|
|
case float64:
|
|
return v, true
|
|
case int64:
|
|
return float64(v), true
|
|
case uint64:
|
|
return float64(v), true
|
|
default:
|
|
return float64(0), false
|
|
}
|
|
}
|
|
|
|
func castToInteger(v interface{}) (int64, bool) {
|
|
switch v := v.(type) {
|
|
case float64:
|
|
return int64(v), true
|
|
case int64:
|
|
return v, true
|
|
case uint64:
|
|
return int64(v), true
|
|
default:
|
|
return int64(0), false
|
|
}
|
|
}
|
|
|
|
func castToUnsigned(v interface{}) (uint64, bool) {
|
|
switch v := v.(type) {
|
|
case float64:
|
|
return uint64(v), true
|
|
case uint64:
|
|
return v, true
|
|
case int64:
|
|
return uint64(v), true
|
|
default:
|
|
return uint64(0), false
|
|
}
|
|
}
|
|
|
|
func castToString(v interface{}) (string, bool) {
|
|
switch v := v.(type) {
|
|
case string:
|
|
return v, true
|
|
default:
|
|
return "", false
|
|
}
|
|
}
|
|
|
|
func castToBoolean(v interface{}) (bool, bool) {
|
|
switch v := v.(type) {
|
|
case bool:
|
|
return v, true
|
|
default:
|
|
return false, false
|
|
}
|
|
}
|