mirror of
https://github.com/grafana/grafana.git
synced 2024-11-28 19:54:10 -06:00
175 lines
4.7 KiB
Go
175 lines
4.7 KiB
Go
|
package expr
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"reflect"
|
||
|
"testing"
|
||
|
|
||
|
data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
|
||
|
"github.com/grafana/grafana-plugin-sdk-go/experimental/schemabuilder"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"github.com/grafana/grafana/pkg/expr/classic"
|
||
|
"github.com/grafana/grafana/pkg/expr/mathexp"
|
||
|
)
|
||
|
|
||
|
func TestQueryTypeDefinitions(t *testing.T) {
|
||
|
builder, err := schemabuilder.NewSchemaBuilder(
|
||
|
schemabuilder.BuilderOptions{
|
||
|
PluginID: []string{DatasourceType},
|
||
|
ScanCode: []schemabuilder.CodePaths{{
|
||
|
BasePackage: "github.com/grafana/grafana/pkg/expr",
|
||
|
CodePath: "./",
|
||
|
}},
|
||
|
Enums: []reflect.Type{
|
||
|
reflect.TypeOf(mathexp.ReducerSum), // pick an example value (not the root)
|
||
|
reflect.TypeOf(mathexp.UpsamplerPad), // pick an example value (not the root)
|
||
|
reflect.TypeOf(ReduceModeDrop), // pick an example value (not the root)
|
||
|
reflect.TypeOf(ThresholdIsAbove),
|
||
|
reflect.TypeOf(classic.ConditionOperatorAnd),
|
||
|
},
|
||
|
})
|
||
|
require.NoError(t, err)
|
||
|
err = builder.AddQueries(
|
||
|
schemabuilder.QueryTypeInfo{
|
||
|
Discriminators: data.NewDiscriminators("type", QueryTypeMath),
|
||
|
GoType: reflect.TypeOf(&MathQuery{}),
|
||
|
Examples: []data.QueryExample{
|
||
|
{
|
||
|
Name: "constant addition",
|
||
|
SaveModel: data.AsUnstructured(MathQuery{
|
||
|
Expression: "$A + 10",
|
||
|
}),
|
||
|
},
|
||
|
{
|
||
|
Name: "math with two queries",
|
||
|
SaveModel: data.AsUnstructured(MathQuery{
|
||
|
Expression: "$A - $B",
|
||
|
}),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
schemabuilder.QueryTypeInfo{
|
||
|
Discriminators: data.NewDiscriminators("type", QueryTypeReduce),
|
||
|
GoType: reflect.TypeOf(&ReduceQuery{}),
|
||
|
Examples: []data.QueryExample{
|
||
|
{
|
||
|
Name: "get max value",
|
||
|
SaveModel: data.AsUnstructured(ReduceQuery{
|
||
|
Expression: "$A",
|
||
|
Reducer: mathexp.ReducerMax,
|
||
|
Settings: &ReduceSettings{
|
||
|
Mode: ReduceModeDrop,
|
||
|
},
|
||
|
}),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
schemabuilder.QueryTypeInfo{
|
||
|
Discriminators: data.NewDiscriminators("type", QueryTypeResample),
|
||
|
GoType: reflect.TypeOf(&ResampleQuery{}),
|
||
|
Examples: []data.QueryExample{
|
||
|
{
|
||
|
Name: "resample at a every day",
|
||
|
SaveModel: data.AsUnstructured(ResampleQuery{
|
||
|
Expression: "$A",
|
||
|
Window: "1d",
|
||
|
Downsampler: mathexp.ReducerLast,
|
||
|
Upsampler: mathexp.UpsamplerPad,
|
||
|
}),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
schemabuilder.QueryTypeInfo{
|
||
|
Discriminators: data.NewDiscriminators("type", QueryTypeSQL),
|
||
|
GoType: reflect.TypeOf(&SQLExpression{}),
|
||
|
Examples: []data.QueryExample{
|
||
|
{
|
||
|
Name: "Select the first row from A",
|
||
|
SaveModel: data.AsUnstructured(SQLExpression{
|
||
|
Expression: "SELECT * FROM A limit 1",
|
||
|
}),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
schemabuilder.QueryTypeInfo{
|
||
|
Discriminators: data.NewDiscriminators("type", QueryTypeClassic),
|
||
|
GoType: reflect.TypeOf(&ClassicQuery{}),
|
||
|
Examples: []data.QueryExample{
|
||
|
{
|
||
|
Name: "Where query A > 5",
|
||
|
SaveModel: data.AsUnstructured(ClassicQuery{
|
||
|
Conditions: []classic.ConditionJSON{
|
||
|
{
|
||
|
Query: classic.ConditionQueryJSON{
|
||
|
Params: []string{"A"},
|
||
|
},
|
||
|
Reducer: classic.ConditionReducerJSON{
|
||
|
Type: "max",
|
||
|
},
|
||
|
Operator: classic.ConditionOperatorJSON{
|
||
|
Type: "and",
|
||
|
},
|
||
|
Evaluator: classic.ConditionEvalJSON{
|
||
|
Type: "gt",
|
||
|
Params: []float64{5},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
schemabuilder.QueryTypeInfo{
|
||
|
Discriminators: data.NewDiscriminators("type", QueryTypeThreshold),
|
||
|
GoType: reflect.TypeOf(&ThresholdQuery{}),
|
||
|
Examples: []data.QueryExample{
|
||
|
{
|
||
|
Name: "Where query A > 5",
|
||
|
SaveModel: data.AsUnstructured(ThresholdQuery{
|
||
|
Expression: "A",
|
||
|
Conditions: []ThresholdConditionJSON{{
|
||
|
Evaluator: ConditionEvalJSON{
|
||
|
Type: ThresholdIsAbove,
|
||
|
Params: []float64{5},
|
||
|
},
|
||
|
}},
|
||
|
}),
|
||
|
},
|
||
|
{
|
||
|
Name: "With loaded+unloaded evaluators",
|
||
|
SaveModel: toUnstructured(`{
|
||
|
"expression": "B",
|
||
|
"conditions": [
|
||
|
{
|
||
|
"evaluator": {
|
||
|
"params": [
|
||
|
100
|
||
|
],
|
||
|
"type": "gt"
|
||
|
},
|
||
|
"unloadEvaluator": {
|
||
|
"params": [
|
||
|
31
|
||
|
],
|
||
|
"type": "lt"
|
||
|
},
|
||
|
"loadedDimensions": {"schema":{"name":"test","meta":{"type":"fingerprints","typeVersion":[1,0]},"fields":[{"name":"fingerprints","type":"number","typeInfo":{"frame":"uint64"}}]},"data":{"values":[[18446744073709551615,2,3,4,5]]}}
|
||
|
}
|
||
|
]
|
||
|
}`),
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
)
|
||
|
|
||
|
require.NoError(t, err)
|
||
|
_ = builder.UpdateQueryDefinition(t, "./")
|
||
|
}
|
||
|
|
||
|
func toUnstructured(ex string) data.Unstructured {
|
||
|
v := data.Unstructured{}
|
||
|
_ = json.Unmarshal([]byte(ex), &v.Object)
|
||
|
return v
|
||
|
}
|