pass Query to MacroEngine Interpolate

pull/10138/head
Sven Klemm 8 years ago
parent 0506cfdc1d
commit b6df91d56b
  1. 2
      pkg/tsdb/mysql/macros.go
  2. 19
      pkg/tsdb/mysql/macros_test.go
  3. 4
      pkg/tsdb/postgres/macros.go
  4. 19
      pkg/tsdb/postgres/macros_test.go
  5. 8
      pkg/tsdb/sql_engine.go

@ -21,7 +21,7 @@ func NewMysqlMacroEngine() tsdb.SqlMacroEngine {
return &MySqlMacroEngine{} return &MySqlMacroEngine{}
} }
func (m *MySqlMacroEngine) Interpolate(timeRange *tsdb.TimeRange, sql string) (string, error) { func (m *MySqlMacroEngine) Interpolate(query *tsdb.Query, timeRange *tsdb.TimeRange, sql string) (string, error) {
m.TimeRange = timeRange m.TimeRange = timeRange
rExp, _ := regexp.Compile(sExpr) rExp, _ := regexp.Compile(sExpr)
var macroError error var macroError error

@ -10,31 +10,32 @@ import (
func TestMacroEngine(t *testing.T) { func TestMacroEngine(t *testing.T) {
Convey("MacroEngine", t, func() { Convey("MacroEngine", t, func() {
engine := &MySqlMacroEngine{} engine := &MySqlMacroEngine{}
query := &tsdb.Query{}
timeRange := &tsdb.TimeRange{From: "5m", To: "now"} timeRange := &tsdb.TimeRange{From: "5m", To: "now"}
Convey("interpolate __time function", func() { Convey("interpolate __time function", func() {
sql, err := engine.Interpolate(nil, "select $__time(time_column)") sql, err := engine.Interpolate(query, timeRange, "select $__time(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select UNIX_TIMESTAMP(time_column) as time_sec") So(sql, ShouldEqual, "select UNIX_TIMESTAMP(time_column) as time_sec")
}) })
Convey("interpolate __time function wrapped in aggregation", func() { Convey("interpolate __time function wrapped in aggregation", func() {
sql, err := engine.Interpolate(nil, "select min($__time(time_column))") sql, err := engine.Interpolate(query, timeRange, "select min($__time(time_column))")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select min(UNIX_TIMESTAMP(time_column) as time_sec)") So(sql, ShouldEqual, "select min(UNIX_TIMESTAMP(time_column) as time_sec)")
}) })
Convey("interpolate __timeFilter function", func() { Convey("interpolate __timeFilter function", func() {
sql, err := engine.Interpolate(timeRange, "WHERE $__timeFilter(time_column)") sql, err := engine.Interpolate(query, timeRange, "WHERE $__timeFilter(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "WHERE time_column >= FROM_UNIXTIME(18446744066914186738) AND time_column <= FROM_UNIXTIME(18446744066914187038)") So(sql, ShouldEqual, "WHERE time_column >= FROM_UNIXTIME(18446744066914186738) AND time_column <= FROM_UNIXTIME(18446744066914187038)")
}) })
Convey("interpolate __timeFrom function", func() { Convey("interpolate __timeFrom function", func() {
sql, err := engine.Interpolate(timeRange, "select $__timeFrom(time_column)") sql, err := engine.Interpolate(query, timeRange, "select $__timeFrom(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select FROM_UNIXTIME(18446744066914186738)") So(sql, ShouldEqual, "select FROM_UNIXTIME(18446744066914186738)")
@ -42,35 +43,35 @@ func TestMacroEngine(t *testing.T) {
Convey("interpolate __timeGroup function", func() { Convey("interpolate __timeGroup function", func() {
sql, err := engine.Interpolate(timeRange, "GROUP BY $__timeGroup(time_column,'5m')") sql, err := engine.Interpolate(query, timeRange, "GROUP BY $__timeGroup(time_column,'5m')")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "GROUP BY cast(cast(UNIX_TIMESTAMP(time_column)/(300) as signed)*300 as signed)") So(sql, ShouldEqual, "GROUP BY cast(cast(UNIX_TIMESTAMP(time_column)/(300) as signed)*300 as signed)")
}) })
Convey("interpolate __timeTo function", func() { Convey("interpolate __timeTo function", func() {
sql, err := engine.Interpolate(timeRange, "select $__timeTo(time_column)") sql, err := engine.Interpolate(query, timeRange, "select $__timeTo(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select FROM_UNIXTIME(18446744066914187038)") So(sql, ShouldEqual, "select FROM_UNIXTIME(18446744066914187038)")
}) })
Convey("interpolate __unixEpochFilter function", func() { Convey("interpolate __unixEpochFilter function", func() {
sql, err := engine.Interpolate(timeRange, "select $__unixEpochFilter(18446744066914186738)") sql, err := engine.Interpolate(query, timeRange, "select $__unixEpochFilter(18446744066914186738)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select 18446744066914186738 >= 18446744066914186738 AND 18446744066914186738 <= 18446744066914187038") So(sql, ShouldEqual, "select 18446744066914186738 >= 18446744066914186738 AND 18446744066914186738 <= 18446744066914187038")
}) })
Convey("interpolate __unixEpochFrom function", func() { Convey("interpolate __unixEpochFrom function", func() {
sql, err := engine.Interpolate(timeRange, "select $__unixEpochFrom()") sql, err := engine.Interpolate(query, timeRange, "select $__unixEpochFrom()")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select 18446744066914186738") So(sql, ShouldEqual, "select 18446744066914186738")
}) })
Convey("interpolate __unixEpochTo function", func() { Convey("interpolate __unixEpochTo function", func() {
sql, err := engine.Interpolate(timeRange, "select $__unixEpochTo()") sql, err := engine.Interpolate(query, timeRange, "select $__unixEpochTo()")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select 18446744066914187038") So(sql, ShouldEqual, "select 18446744066914187038")

@ -15,14 +15,16 @@ const sExpr = `\$` + rsIdentifier + `\(([^\)]*)\)`
type PostgresMacroEngine struct { type PostgresMacroEngine struct {
TimeRange *tsdb.TimeRange TimeRange *tsdb.TimeRange
Query *tsdb.Query
} }
func NewPostgresMacroEngine() tsdb.SqlMacroEngine { func NewPostgresMacroEngine() tsdb.SqlMacroEngine {
return &PostgresMacroEngine{} return &PostgresMacroEngine{}
} }
func (m *PostgresMacroEngine) Interpolate(timeRange *tsdb.TimeRange, sql string) (string, error) { func (m *PostgresMacroEngine) Interpolate(query *tsdb.Query, timeRange *tsdb.TimeRange, sql string) (string, error) {
m.TimeRange = timeRange m.TimeRange = timeRange
m.Query = query
rExp, _ := regexp.Compile(sExpr) rExp, _ := regexp.Compile(sExpr)
var macroError error var macroError error

@ -10,31 +10,32 @@ import (
func TestMacroEngine(t *testing.T) { func TestMacroEngine(t *testing.T) {
Convey("MacroEngine", t, func() { Convey("MacroEngine", t, func() {
engine := &PostgresMacroEngine{} engine := &PostgresMacroEngine{}
query := &tsdb.Query{}
timeRange := &tsdb.TimeRange{From: "5m", To: "now"} timeRange := &tsdb.TimeRange{From: "5m", To: "now"}
Convey("interpolate __time function", func() { Convey("interpolate __time function", func() {
sql, err := engine.Interpolate(nil, "select $__time(time_column)") sql, err := engine.Interpolate(query, timeRange, "select $__time(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select time_column AS \"time\"") So(sql, ShouldEqual, "select time_column AS \"time\"")
}) })
Convey("interpolate __time function wrapped in aggregation", func() { Convey("interpolate __time function wrapped in aggregation", func() {
sql, err := engine.Interpolate(nil, "select min($__time(time_column))") sql, err := engine.Interpolate(query, timeRange, "select min($__time(time_column))")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select min(time_column AS \"time\")") So(sql, ShouldEqual, "select min(time_column AS \"time\")")
}) })
Convey("interpolate __timeFilter function", func() { Convey("interpolate __timeFilter function", func() {
sql, err := engine.Interpolate(timeRange, "WHERE $__timeFilter(time_column)") sql, err := engine.Interpolate(query, timeRange, "WHERE $__timeFilter(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "WHERE extract(epoch from time_column) BETWEEN 18446744066914186738 AND 18446744066914187038") So(sql, ShouldEqual, "WHERE extract(epoch from time_column) BETWEEN 18446744066914186738 AND 18446744066914187038")
}) })
Convey("interpolate __timeFrom function", func() { Convey("interpolate __timeFrom function", func() {
sql, err := engine.Interpolate(timeRange, "select $__timeFrom(time_column)") sql, err := engine.Interpolate(query, timeRange, "select $__timeFrom(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select to_timestamp(18446744066914186738)") So(sql, ShouldEqual, "select to_timestamp(18446744066914186738)")
@ -42,35 +43,35 @@ func TestMacroEngine(t *testing.T) {
Convey("interpolate __timeGroup function", func() { Convey("interpolate __timeGroup function", func() {
sql, err := engine.Interpolate(timeRange, "GROUP BY $__timeGroup(time_column,'5m')") sql, err := engine.Interpolate(query, timeRange, "GROUP BY $__timeGroup(time_column,'5m')")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "GROUP BY (extract(epoch from time_column)/300)::bigint*300 AS time") So(sql, ShouldEqual, "GROUP BY (extract(epoch from time_column)/300)::bigint*300 AS time")
}) })
Convey("interpolate __timeTo function", func() { Convey("interpolate __timeTo function", func() {
sql, err := engine.Interpolate(timeRange, "select $__timeTo(time_column)") sql, err := engine.Interpolate(query, timeRange, "select $__timeTo(time_column)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select to_timestamp(18446744066914187038)") So(sql, ShouldEqual, "select to_timestamp(18446744066914187038)")
}) })
Convey("interpolate __unixEpochFilter function", func() { Convey("interpolate __unixEpochFilter function", func() {
sql, err := engine.Interpolate(timeRange, "select $__unixEpochFilter(18446744066914186738)") sql, err := engine.Interpolate(query, timeRange, "select $__unixEpochFilter(18446744066914186738)")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select 18446744066914186738 >= 18446744066914186738 AND 18446744066914186738 <= 18446744066914187038") So(sql, ShouldEqual, "select 18446744066914186738 >= 18446744066914186738 AND 18446744066914186738 <= 18446744066914187038")
}) })
Convey("interpolate __unixEpochFrom function", func() { Convey("interpolate __unixEpochFrom function", func() {
sql, err := engine.Interpolate(timeRange, "select $__unixEpochFrom()") sql, err := engine.Interpolate(query, timeRange, "select $__unixEpochFrom()")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select 18446744066914186738") So(sql, ShouldEqual, "select 18446744066914186738")
}) })
Convey("interpolate __unixEpochTo function", func() { Convey("interpolate __unixEpochTo function", func() {
sql, err := engine.Interpolate(timeRange, "select $__unixEpochTo()") sql, err := engine.Interpolate(query, timeRange, "select $__unixEpochTo()")
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(sql, ShouldEqual, "select 18446744066914187038") So(sql, ShouldEqual, "select 18446744066914187038")

@ -22,10 +22,10 @@ type SqlEngine interface {
) (*Response, error) ) (*Response, error)
} }
// SqlMacroEngine interpolates macros into sql. It takes in the timeRange to be able to // SqlMacroEngine interpolates macros into sql. It takes in the Query to have access to query context and
// generate queries that use from and to. // timeRange to be able to generate queries that use from and to.
type SqlMacroEngine interface { type SqlMacroEngine interface {
Interpolate(timeRange *TimeRange, sql string) (string, error) Interpolate(query *Query, timeRange *TimeRange, sql string) (string, error)
} }
type DefaultSqlEngine struct { type DefaultSqlEngine struct {
@ -97,7 +97,7 @@ func (e *DefaultSqlEngine) Query(
queryResult := &QueryResult{Meta: simplejson.New(), RefId: query.RefId} queryResult := &QueryResult{Meta: simplejson.New(), RefId: query.RefId}
result.Results[query.RefId] = queryResult result.Results[query.RefId] = queryResult
rawSql, err := e.MacroEngine.Interpolate(tsdbQuery.TimeRange, rawSql) rawSql, err := e.MacroEngine.Interpolate(query, tsdbQuery.TimeRange, rawSql)
if err != nil { if err != nil {
queryResult.Error = err queryResult.Error = err
continue continue

Loading…
Cancel
Save