2016-10-05 03:56:34 -05:00
package influxdb
import (
"testing"
2016-10-06 05:51:45 -05:00
"github.com/grafana/grafana/pkg/tsdb"
2016-10-05 03:56:34 -05:00
. "github.com/smartystreets/goconvey/convey"
)
func TestInfluxdbQueryBuilder ( t * testing . T ) {
2016-10-07 04:23:37 -05:00
2016-10-05 03:56:34 -05:00
Convey ( "Influxdb query builder" , t , func ( ) {
2016-10-06 07:16:26 -05:00
builder := QueryBuilder { }
2016-10-05 03:56:34 -05:00
2016-10-05 13:36:05 -05:00
qp1 , _ := NewQueryPart ( "field" , [ ] string { "value" } )
qp2 , _ := NewQueryPart ( "mean" , [ ] string { } )
groupBy1 , _ := NewQueryPart ( "time" , [ ] string { "$interval" } )
2016-10-07 08:09:54 -05:00
groupBy2 , _ := NewQueryPart ( "tag" , [ ] string { "datacenter" } )
groupBy3 , _ := NewQueryPart ( "fill" , [ ] string { "null" } )
2016-10-05 13:36:05 -05:00
tag1 := & Tag { Key : "hostname" , Value : "server1" , Operator : "=" }
tag2 := & Tag { Key : "hostname" , Value : "server2" , Operator : "=" , Condition : "OR" }
2016-10-05 03:56:34 -05:00
2016-10-06 05:51:45 -05:00
queryContext := & tsdb . QueryContext {
2016-10-07 04:33:17 -05:00
TimeRange : tsdb . NewTimeRange ( "5m" , "now" ) ,
2016-10-06 05:51:45 -05:00
}
2016-10-06 07:16:26 -05:00
Convey ( "can build simple query" , func ( ) {
2016-10-05 13:36:05 -05:00
query := & Query {
Selects : [ ] * Select { { * qp1 , * qp2 } } ,
Measurement : "cpu" ,
2016-10-05 13:57:28 -05:00
Policy : "policy" ,
2016-10-07 08:09:54 -05:00
GroupBy : [ ] * QueryPart { groupBy1 , groupBy3 } ,
2016-10-06 05:51:45 -05:00
Interval : "10s" ,
2016-10-05 13:36:05 -05:00
}
2016-10-06 05:51:45 -05:00
rawQuery , err := builder . Build ( query , queryContext )
2016-10-05 13:36:05 -05:00
So ( err , ShouldBeNil )
2016-10-10 00:12:21 -05:00
So ( rawQuery , ShouldEqual , ` SELECT mean("value") FROM "policy"."cpu" WHERE time > now() - 5m GROUP BY time(200ms) fill(null) ` )
2016-10-05 03:56:34 -05:00
} )
2016-10-06 07:16:26 -05:00
Convey ( "can build query with group bys" , func ( ) {
2016-10-05 13:36:05 -05:00
query := & Query {
Selects : [ ] * Select { { * qp1 , * qp2 } } ,
Measurement : "cpu" ,
2016-10-07 08:09:54 -05:00
GroupBy : [ ] * QueryPart { groupBy1 , groupBy2 , groupBy3 } ,
2016-10-05 13:36:05 -05:00
Tags : [ ] * Tag { tag1 , tag2 } ,
2016-10-06 05:51:45 -05:00
Interval : "5s" ,
2016-10-05 13:36:05 -05:00
}
2016-10-06 05:51:45 -05:00
rawQuery , err := builder . Build ( query , queryContext )
2016-10-05 13:36:05 -05:00
So ( err , ShouldBeNil )
2016-10-10 00:12:21 -05:00
So ( rawQuery , ShouldEqual , ` SELECT mean("value") FROM "cpu" WHERE "hostname" = 'server1' OR "hostname" = 'server2' AND time > now() - 5m GROUP BY time(200ms), "datacenter" fill(null) ` )
2016-10-07 04:23:37 -05:00
} )
Convey ( "can render time range" , func ( ) {
2016-10-07 04:33:17 -05:00
query := Query { }
2016-10-10 04:58:06 -05:00
builder := & QueryBuilder { }
2016-10-07 04:23:37 -05:00
Convey ( "render from: 2h to now-1h" , func ( ) {
2016-10-07 04:33:17 -05:00
query := Query { }
queryContext := & tsdb . QueryContext { TimeRange : tsdb . NewTimeRange ( "2h" , "now-1h" ) }
2016-10-10 04:58:06 -05:00
So ( builder . renderTimeFilter ( & query , queryContext ) , ShouldEqual , "time > now() - 2h and time < now() - 1h" )
2016-10-07 04:23:37 -05:00
} )
Convey ( "render from: 10m" , func ( ) {
2016-10-07 04:33:17 -05:00
queryContext := & tsdb . QueryContext { TimeRange : tsdb . NewTimeRange ( "10m" , "now" ) }
2016-10-10 04:58:06 -05:00
So ( builder . renderTimeFilter ( & query , queryContext ) , ShouldEqual , "time > now() - 10m" )
2016-10-07 04:23:37 -05:00
} )
2016-10-05 03:56:34 -05:00
} )
} )
}