mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
parent
71eb0f3278
commit
4f3c8c6663
@ -5,9 +5,15 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"regexp"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/tsdb"
|
"github.com/grafana/grafana/pkg/tsdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
regexpOperatorPattern *regexp.Regexp = regexp.MustCompile(`^\/.*\/$`)
|
||||||
|
)
|
||||||
|
|
||||||
type QueryBuilder struct{}
|
type QueryBuilder struct{}
|
||||||
|
|
||||||
func (qb *QueryBuilder) Build(query *Query, queryContext *tsdb.QueryContext) (string, error) {
|
func (qb *QueryBuilder) Build(query *Query, queryContext *tsdb.QueryContext) (string, error) {
|
||||||
@ -43,18 +49,28 @@ func (qb *QueryBuilder) renderTags(query *Query) []string {
|
|||||||
str += " "
|
str += " "
|
||||||
}
|
}
|
||||||
|
|
||||||
value := tag.Value
|
//If the operator is missing we fall back to sensible defaults
|
||||||
nValue, err := strconv.ParseFloat(tag.Value, 64)
|
if tag.Operator == "" {
|
||||||
|
if regexpOperatorPattern.Match([]byte(tag.Value)) {
|
||||||
if tag.Operator == "=~" || tag.Operator == "!~" {
|
tag.Operator = "=~"
|
||||||
value = fmt.Sprintf("%s", value)
|
} else {
|
||||||
} else if err == nil {
|
tag.Operator = "="
|
||||||
value = fmt.Sprintf("%v", nValue)
|
}
|
||||||
} else {
|
|
||||||
value = fmt.Sprintf("'%s'", value)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res = append(res, fmt.Sprintf(`%s"%s" %s %s`, str, tag.Key, tag.Operator, value))
|
textValue := ""
|
||||||
|
numericValue, err := strconv.ParseFloat(tag.Value, 64)
|
||||||
|
|
||||||
|
// quote value unless regex or number
|
||||||
|
if tag.Operator == "=~" || tag.Operator == "!~" {
|
||||||
|
textValue = tag.Value
|
||||||
|
} else if err == nil {
|
||||||
|
textValue = fmt.Sprintf("%v", numericValue)
|
||||||
|
} else {
|
||||||
|
textValue = fmt.Sprintf("'%s'", tag.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
res = append(res, fmt.Sprintf(`%s"%s" %s %s`, str, tag.Key, tag.Operator, textValue))
|
||||||
}
|
}
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
@ -86,16 +86,34 @@ func TestInfluxdbQueryBuilder(t *testing.T) {
|
|||||||
So(rawQuery, ShouldEqual, `Raw query`)
|
So(rawQuery, ShouldEqual, `Raw query`)
|
||||||
})
|
})
|
||||||
|
|
||||||
Convey("can render regex tags", func() {
|
Convey("can render normal tags without operator", func() {
|
||||||
query := &Query{Tags: []*Tag{&Tag{Operator: "=~", Value: "value", Key: "key"}}}
|
query := &Query{Tags: []*Tag{&Tag{Operator: "", Value: `value`, Key: "key"}}}
|
||||||
|
|
||||||
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" =~ value`)
|
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 'value'`)
|
||||||
|
})
|
||||||
|
|
||||||
|
Convey("can render regex tags without operator", func() {
|
||||||
|
query := &Query{Tags: []*Tag{&Tag{Operator: "", Value: `/value/`, Key: "key"}}}
|
||||||
|
|
||||||
|
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" =~ /value/`)
|
||||||
|
})
|
||||||
|
|
||||||
|
Convey("can render regex tags", func() {
|
||||||
|
query := &Query{Tags: []*Tag{&Tag{Operator: "=~", Value: `/value/`, Key: "key"}}}
|
||||||
|
|
||||||
|
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" =~ /value/`)
|
||||||
})
|
})
|
||||||
|
|
||||||
Convey("can render number tags", func() {
|
Convey("can render number tags", func() {
|
||||||
query := &Query{Tags: []*Tag{&Tag{Operator: "=", Value: "1", Key: "key"}}}
|
query := &Query{Tags: []*Tag{&Tag{Operator: "=", Value: "10001", Key: "key"}}}
|
||||||
|
|
||||||
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 1`)
|
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 10001`)
|
||||||
|
})
|
||||||
|
|
||||||
|
Convey("can render number tags with decimals", func() {
|
||||||
|
query := &Query{Tags: []*Tag{&Tag{Operator: "=", Value: "10001.1", Key: "key"}}}
|
||||||
|
|
||||||
|
So(strings.Join(builder.renderTags(query), ""), ShouldEqual, `"key" = 10001.1`)
|
||||||
})
|
})
|
||||||
|
|
||||||
Convey("can render string tags", func() {
|
Convey("can render string tags", func() {
|
||||||
|
Loading…
Reference in New Issue
Block a user