From 4fafefd66a66f03fe0f4612c294a663b60b35e8d Mon Sep 17 00:00:00 2001 From: bergquist Date: Fri, 7 Oct 2016 15:09:54 +0200 Subject: [PATCH] feat(influxdb): proper support for group by tags --- pkg/tsdb/influxdb/query_builder.go | 22 ++++++++++++++-------- pkg/tsdb/influxdb/query_builder_test.go | 9 +++++---- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/pkg/tsdb/influxdb/query_builder.go b/pkg/tsdb/influxdb/query_builder.go index faf6f051bbb..846c6a4ba67 100644 --- a/pkg/tsdb/influxdb/query_builder.go +++ b/pkg/tsdb/influxdb/query_builder.go @@ -88,14 +88,20 @@ func renderWhereClause(query *Query) string { } func renderGroupBy(query *Query) string { - var groupBy []string - for _, group := range query.GroupBy { - groupBy = append(groupBy, group.Render("")) + groupBy := "" + for i, group := range query.GroupBy { + if i == 0 { + groupBy += " GROUP BY" + } + + if i > 0 && group.Type != "fill" { + groupBy += ", " //fill is special. fill is a creep + } else { + groupBy += " " + } + + groupBy += group.Render("") } - if len(groupBy) > 0 { - return " GROUP BY " + strings.Join(groupBy, " ") - } - - return "" + return groupBy } diff --git a/pkg/tsdb/influxdb/query_builder_test.go b/pkg/tsdb/influxdb/query_builder_test.go index 26f587d479b..fcc81986d4c 100644 --- a/pkg/tsdb/influxdb/query_builder_test.go +++ b/pkg/tsdb/influxdb/query_builder_test.go @@ -16,7 +16,8 @@ func TestInfluxdbQueryBuilder(t *testing.T) { qp2, _ := NewQueryPart("mean", []string{}) groupBy1, _ := NewQueryPart("time", []string{"$interval"}) - groupBy2, _ := NewQueryPart("fill", []string{"null"}) + groupBy2, _ := NewQueryPart("tag", []string{"datacenter"}) + groupBy3, _ := NewQueryPart("fill", []string{"null"}) tag1 := &Tag{Key: "hostname", Value: "server1", Operator: "="} tag2 := &Tag{Key: "hostname", Value: "server2", Operator: "=", Condition: "OR"} @@ -30,7 +31,7 @@ func TestInfluxdbQueryBuilder(t *testing.T) { Selects: []*Select{{*qp1, *qp2}}, Measurement: "cpu", Policy: "policy", - GroupBy: []*QueryPart{groupBy1, groupBy2}, + GroupBy: []*QueryPart{groupBy1, groupBy3}, Interval: "10s", } @@ -43,14 +44,14 @@ func TestInfluxdbQueryBuilder(t *testing.T) { query := &Query{ Selects: []*Select{{*qp1, *qp2}}, Measurement: "cpu", - GroupBy: []*QueryPart{groupBy1}, + GroupBy: []*QueryPart{groupBy1, groupBy2, groupBy3}, Tags: []*Tag{tag1, tag2}, Interval: "5s", } rawQuery, err := builder.Build(query, queryContext) So(err, ShouldBeNil) - So(rawQuery, ShouldEqual, `SELECT mean("value") FROM "cpu" WHERE "hostname" = 'server1' OR "hostname" = 'server2' AND time > now() - 5m GROUP BY time(10s)`) + So(rawQuery, ShouldEqual, `SELECT mean("value") FROM "cpu" WHERE "hostname" = 'server1' OR "hostname" = 'server2' AND time > now() - 5m GROUP BY time(10s), "datacenter" fill(null)`) }) Convey("can render time range", func() {