mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			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
 | |
| }
 |