412 lines
9.2 KiB
JavaScript
412 lines
9.2 KiB
JavaScript
|
import InfluxQL from 'src/influxql'
|
||
|
|
||
|
describe('influxql astToString', () => {
|
||
|
it('simple query', () => {
|
||
|
const ast = InfluxQL({
|
||
|
"fields": [
|
||
|
{
|
||
|
"column": {
|
||
|
"expr": "binary",
|
||
|
"op": "+",
|
||
|
"lhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "1",
|
||
|
"type": "integer"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "A"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"sources": [
|
||
|
{
|
||
|
"database": "",
|
||
|
"retentionPolicy": "",
|
||
|
"name": "howdy",
|
||
|
"type": "measurement"
|
||
|
}
|
||
|
]
|
||
|
})
|
||
|
|
||
|
const expected = `SELECT 1 + "A" FROM "howdy"`
|
||
|
const actual = ast.toString()
|
||
|
|
||
|
// console.log(actual)
|
||
|
|
||
|
expect(actual).to.equal(expected)
|
||
|
})
|
||
|
|
||
|
it('simple query w/ multiple sources', () => {
|
||
|
const ast = InfluxQL({
|
||
|
"fields": [
|
||
|
{
|
||
|
"column": {
|
||
|
"expr": "binary",
|
||
|
"op": "+",
|
||
|
"lhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "1",
|
||
|
"type": "integer"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "A"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"sources": [
|
||
|
{
|
||
|
"database": "",
|
||
|
"retentionPolicy": "",
|
||
|
"name": "howdy",
|
||
|
"type": "measurement"
|
||
|
},
|
||
|
{
|
||
|
"database": "telegraf",
|
||
|
"retentionPolicy": "autogen",
|
||
|
"name": "doody",
|
||
|
"type": "measurement"
|
||
|
}
|
||
|
]
|
||
|
})
|
||
|
|
||
|
const expected = `SELECT 1 + "A" FROM "howdy", "telegraf"."autogen"."doody"`
|
||
|
const actual = ast.toString()
|
||
|
|
||
|
// console.log('actual ', actual)
|
||
|
// console.log('expected', expected)
|
||
|
|
||
|
expect(actual).to.equal(expected)
|
||
|
})
|
||
|
|
||
|
it('query with AS', () => {
|
||
|
const ast = InfluxQL({
|
||
|
"fields": [
|
||
|
{
|
||
|
"alias": "B",
|
||
|
"column": {
|
||
|
"expr": "binary",
|
||
|
"op": "+",
|
||
|
"lhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "1",
|
||
|
"type": "integer"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "A"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"sources": [
|
||
|
{
|
||
|
"database": "",
|
||
|
"retentionPolicy": "",
|
||
|
"name": "howdy",
|
||
|
"type": "measurement"
|
||
|
}
|
||
|
]
|
||
|
})
|
||
|
|
||
|
const expected = `SELECT 1 + "A" AS "B" FROM "howdy"`
|
||
|
const actual = ast.toString()
|
||
|
|
||
|
// console.log(actual)
|
||
|
|
||
|
expect(actual).to.equal(expected)
|
||
|
})
|
||
|
|
||
|
it('query with 2x func', () => {
|
||
|
const ast = InfluxQL({
|
||
|
"fields": [
|
||
|
{
|
||
|
"column": {
|
||
|
"expr": "binary",
|
||
|
"op": "/",
|
||
|
"lhs": {
|
||
|
"expr": "call",
|
||
|
"name": "derivative",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "reference",
|
||
|
"val": "field1"
|
||
|
},
|
||
|
{
|
||
|
"expr": "literal",
|
||
|
"val": "1h",
|
||
|
"type": "duration"
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "call",
|
||
|
"name": "derivative",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "reference",
|
||
|
"val": "field2"
|
||
|
},
|
||
|
{
|
||
|
"expr": "literal",
|
||
|
"val": "1h",
|
||
|
"type": "duration"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"sources": [
|
||
|
{
|
||
|
"database": "",
|
||
|
"retentionPolicy": "",
|
||
|
"name": "myseries",
|
||
|
"type": "measurement"
|
||
|
}
|
||
|
]
|
||
|
})
|
||
|
|
||
|
const expected = `SELECT derivative("field1", 1h) / derivative("field2", 1h) FROM "myseries"`
|
||
|
const actual = ast.toString()
|
||
|
|
||
|
// console.log('actual', actual)
|
||
|
// console.log('expected', expected)
|
||
|
|
||
|
expect(actual).to.equal(expected)
|
||
|
})
|
||
|
|
||
|
it('query with where and groupby', () => {
|
||
|
const ast = InfluxQL({
|
||
|
"condition": {
|
||
|
"expr": "binary",
|
||
|
"op": "AND",
|
||
|
"lhs": {
|
||
|
"expr": "binary",
|
||
|
"op": "AND",
|
||
|
"lhs": {
|
||
|
"expr": "binary",
|
||
|
"op": "=~",
|
||
|
"lhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "cluster_id"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "/^23/",
|
||
|
"type": "regex"
|
||
|
}
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "binary",
|
||
|
"op": "=",
|
||
|
"lhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "host"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "prod-2ccccc04-us-east-1-data-3",
|
||
|
"type": "string"
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "binary",
|
||
|
"op": "\u003e",
|
||
|
"lhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "time"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "binary",
|
||
|
"op": "-",
|
||
|
"lhs": {
|
||
|
"expr": "call",
|
||
|
"name": "now"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "15m",
|
||
|
"type": "duration"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
"fields": [
|
||
|
{
|
||
|
"alias": "max_cpus",
|
||
|
"column": {
|
||
|
"expr": "call",
|
||
|
"name": "max",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "reference",
|
||
|
"val": "n_cpus"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
"column": {
|
||
|
"expr": "call",
|
||
|
"name": "non_negative_derivative",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "call",
|
||
|
"name": "median",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "reference",
|
||
|
"val": "n_users"
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"expr": "literal",
|
||
|
"val": "5m",
|
||
|
"type": "duration"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"groupBy": {
|
||
|
"time": {
|
||
|
"interval": "15m",
|
||
|
"offset": "10s"
|
||
|
},
|
||
|
"tags": [
|
||
|
"host",
|
||
|
"tag_x"
|
||
|
],
|
||
|
"fill": "10"
|
||
|
},
|
||
|
"sources": [
|
||
|
{
|
||
|
"database": "",
|
||
|
"retentionPolicy": "",
|
||
|
"name": "system",
|
||
|
"type": "measurement"
|
||
|
}
|
||
|
]
|
||
|
})
|
||
|
|
||
|
const expected = "SELECT max(\"n_cpus\") AS \"max_cpus\", non_negative_derivative(median(\"n_users\"), 5m) FROM \"system\" WHERE \"cluster_id\" =~ /^23/ AND \"host\" = 'prod-2ccccc04-us-east-1-data-3' AND time > now() - 15m GROUP BY time(15m, 10s),host,tag_x fill(10)"
|
||
|
const actual = ast.toString()
|
||
|
|
||
|
// console.log('actual ', actual)
|
||
|
// console.log('expected', expected)
|
||
|
|
||
|
expect(actual).to.equal(expected)
|
||
|
})
|
||
|
|
||
|
it('query with orderby and limit', () => {
|
||
|
const ast = InfluxQL({
|
||
|
"condition": {
|
||
|
"expr": "binary",
|
||
|
"op": "AND",
|
||
|
"lhs": {
|
||
|
"expr": "binary",
|
||
|
"op": "=",
|
||
|
"lhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "host"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "hosta.influxdb.org",
|
||
|
"type": "string"
|
||
|
}
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "binary",
|
||
|
"op": "\u003e",
|
||
|
"lhs": {
|
||
|
"expr": "reference",
|
||
|
"val": "time"
|
||
|
},
|
||
|
"rhs": {
|
||
|
"expr": "literal",
|
||
|
"val": "2017-02-07T01:43:02.245407693Z",
|
||
|
"type": "string"
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
"fields": [
|
||
|
{
|
||
|
"column": {
|
||
|
"expr": "call",
|
||
|
"name": "mean",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "reference",
|
||
|
"val": "field1"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
"column": {
|
||
|
"expr": "call",
|
||
|
"name": "sum",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "reference",
|
||
|
"val": "field2"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
"alias": "field_x",
|
||
|
"column": {
|
||
|
"expr": "call",
|
||
|
"name": "count",
|
||
|
"args": [
|
||
|
{
|
||
|
"expr": "reference",
|
||
|
"val": "field3"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"groupBy": {
|
||
|
"time": {
|
||
|
"interval": "10h"
|
||
|
}
|
||
|
},
|
||
|
"limits": {
|
||
|
"limit": 20,
|
||
|
"offset": 10
|
||
|
},
|
||
|
"orderbys": [
|
||
|
{
|
||
|
"name": "time",
|
||
|
"order": "descending"
|
||
|
}
|
||
|
],
|
||
|
"sources": [
|
||
|
{
|
||
|
"database": "",
|
||
|
"retentionPolicy": "",
|
||
|
"name": "myseries",
|
||
|
"type": "measurement"
|
||
|
}
|
||
|
]
|
||
|
})
|
||
|
|
||
|
const expected = `SELECT mean("field1"), sum("field2"), count("field3") AS "field_x" FROM "myseries" WHERE "host" = 'hosta.influxdb.org' AND time > '2017-02-07T01:43:02.245407693Z' GROUP BY time(10h) ORDER BY time DESC LIMIT 20 OFFSET 10`
|
||
|
const actual = ast.toString()
|
||
|
|
||
|
// console.log('actual ', actual)
|
||
|
// console.log('expected', expected)
|
||
|
|
||
|
expect(actual).to.equal(expected)
|
||
|
})
|
||
|
})
|