Skip to content

Commit e33d187

Browse files
authored
Merge pull request grafana#12287 from bergquist/fix_12286
Influxdb: add mode functions
2 parents f0254c2 + c63533f commit e33d187

File tree

2 files changed

+33
-78
lines changed

2 files changed

+33
-78
lines changed

pkg/tsdb/influxdb/query_part.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func init() {
3131
renders["mean"] = QueryDefinition{Renderer: functionRenderer}
3232
renders["median"] = QueryDefinition{Renderer: functionRenderer}
3333
renders["sum"] = QueryDefinition{Renderer: functionRenderer}
34+
renders["mode"] = QueryDefinition{Renderer: functionRenderer}
3435

3536
renders["holt_winters"] = QueryDefinition{
3637
Renderer: functionRenderer,

pkg/tsdb/influxdb/query_part_test.go

Lines changed: 32 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -4,85 +4,39 @@ import (
44
"testing"
55

66
"github.com/grafana/grafana/pkg/tsdb"
7-
. "github.com/smartystreets/goconvey/convey"
87
)
98

109
func TestInfluxdbQueryPart(t *testing.T) {
11-
Convey("Influxdb query parts", t, func() {
12-
13-
queryContext := &tsdb.TsdbQuery{TimeRange: tsdb.NewTimeRange("5m", "now")}
14-
query := &Query{}
15-
16-
Convey("render field ", func() {
17-
part, err := NewQueryPart("field", []string{"value"})
18-
So(err, ShouldBeNil)
19-
20-
res := part.Render(query, queryContext, "value")
21-
So(res, ShouldEqual, `"value"`)
22-
})
23-
24-
Convey("render nested part", func() {
25-
part, err := NewQueryPart("derivative", []string{"10s"})
26-
So(err, ShouldBeNil)
27-
28-
res := part.Render(query, queryContext, "mean(value)")
29-
So(res, ShouldEqual, "derivative(mean(value), 10s)")
30-
})
31-
32-
Convey("render bottom", func() {
33-
part, err := NewQueryPart("bottom", []string{"3"})
34-
So(err, ShouldBeNil)
35-
36-
res := part.Render(query, queryContext, "value")
37-
So(res, ShouldEqual, "bottom(value, 3)")
38-
})
39-
40-
Convey("render time with $interval", func() {
41-
part, err := NewQueryPart("time", []string{"$interval"})
42-
So(err, ShouldBeNil)
43-
44-
res := part.Render(query, queryContext, "")
45-
So(res, ShouldEqual, "time($interval)")
46-
})
47-
48-
Convey("render time with auto", func() {
49-
part, err := NewQueryPart("time", []string{"auto"})
50-
So(err, ShouldBeNil)
51-
52-
res := part.Render(query, queryContext, "")
53-
So(res, ShouldEqual, "time($__interval)")
54-
})
55-
56-
Convey("render spread", func() {
57-
part, err := NewQueryPart("spread", []string{})
58-
So(err, ShouldBeNil)
59-
60-
res := part.Render(query, queryContext, "value")
61-
So(res, ShouldEqual, `spread(value)`)
62-
})
63-
64-
Convey("render suffix", func() {
65-
part, err := NewQueryPart("math", []string{"/ 100"})
66-
So(err, ShouldBeNil)
67-
68-
res := part.Render(query, queryContext, "mean(value)")
69-
So(res, ShouldEqual, "mean(value) / 100")
70-
})
71-
72-
Convey("render alias", func() {
73-
part, err := NewQueryPart("alias", []string{"test"})
74-
So(err, ShouldBeNil)
75-
76-
res := part.Render(query, queryContext, "mean(value)")
77-
So(res, ShouldEqual, `mean(value) AS "test"`)
78-
})
79-
80-
Convey("render count distinct", func() {
81-
part, err := NewQueryPart("count", []string{})
82-
So(err, ShouldBeNil)
83-
84-
res := part.Render(query, queryContext, "distinct(value)")
85-
So(res, ShouldEqual, `count(distinct(value))`)
86-
})
87-
})
10+
tcs := []struct {
11+
mode string
12+
input string
13+
params []string
14+
expected string
15+
}{
16+
{mode: "field", params: []string{"value"}, input: "value", expected: `"value"`},
17+
{mode: "derivative", params: []string{"10s"}, input: "mean(value)", expected: `derivative(mean(value), 10s)`},
18+
{mode: "bottom", params: []string{"3"}, input: "value", expected: `bottom(value, 3)`},
19+
{mode: "time", params: []string{"$interval"}, input: "", expected: `time($interval)`},
20+
{mode: "time", params: []string{"auto"}, input: "", expected: `time($__interval)`},
21+
{mode: "spread", params: []string{}, input: "value", expected: `spread(value)`},
22+
{mode: "math", params: []string{"/ 100"}, input: "mean(value)", expected: `mean(value) / 100`},
23+
{mode: "alias", params: []string{"test"}, input: "mean(value)", expected: `mean(value) AS "test"`},
24+
{mode: "count", params: []string{}, input: "distinct(value)", expected: `count(distinct(value))`},
25+
{mode: "mode", params: []string{}, input: "value", expected: `mode(value)`},
26+
}
27+
28+
queryContext := &tsdb.TsdbQuery{TimeRange: tsdb.NewTimeRange("5m", "now")}
29+
query := &Query{}
30+
31+
for _, tc := range tcs {
32+
part, err := NewQueryPart(tc.mode, tc.params)
33+
if err != nil {
34+
t.Errorf("Expected NewQueryPart to not return an error. error: %v", err)
35+
}
36+
37+
res := part.Render(query, queryContext, tc.input)
38+
if res != tc.expected {
39+
t.Errorf("expected %v to render into %s", tc, tc.expected)
40+
}
41+
}
8842
}

0 commit comments

Comments
 (0)