datasources: querier: handle reducer-settings-mode correctly (#94595)

* datasources: querier: handle reducer-settings-mode correctly

* Try to fix linting error

"unnecessary leading newline (whitespace)"

---------

Co-authored-by: Sam Jewell <sam.jewell@grafana.com>
This commit is contained in:
Gábor Farkas 2024-10-17 08:38:14 +02:00 committed by GitHub
parent 96893aef2a
commit 2cea7af2f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 145 additions and 0 deletions

View File

@ -74,6 +74,8 @@ func (h *ExpressionQueryReader) ReadQuery(
}
if err == nil && q.Settings != nil {
switch q.Settings.Mode {
case "":
mapper = nil
case ReduceModeDrop:
mapper = mathexp.DropNonNumber{}
case ReduceModeReplace:

143
pkg/expr/reader_test.go Normal file
View File

@ -0,0 +1,143 @@
package expr
import (
"encoding/json"
"testing"
"github.com/grafana/grafana-plugin-sdk-go/data/utils/jsoniter"
data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/stretchr/testify/require"
)
func TestReaderReduceMode(t *testing.T) {
testData := []struct {
name string
bytes []byte
expectedError string
}{
{
name: "no_settings",
bytes: []byte(`
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__"
},
"reducer": "last",
"expression": "A",
"window": "",
"type": "reduce"
}
`),
expectedError: "",
},
{
name: "mode_dropnn",
bytes: []byte(`
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__"
},
"reducer": "last",
"expression": "A",
"window": "",
"settings": {
"mode": "dropNN"
},
"type": "reduce"
}
`),
expectedError: "",
},
{
name: "mode_replacenn",
bytes: []byte(`
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__"
},
"reducer": "last",
"expression": "A",
"window": "",
"settings": {
"mode": "replaceNN",
"replaceWithValue": 42
},
"type": "reduce"
}
`),
expectedError: "",
},
{
name: "mode_strict",
bytes: []byte(`
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__"
},
"reducer": "last",
"expression": "A",
"window": "",
"settings": {
"mode": ""
},
"type": "reduce"
}
`),
expectedError: "",
},
{
name: "mode_invalid",
bytes: []byte(`
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__"
},
"reducer": "last",
"expression": "A",
"window": "",
"settings": {
"mode": "invalid-mode"
},
"type": "reduce"
}
`),
expectedError: "unsupported reduce mode",
},
}
for _, test := range testData {
t.Run("TestReduceReader:"+test.name, func(t *testing.T) {
var q data.DataQuery
err := json.Unmarshal(test.bytes, &q)
require.NoError(t, err)
raw, err := json.Marshal(q)
require.NoError(t, err)
iter, err := jsoniter.ParseBytes(jsoniter.ConfigDefault, raw)
require.NoError(t, err)
reader := NewExpressionQueryReader(featuremgmt.WithFeatures())
_, err = reader.ReadQuery(q, iter)
if test.expectedError == "" {
require.NoError(t, err)
} else {
require.ErrorContains(t, err, test.expectedError)
}
})
}
}