Plugins: Fix support for adhoc filters with raw queries in InfluxDB (#101966)

Plugins: Fix support for adhoc filters with raw queries in InfluxDB

Fixes #101635.
This commit is contained in:
beejeebus
2025-03-17 12:07:33 -04:00
committed by GitHub
parent 83c3c01769
commit 3bdb2aa349
4 changed files with 176 additions and 5 deletions
+74
View File
@@ -1,11 +1,13 @@
package models
import (
"fmt"
"strings"
"testing"
"time"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/influxdata/influxql"
"github.com/stretchr/testify/require"
)
@@ -329,3 +331,75 @@ func TestRemoveRegexWrappers(t *testing.T) {
require.Equal(t, expected, result)
})
}
func TestRawQueryWithAdhocFilters(t *testing.T) {
noAdhocFilters := []*Tag{}
adhocFilter := &Tag{
Key: "lol",
Value: "sob",
}
cases := []struct {
Name string
RawQuery string
ExpectedQuery string
AdhocFilters []*Tag
}{
{
Name: "no filters",
RawQuery: `SELECT "gauge" FROM "a"."b" WHERE time >= 123456780 and time <= 123456789`,
ExpectedQuery: `SELECT "gauge" FROM "a"."b" WHERE time >= 123456780 and time <= 123456789`,
AdhocFilters: noAdhocFilters,
},
{
Name: "multi-byte chars, single filter",
RawQuery: `SELECT "gauge" as "世界" FROM "a"."b"`,
ExpectedQuery: `SELECT "gauge" as "世界" FROM "a"."b" WHERE "lol" = 'sob'`,
AdhocFilters: []*Tag{adhocFilter},
},
{
Name: "multi-byte chars, single filter, existing where condition",
RawQuery: `SELECT "gauge" as "世界" FROM "a"."b" WHERE time >= 123456780 AND time <= 123456789`,
ExpectedQuery: `SELECT "gauge" as "世界" FROM "a"."b" WHERE "lol" = 'sob' AND time >= 123456780 AND time <= 123456789`,
AdhocFilters: []*Tag{adhocFilter},
},
{
Name: "quoted where, single filter",
RawQuery: `SELECT "gauge" as "where is my thing" FROM "a"."b"`,
ExpectedQuery: `SELECT "gauge" as "where is my thing" FROM "a"."b" WHERE "lol" = 'sob'`,
AdhocFilters: []*Tag{adhocFilter},
},
{
Name: "quoted where, single filter, existing where condition",
RawQuery: `SELECT "gauge" as "where is my thing" FROM "a"."b" WHERE time >= 123456780 AND time <= 123456789`,
ExpectedQuery: `SELECT "gauge" as "where is my thing" FROM "a"."b" WHERE "lol" = 'sob' AND time >= 123456780 AND time <= 123456789`,
AdhocFilters: []*Tag{adhocFilter},
},
{
Name: "multiple filters",
RawQuery: `SELECT "gauge" FROM "a"."b"`,
ExpectedQuery: `SELECT "gauge" FROM "a"."b" WHERE "lol" = 'sob' AND "lol" = 'sob'`,
AdhocFilters: []*Tag{adhocFilter, adhocFilter},
},
{
Name: "multiple filters, existing where condition",
RawQuery: `SELECT "gauge" FROM "a"."b" WHERE time >= 123456780 AND time <= 123456789`,
ExpectedQuery: `SELECT "gauge" FROM "a"."b" WHERE "lol" = 'sob' AND "lol" = 'sob' AND time >= 123456780 AND time <= 123456789`,
AdhocFilters: []*Tag{adhocFilter, adhocFilter},
},
}
for _, c := range cases {
t.Run(fmt.Sprintf("raw query + adhoc filters: %s", c.Name), func(t *testing.T) {
query := &Query{
RawQuery: c.RawQuery,
UseRawQuery: true,
AdhocFilters: c.AdhocFilters,
}
actualQuery := query.getRawQueryWithAdhocFilters()
require.Equal(t, c.ExpectedQuery, actualQuery)
_, err := influxql.ParseStatement(actualQuery)
require.NoError(t, err)
})
}
}