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
							 | 
						||
| 
								 | 
							
								}
							 |