Skip to content

Commit 4f3c8c6

Browse files
committed
fix(influxdb): add default operator
ref grafana#6523
1 parent 71eb0f3 commit 4f3c8c6

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

pkg/tsdb/influxdb/query_builder.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@ import (
55
"strconv"
66
"strings"
77

8+
"regexp"
9+
810
"github.com/grafana/grafana/pkg/tsdb"
911
)
1012

13+
var (
14+
regexpOperatorPattern *regexp.Regexp = regexp.MustCompile(`^\/.*\/$`)
15+
)
16+
1117
type QueryBuilder struct{}
1218

1319
func (qb *QueryBuilder) Build(query *Query, queryContext *tsdb.QueryContext) (string, error) {
@@ -43,18 +49,28 @@ func (qb *QueryBuilder) renderTags(query *Query) []string {
4349
str += " "
4450
}
4551

46-
value := tag.Value
47-
nValue, err := strconv.ParseFloat(tag.Value, 64)
52+
//If the operator is missing we fall back to sensible defaults
53+
if tag.Operator == "" {
54+
if regexpOperatorPattern.Match([]byte(tag.Value)) {
55+
tag.Operator = "=~"
56+
} else {
57+
tag.Operator = "="
58+
}
59+
}
60+
61+
textValue := ""
62+
numericValue, err := strconv.ParseFloat(tag.Value, 64)
4863

64+
// quote value unless regex or number
4965
if tag.Operator == "=~" || tag.Operator == "!~" {
50-
value = fmt.Sprintf("%s", value)
66+
textValue = tag.Value
5167
} else if err == nil {
52-
value = fmt.Sprintf("%v", nValue)
68+
textValue = fmt.Sprintf("%v", numericValue)
5369
} else {
54-
value = fmt.Sprintf("'%s'", value)
70+
textValue = fmt.Sprintf("'%s'", tag.Value)
5571
}
5672

57-
res = append(res, fmt.Sprintf(`%s"%s" %s %s`, str, tag.Key, tag.Operator, value))
73+
res = append(res, fmt.Sprintf(`%s"%s" %s %s`, str, tag.Key, tag.Operator, textValue))
5874
}
5975

6076
return res

pkg/tsdb/influxdb/query_builder_test.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,34 @@ func TestInfluxdbQueryBuilder(t *testing.T) {
8686
So(rawQuery, ShouldEqual, `Raw query`)
8787
})
8888

89+
Convey("can render normal tags without operator", func() {
90+
query := &Query{Tags: []*Tag{&Tag{Operator: "", Value: `value`, Key: "key"}}}
91+
92+
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 'value'`)
93+
})
94+
95+
Convey("can render regex tags without operator", func() {
96+
query := &Query{Tags: []*Tag{&Tag{Operator: "", Value: `/value/`, Key: "key"}}}
97+
98+
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" =~ /value/`)
99+
})
100+
89101
Convey("can render regex tags", func() {
90-
query := &Query{Tags: []*Tag{&Tag{Operator: "=~", Value: "value", Key: "key"}}}
102+
query := &Query{Tags: []*Tag{&Tag{Operator: "=~", Value: `/value/`, Key: "key"}}}
91103

92-
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" =~ value`)
104+
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" =~ /value/`)
93105
})
94106

95107
Convey("can render number tags", func() {
96-
query := &Query{Tags: []*Tag{&Tag{Operator: "=", Value: "1", Key: "key"}}}
108+
query := &Query{Tags: []*Tag{&Tag{Operator: "=", Value: "10001", Key: "key"}}}
109+
110+
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 10001`)
111+
})
112+
113+
Convey("can render number tags with decimals", func() {
114+
query := &Query{Tags: []*Tag{&Tag{Operator: "=", Value: "10001.1", Key: "key"}}}
97115

98-
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 1`)
116+
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 10001.1`)
99117
})
100118

101119
Convey("can render string tags", func() {

0 commit comments

Comments
 (0)