mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
refactor timescaledb handling in MacroEngine
This commit is contained in:
parent
a4a33d80db
commit
3552a4cb86
@ -7,6 +7,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/models"
|
||||||
"github.com/grafana/grafana/pkg/tsdb"
|
"github.com/grafana/grafana/pkg/tsdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -15,12 +16,15 @@ const rsIdentifier = `([_a-zA-Z0-9]+)`
|
|||||||
const sExpr = `\$` + rsIdentifier + `\(([^\)]*)\)`
|
const sExpr = `\$` + rsIdentifier + `\(([^\)]*)\)`
|
||||||
|
|
||||||
type postgresMacroEngine struct {
|
type postgresMacroEngine struct {
|
||||||
timeRange *tsdb.TimeRange
|
timeRange *tsdb.TimeRange
|
||||||
query *tsdb.Query
|
query *tsdb.Query
|
||||||
|
timescaledb bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newPostgresMacroEngine() tsdb.SqlMacroEngine {
|
func newPostgresMacroEngine(datasource *models.DataSource) tsdb.SqlMacroEngine {
|
||||||
return &postgresMacroEngine{}
|
engine := &postgresMacroEngine{}
|
||||||
|
engine.timescaledb = datasource.JsonData.Get("timescaledb").MustBool(false)
|
||||||
|
return engine
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *postgresMacroEngine) Interpolate(query *tsdb.Query, timeRange *tsdb.TimeRange, sql string) (string, error) {
|
func (m *postgresMacroEngine) Interpolate(query *tsdb.Query, timeRange *tsdb.TimeRange, sql string) (string, error) {
|
||||||
@ -131,7 +135,7 @@ func (m *postgresMacroEngine) evaluateMacro(name string, args []string) (string,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.query.DataSource.JsonData.Get("timescaledb").MustBool() {
|
if m.timescaledb {
|
||||||
return fmt.Sprintf("time_bucket('%vs',%s)", interval.Seconds(), args[0]), nil
|
return fmt.Sprintf("time_bucket('%vs',%s)", interval.Seconds(), args[0]), nil
|
||||||
} else {
|
} else {
|
||||||
return fmt.Sprintf("floor(extract(epoch from %s)/%v)*%v", args[0], interval.Seconds(), interval.Seconds()), nil
|
return fmt.Sprintf("floor(extract(epoch from %s)/%v)*%v", args[0], interval.Seconds(), interval.Seconds()), nil
|
||||||
@ -142,7 +146,6 @@ func (m *postgresMacroEngine) evaluateMacro(name string, args []string) (string,
|
|||||||
return tg + " AS \"time\"", err
|
return tg + " AS \"time\"", err
|
||||||
}
|
}
|
||||||
return "", err
|
return "", err
|
||||||
|
|
||||||
case "__unixEpochFilter":
|
case "__unixEpochFilter":
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return "", fmt.Errorf("missing time column argument for macro %v", name)
|
return "", fmt.Errorf("missing time column argument for macro %v", name)
|
||||||
|
@ -14,10 +14,12 @@ import (
|
|||||||
|
|
||||||
func TestMacroEngine(t *testing.T) {
|
func TestMacroEngine(t *testing.T) {
|
||||||
Convey("MacroEngine", t, func() {
|
Convey("MacroEngine", t, func() {
|
||||||
engine := newPostgresMacroEngine()
|
datasource := &models.DataSource{JsonData: simplejson.New()}
|
||||||
query := &tsdb.Query{DataSource: &models.DataSource{JsonData: simplejson.New()}}
|
engine := newPostgresMacroEngine(datasource)
|
||||||
queryTS := &tsdb.Query{DataSource: &models.DataSource{JsonData: simplejson.New()}}
|
datasourceTS := &models.DataSource{JsonData: simplejson.New()}
|
||||||
queryTS.DataSource.JsonData.Set("timescaledb", true)
|
datasourceTS.JsonData.Set("timescaledb", true)
|
||||||
|
engineTS := newPostgresMacroEngine(datasourceTS)
|
||||||
|
query := &tsdb.Query{}
|
||||||
|
|
||||||
Convey("Given a time range between 2018-04-12 00:00 and 2018-04-12 00:05", func() {
|
Convey("Given a time range between 2018-04-12 00:00 and 2018-04-12 00:05", func() {
|
||||||
from := time.Date(2018, 4, 12, 18, 0, 0, 0, time.UTC)
|
from := time.Date(2018, 4, 12, 18, 0, 0, 0, time.UTC)
|
||||||
@ -89,7 +91,7 @@ func TestMacroEngine(t *testing.T) {
|
|||||||
|
|
||||||
Convey("interpolate __timeGroup function with TimescaleDB enabled", func() {
|
Convey("interpolate __timeGroup function with TimescaleDB enabled", func() {
|
||||||
|
|
||||||
sql, err := engine.Interpolate(queryTS, timeRange, "GROUP BY $__timeGroup(time_column,'5m')")
|
sql, err := engineTS.Interpolate(query, timeRange, "GROUP BY $__timeGroup(time_column,'5m')")
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
So(sql, ShouldEqual, "GROUP BY time_bucket('300s',time_column)")
|
So(sql, ShouldEqual, "GROUP BY time_bucket('300s',time_column)")
|
||||||
@ -97,7 +99,7 @@ func TestMacroEngine(t *testing.T) {
|
|||||||
|
|
||||||
Convey("interpolate __timeGroup function with spaces between args and TimescaleDB enabled", func() {
|
Convey("interpolate __timeGroup function with spaces between args and TimescaleDB enabled", func() {
|
||||||
|
|
||||||
sql, err := engine.Interpolate(queryTS, timeRange, "GROUP BY $__timeGroup(time_column , '5m')")
|
sql, err := engineTS.Interpolate(query, timeRange, "GROUP BY $__timeGroup(time_column , '5m')")
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
So(sql, ShouldEqual, "GROUP BY time_bucket('300s',time_column)")
|
So(sql, ShouldEqual, "GROUP BY time_bucket('300s',time_column)")
|
||||||
|
@ -32,7 +32,7 @@ func newPostgresQueryEndpoint(datasource *models.DataSource) (tsdb.TsdbQueryEndp
|
|||||||
log: logger,
|
log: logger,
|
||||||
}
|
}
|
||||||
|
|
||||||
return tsdb.NewSqlQueryEndpoint(&config, &rowTransformer, newPostgresMacroEngine(), logger)
|
return tsdb.NewSqlQueryEndpoint(&config, &rowTransformer, newPostgresMacroEngine(datasource), logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateConnectionString(datasource *models.DataSource) string {
|
func generateConnectionString(datasource *models.DataSource) string {
|
||||||
|
@ -102,7 +102,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": "SELECT * FROM postgres_types",
|
"rawSql": "SELECT * FROM postgres_types",
|
||||||
"format": "table",
|
"format": "table",
|
||||||
@ -183,7 +182,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": "SELECT $__timeGroup(time, '5m') AS time, avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
"rawSql": "SELECT $__timeGroup(time, '5m') AS time, avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -228,7 +226,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": "SELECT $__timeGroup(time, '5m', NULL) AS time, avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
"rawSql": "SELECT $__timeGroup(time, '5m', NULL) AS time, avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -283,7 +280,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": "SELECT $__timeGroup(time, '5m', 1.5) AS time, avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
"rawSql": "SELECT $__timeGroup(time, '5m', 1.5) AS time, avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -311,7 +307,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": "SELECT $__timeGroup(time, '5m', previous), avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
"rawSql": "SELECT $__timeGroup(time, '5m', previous), avg(value) as value FROM metric GROUP BY 1 ORDER BY 1",
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -406,7 +401,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "timeInt64" as time, "timeInt64" FROM metric_values ORDER BY time LIMIT 1`,
|
"rawSql": `SELECT "timeInt64" as time, "timeInt64" FROM metric_values ORDER BY time LIMIT 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -429,7 +423,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "timeInt64Nullable" as time, "timeInt64Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
"rawSql": `SELECT "timeInt64Nullable" as time, "timeInt64Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -452,7 +445,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "timeFloat64" as time, "timeFloat64" FROM metric_values ORDER BY time LIMIT 1`,
|
"rawSql": `SELECT "timeFloat64" as time, "timeFloat64" FROM metric_values ORDER BY time LIMIT 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -475,7 +467,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "timeFloat64Nullable" as time, "timeFloat64Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
"rawSql": `SELECT "timeFloat64Nullable" as time, "timeFloat64Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -520,7 +511,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "timeInt32Nullable" as time, "timeInt32Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
"rawSql": `SELECT "timeInt32Nullable" as time, "timeInt32Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -543,7 +533,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "timeFloat32" as time, "timeFloat32" FROM metric_values ORDER BY time LIMIT 1`,
|
"rawSql": `SELECT "timeFloat32" as time, "timeFloat32" FROM metric_values ORDER BY time LIMIT 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -566,7 +555,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "timeFloat32Nullable" as time, "timeFloat32Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
"rawSql": `SELECT "timeFloat32Nullable" as time, "timeFloat32Nullable" FROM metric_values ORDER BY time LIMIT 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -589,7 +577,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT $__timeEpoch(time), measurement || ' - value one' as metric, "valueOne" FROM metric_values ORDER BY 1`,
|
"rawSql": `SELECT $__timeEpoch(time), measurement || ' - value one' as metric, "valueOne" FROM metric_values ORDER BY 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -638,7 +625,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT $__timeEpoch(time), "valueOne", "valueTwo" FROM metric_values ORDER BY 1`,
|
"rawSql": `SELECT $__timeEpoch(time), "valueOne", "valueTwo" FROM metric_values ORDER BY 1`,
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
@ -696,7 +682,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "time_sec" as time, description as text, tags FROM event WHERE $__unixEpochFilter(time_sec) AND tags='deploy' ORDER BY 1 ASC`,
|
"rawSql": `SELECT "time_sec" as time, description as text, tags FROM event WHERE $__unixEpochFilter(time_sec) AND tags='deploy' ORDER BY 1 ASC`,
|
||||||
"format": "table",
|
"format": "table",
|
||||||
@ -720,7 +705,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT "time_sec" as time, description as text, tags FROM event WHERE $__unixEpochFilter(time_sec) AND tags='ticket' ORDER BY 1 ASC`,
|
"rawSql": `SELECT "time_sec" as time, description as text, tags FROM event WHERE $__unixEpochFilter(time_sec) AND tags='ticket' ORDER BY 1 ASC`,
|
||||||
"format": "table",
|
"format": "table",
|
||||||
@ -747,7 +731,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": fmt.Sprintf(`SELECT
|
"rawSql": fmt.Sprintf(`SELECT
|
||||||
CAST('%s' AS TIMESTAMP) as time,
|
CAST('%s' AS TIMESTAMP) as time,
|
||||||
@ -778,7 +761,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": fmt.Sprintf(`SELECT
|
"rawSql": fmt.Sprintf(`SELECT
|
||||||
%d as time,
|
%d as time,
|
||||||
@ -809,7 +791,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": fmt.Sprintf(`SELECT
|
"rawSql": fmt.Sprintf(`SELECT
|
||||||
cast(%d as bigint) as time,
|
cast(%d as bigint) as time,
|
||||||
@ -840,7 +821,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": fmt.Sprintf(`SELECT
|
"rawSql": fmt.Sprintf(`SELECT
|
||||||
%d as time,
|
%d as time,
|
||||||
@ -869,7 +849,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT
|
"rawSql": `SELECT
|
||||||
cast(null as bigint) as time,
|
cast(null as bigint) as time,
|
||||||
@ -898,7 +877,6 @@ func TestPostgres(t *testing.T) {
|
|||||||
query := &tsdb.TsdbQuery{
|
query := &tsdb.TsdbQuery{
|
||||||
Queries: []*tsdb.Query{
|
Queries: []*tsdb.Query{
|
||||||
{
|
{
|
||||||
DataSource: &models.DataSource{JsonData: simplejson.New()},
|
|
||||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||||
"rawSql": `SELECT
|
"rawSql": `SELECT
|
||||||
cast(null as timestamp) as time,
|
cast(null as timestamp) as time,
|
||||||
|
Loading…
Reference in New Issue
Block a user