mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
InfluxDB: Flux: handle boolean data-columns (#34479)
* InfluxDB: Flux: handle boolean data-columns * normalize data-type strings based on documentation * reference missing data type
This commit is contained in:
parent
adbe383456
commit
ab26c4dfa4
@ -9,18 +9,18 @@ import (
|
|||||||
"github.com/influxdata/influxdb-client-go/v2/api/query"
|
"github.com/influxdata/influxdb-client-go/v2/api/query"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Copied from: (Apache 2 license)
|
// based on https://docs.influxdata.com/influxdb/v2.0/reference/syntax/annotated-csv/#data-types
|
||||||
// https://github.com/influxdata/influxdb-client-go/blob/master/query.go#L30
|
|
||||||
const (
|
const (
|
||||||
stringDatatype = "string"
|
stringDatatype = "string"
|
||||||
doubleDatatype = "double"
|
doubleDatatype = "double"
|
||||||
boolDatatype = "bool"
|
booleanDatatype = "boolean"
|
||||||
longDatatype = "long"
|
longDatatype = "long"
|
||||||
uLongDatatype = "unsignedLong"
|
unsignedLongDatatype = "unsignedLong"
|
||||||
durationDatatype = "duration"
|
durationDatatype = "duration"
|
||||||
base64BinaryDataType = "base64Binary"
|
base64BinaryDataType = "base64Binary"
|
||||||
timeDatatypeRFC = "dateTime:RFC3339"
|
datetimeRFC339DataType = "dateTime:RFC3339"
|
||||||
timeDatatypeRFCNano = "dateTime:RFC3339Nano"
|
datetimeRFC339DataTypeNano = "dateTime:RFC3339Nano"
|
||||||
|
// based on the documentation there should also be "dateTime:number" but i have never seen it yet.
|
||||||
)
|
)
|
||||||
|
|
||||||
type columnInfo struct {
|
type columnInfo struct {
|
||||||
@ -92,19 +92,19 @@ func getConverter(t string) (*data.FieldConverter, error) {
|
|||||||
switch t {
|
switch t {
|
||||||
case stringDatatype:
|
case stringDatatype:
|
||||||
return &converters.AnyToNullableString, nil
|
return &converters.AnyToNullableString, nil
|
||||||
case timeDatatypeRFC:
|
case datetimeRFC339DataType:
|
||||||
return &timeToOptionalTime, nil
|
return &timeToOptionalTime, nil
|
||||||
case timeDatatypeRFCNano:
|
case datetimeRFC339DataTypeNano:
|
||||||
return &timeToOptionalTime, nil
|
return &timeToOptionalTime, nil
|
||||||
case durationDatatype:
|
case durationDatatype:
|
||||||
return &converters.Int64ToNullableInt64, nil
|
return &converters.Int64ToNullableInt64, nil
|
||||||
case doubleDatatype:
|
case doubleDatatype:
|
||||||
return &converters.Float64ToNullableFloat64, nil
|
return &converters.Float64ToNullableFloat64, nil
|
||||||
case boolDatatype:
|
case booleanDatatype:
|
||||||
return &converters.BoolToNullableBool, nil
|
return &converters.BoolToNullableBool, nil
|
||||||
case longDatatype:
|
case longDatatype:
|
||||||
return &converters.Int64ToNullableInt64, nil
|
return &converters.Int64ToNullableInt64, nil
|
||||||
case uLongDatatype:
|
case unsignedLongDatatype:
|
||||||
return &converters.Uint64ToNullableUInt64, nil
|
return &converters.Uint64ToNullableUInt64, nil
|
||||||
case base64BinaryDataType:
|
case base64BinaryDataType:
|
||||||
return &converters.AnyToNullableString, nil
|
return &converters.AnyToNullableString, nil
|
||||||
@ -125,7 +125,7 @@ func getGroupColumnNames(cols []*query.FluxColumn) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isTimestampType(dataType string) bool {
|
func isTimestampType(dataType string) bool {
|
||||||
return (dataType == timeDatatypeRFC) || (dataType == timeDatatypeRFCNano)
|
return (dataType == datetimeRFC339DataType) || (dataType == datetimeRFC339DataTypeNano)
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasUsualStartStop(dataCols []*query.FluxColumn) bool {
|
func hasUsualStartStop(dataCols []*query.FluxColumn) bool {
|
||||||
|
@ -204,8 +204,12 @@ func TestBuckets(t *testing.T) {
|
|||||||
verifyGoldenResponse(t, "buckets")
|
verifyGoldenResponse(t, "buckets")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBooleanGrouping(t *testing.T) {
|
func TestBooleanTagGrouping(t *testing.T) {
|
||||||
verifyGoldenResponse(t, "boolean")
|
verifyGoldenResponse(t, "boolean_tag")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBooleanData(t *testing.T) {
|
||||||
|
verifyGoldenResponse(t, "boolean_data")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGoldenFiles(t *testing.T) {
|
func TestGoldenFiles(t *testing.T) {
|
||||||
|
9
pkg/tsdb/influxdb/flux/testdata/boolean_data.csv
vendored
Normal file
9
pkg/tsdb/influxdb/flux/testdata/boolean_data.csv
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#group,false,false,true,true,false,false,true,true,true
|
||||||
|
#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,boolean,string,string,string
|
||||||
|
#default,_result,,,,,,,,
|
||||||
|
,result,table,_start,_stop,_time,_value,_field,_measurement,direction
|
||||||
|
,,0,2021-05-20T08:36:26.7Z,2021-05-20T09:36:26.7Z,2021-05-20T09:35:39.6Z,true,exitcode,x,left
|
||||||
|
,,0,2021-05-20T08:36:26.7Z,2021-05-20T09:36:26.7Z,2021-05-20T09:35:43.0Z,false,exitcode,x,left
|
||||||
|
,,1,2021-05-20T08:36:26.7Z,2021-05-20T09:36:26.7Z,2021-05-20T09:35:47.3Z,false,exitcode,x,right
|
||||||
|
,,1,2021-05-20T08:36:26.7Z,2021-05-20T09:36:26.7Z,2021-05-20T09:35:49.6Z,true,exitcode,x,right
|
||||||
|
|
|
32
pkg/tsdb/influxdb/flux/testdata/boolean_data.golden.txt
vendored
Normal file
32
pkg/tsdb/influxdb/flux/testdata/boolean_data.golden.txt
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0] {}
|
||||||
|
Name: x
|
||||||
|
Dimensions: 2 Fields by 2 Rows
|
||||||
|
+---------------------------------+------------------------+
|
||||||
|
| Name: _time | Name: exitcode |
|
||||||
|
| Labels: | Labels: direction=left |
|
||||||
|
| Type: []*time.Time | Type: []*bool |
|
||||||
|
+---------------------------------+------------------------+
|
||||||
|
| 2021-05-20 09:35:39.6 +0000 UTC | true |
|
||||||
|
| 2021-05-20 09:35:43 +0000 UTC | false |
|
||||||
|
+---------------------------------+------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frame[1]
|
||||||
|
Name: x
|
||||||
|
Dimensions: 2 Fields by 2 Rows
|
||||||
|
+---------------------------------+-------------------------+
|
||||||
|
| Name: _time | Name: exitcode |
|
||||||
|
| Labels: | Labels: direction=right |
|
||||||
|
| Type: []*time.Time | Type: []*bool |
|
||||||
|
+---------------------------------+-------------------------+
|
||||||
|
| 2021-05-20 09:35:47.3 +0000 UTC | false |
|
||||||
|
| 2021-05-20 09:35:49.6 +0000 UTC | true |
|
||||||
|
+---------------------------------+-------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////yAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEDAAoADAAAAAgABAAKAAAACAAAAHQAAAADAAAATAAAACgAAAAEAAAAyP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADo/v//CAAAAAwAAAABAAAAeAAAAAQAAABuYW1lAAAAAAj///8IAAAADAAAAAIAAAB7fQAABAAAAG1ldGEAAAAAAgAAALQAAAAEAAAAZv///xQAAAB4AAAAfAAAAAAABgF4AAAAAgAAADAAAAAEAAAAWP///wgAAAAUAAAACAAAAGV4aXRjb2RlAAAAAAQAAABuYW1lAAAAAID///8IAAAAIAAAABQAAAB7ImRpcmVjdGlvbiI6ImxlZnQifQAAAAAGAAAAbGFiZWxzAAAAAAAABAAEAAQAAAAIAAAAZXhpdGNvZGUAABIAGAAUABMAEgAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAoBTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAX3RpbWUAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAUAAABfdGltZQAAAP////+4AAAAFAAAAAAAAAAMABYAFAATAAwABAAMAAAAGAAAAAAAAAAUAAAAAAAAAwMACgAYAAwACAAEAAoAAAAUAAAAWAAAAAIAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAgAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAC09z6yvIAWAJafCbO8gBYBAAAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAADAAEAAADYAQAAAAAAAMAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAHQAAAADAAAATAAAACgAAAAEAAAAyP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADo/v//CAAAAAwAAAABAAAAeAAAAAQAAABuYW1lAAAAAAj///8IAAAADAAAAAIAAAB7fQAABAAAAG1ldGEAAAAAAgAAALQAAAAEAAAAZv///xQAAAB4AAAAfAAAAAAABgF4AAAAAgAAADAAAAAEAAAAWP///wgAAAAUAAAACAAAAGV4aXRjb2RlAAAAAAQAAABuYW1lAAAAAID///8IAAAAIAAAABQAAAB7ImRpcmVjdGlvbiI6ImxlZnQifQAAAAAGAAAAbGFiZWxzAAAAAAAABAAEAAQAAAAIAAAAZXhpdGNvZGUAABIAGAAUABMAEgAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAoBTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAX3RpbWUAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAUAAABfdGltZQAAAPgBAABBUlJPVzE=
|
||||||
|
FRAME=QVJST1cxAAD/////qAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEDAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAADo/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAAj///8IAAAADAAAAAEAAAB4AAAABAAAAG5hbWUAAAAAAgAAALQAAAAEAAAAZv///xQAAAB4AAAAfAAAAAAABgF4AAAAAgAAADAAAAAEAAAAWP///wgAAAAUAAAACAAAAGV4aXRjb2RlAAAAAAQAAABuYW1lAAAAAID///8IAAAAIAAAABUAAAB7ImRpcmVjdGlvbiI6InJpZ2h0In0AAAAGAAAAbGFiZWxzAAAAAAAABAAEAAQAAAAIAAAAZXhpdGNvZGUAABIAGAAUABMAEgAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAoBTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAX3RpbWUAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAUAAABfdGltZQAAAAAAAAD/////uAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAABgAAAAAAAAAFAAAAAAAAAMDAAoAGAAMAAgABAAKAAAAFAAAAFgAAAACAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAIAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAYewJtLyAFgCYA5O0vIAWAgAAAAAAAAAQAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAOAAAAAAAAwABAAAAuAEAAAAAAADAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAADo/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAAj///8IAAAADAAAAAEAAAB4AAAABAAAAG5hbWUAAAAAAgAAALQAAAAEAAAAZv///xQAAAB4AAAAfAAAAAAABgF4AAAAAgAAADAAAAAEAAAAWP///wgAAAAUAAAACAAAAGV4aXRjb2RlAAAAAAQAAABuYW1lAAAAAID///8IAAAAIAAAABUAAAB7ImRpcmVjdGlvbiI6InJpZ2h0In0AAAAGAAAAbGFiZWxzAAAAAAAABAAEAAQAAAAIAAAAZXhpdGNvZGUAABIAGAAUABMAEgAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAoBTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAX3RpbWUAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAUAAABfdGltZQAAANABAABBUlJPVzE=
|
Loading…
Reference in New Issue
Block a user