292 lines
6.5 KiB
Go
292 lines
6.5 KiB
Go
package influxql
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// DataType represents the primitive data types available in InfluxQL.
|
|
type DataType string
|
|
|
|
const (
|
|
Number = DataType("number")
|
|
Boolean = DataType("boolean")
|
|
String = DataType("string")
|
|
Time = DataType("time")
|
|
Duration = DataType("duration")
|
|
)
|
|
|
|
// Node represents a node in the InfluxDB abstract syntax tree.
|
|
type Node interface {
|
|
node()
|
|
}
|
|
|
|
func (_ *Query) node() {}
|
|
func (_ Statements) node() {}
|
|
|
|
func (_ *SelectStatement) node() {}
|
|
func (_ *DeleteStatement) node() {}
|
|
func (_ *ListSeriesStatement) node() {}
|
|
func (_ *DropSeriesStatement) node() {}
|
|
func (_ *ListContinuousQueriesStatement) node() {}
|
|
func (_ *CreateContinuousQueryStatement) node() {}
|
|
func (_ *DropContinuousQueryStatement) node() {}
|
|
|
|
func (_ Fields) node() {}
|
|
func (_ *Field) node() {}
|
|
func (_ Dimensions) node() {}
|
|
func (_ *Dimension) node() {}
|
|
func (_ *Series) node() {}
|
|
func (_ *InnerJoin) node() {}
|
|
func (_ *Merge) node() {}
|
|
func (_ *VarRef) node() {}
|
|
func (_ *Call) node() {}
|
|
func (_ *NumberLiteral) node() {}
|
|
func (_ *StringLiteral) node() {}
|
|
func (_ *BooleanLiteral) node() {}
|
|
func (_ *TimeLiteral) node() {}
|
|
func (_ *DurationLiteral) node() {}
|
|
func (_ *BinaryExpr) node() {}
|
|
|
|
// Query represents a collection of order statements.
|
|
type Query struct {
|
|
Statements Statements
|
|
}
|
|
|
|
// Statements represents a list of statements.
|
|
type Statements []Statement
|
|
|
|
// Statement represents a single command in InfluxQL.
|
|
type Statement interface {
|
|
Node
|
|
stmt()
|
|
}
|
|
|
|
func (_ *SelectStatement) stmt() {}
|
|
func (_ *DeleteStatement) stmt() {}
|
|
func (_ *ListSeriesStatement) stmt() {}
|
|
func (_ *DropSeriesStatement) stmt() {}
|
|
func (_ *ListContinuousQueriesStatement) stmt() {}
|
|
func (_ *CreateContinuousQueryStatement) stmt() {}
|
|
func (_ *DropContinuousQueryStatement) stmt() {}
|
|
|
|
// Expr represents an expression that can be evaluated to a value.
|
|
type Expr interface {
|
|
Node
|
|
expr()
|
|
}
|
|
|
|
func (_ *VarRef) expr() {}
|
|
func (_ *Call) expr() {}
|
|
func (_ *NumberLiteral) expr() {}
|
|
func (_ *StringLiteral) expr() {}
|
|
func (_ *BooleanLiteral) expr() {}
|
|
func (_ *TimeLiteral) expr() {}
|
|
func (_ *DurationLiteral) expr() {}
|
|
func (_ *BinaryExpr) expr() {}
|
|
|
|
// Source represents a source of data for a statement.
|
|
type Source interface {
|
|
Node
|
|
source()
|
|
}
|
|
|
|
func (_ *Series) source() {}
|
|
func (_ *InnerJoin) source() {}
|
|
func (_ *Merge) source() {}
|
|
|
|
// SelectStatement represents a command for extracting data from the database.
|
|
type SelectStatement struct {
|
|
// Expressions returned from the selection.
|
|
Fields Fields
|
|
|
|
// Expressions used for grouping the selection.
|
|
Dimensions Dimensions
|
|
|
|
// Data source that fields are extracted from.
|
|
Source Source
|
|
|
|
// An expression evaluated on data point.
|
|
Condition Expr
|
|
|
|
// Maximum number of rows to be returned.
|
|
// Unlimited if zero.
|
|
Limit int
|
|
|
|
// Sort order.
|
|
Ascending bool
|
|
}
|
|
|
|
// DeleteStatement represents a command for removing data from the database.
|
|
type DeleteStatement struct {
|
|
// Data source that values are removed from.
|
|
Source Source
|
|
|
|
// An expression evaluated on data point.
|
|
Condition Expr
|
|
}
|
|
|
|
// ListSeriesStatement represents a command for listing series in the database.
|
|
type ListSeriesStatement struct{}
|
|
|
|
// DropSeriesStatement represents a command for removing a series from the database.
|
|
type DropSeriesStatement struct {
|
|
Name string
|
|
}
|
|
|
|
// ListContinuousQueriesStatement represents a command for listing continuous queries.
|
|
type ListContinuousQueriesStatement struct{}
|
|
|
|
// CreateContinuousQueriesStatement represents a command for creating a continuous query.
|
|
type CreateContinuousQueryStatement struct {
|
|
Name string
|
|
Source *SelectStatement
|
|
Target string
|
|
}
|
|
|
|
// DropContinuousQueriesStatement represents a command for removing a continuous query.
|
|
type DropContinuousQueryStatement struct {
|
|
Name string
|
|
}
|
|
|
|
// Fields represents a list of fields.
|
|
type Fields []*Field
|
|
|
|
// Field represents an expression retrieved from a select statement.
|
|
type Field struct {
|
|
Expr Expr
|
|
Alias string
|
|
}
|
|
|
|
// Dimensions represents a list of dimensions.
|
|
type Dimensions []*Dimension
|
|
|
|
// Dimension represents an expression that a select statement is grouped by.
|
|
type Dimension struct {
|
|
Expr Expr
|
|
}
|
|
|
|
// Series represents a single series used as a datasource.
|
|
type Series struct {
|
|
Name string
|
|
}
|
|
|
|
// InnerJoin represents two datasources joined together.
|
|
type InnerJoin struct {
|
|
LHS Source
|
|
RHS Source
|
|
Condition Expr
|
|
}
|
|
|
|
// Merge represents a datasource created by merging two datasources.
|
|
type Merge struct {
|
|
LHS Source
|
|
RHS Source
|
|
Condition Expr
|
|
}
|
|
|
|
// VarRef represents a reference to a variable.
|
|
type VarRef struct {
|
|
Val string
|
|
}
|
|
|
|
// Call represents a function call.
|
|
type Call struct {
|
|
Name string
|
|
Args []Expr
|
|
}
|
|
|
|
// NumberLiteral represents a numeric literal.
|
|
type NumberLiteral struct {
|
|
Val float64
|
|
}
|
|
|
|
// BooleanLiteral represents a boolean literal.
|
|
type BooleanLiteral struct {
|
|
Val bool
|
|
}
|
|
|
|
// StringLiteral represents a string literal.
|
|
type StringLiteral struct {
|
|
Val string
|
|
}
|
|
|
|
// TimeLiteral represents a point-in-time literal.
|
|
type TimeLiteral struct {
|
|
Val time.Time
|
|
}
|
|
|
|
// DurationLiteral represents a duration literal.
|
|
type DurationLiteral struct {
|
|
Val time.Duration
|
|
}
|
|
|
|
// BinaryExpr represents an operation between two expressions.
|
|
type BinaryExpr struct {
|
|
Op Token
|
|
LHS Expr
|
|
RHS Expr
|
|
}
|
|
|
|
// Visitor can be called by Walk to traverse an AST hierarchy.
|
|
// The Visit() function is called once per node.
|
|
type Visitor interface {
|
|
Visit(Node) Visitor
|
|
}
|
|
|
|
// Walk traverses a node hierarchy in depth-first order.
|
|
func Walk(v Visitor, node Node) {
|
|
if v = v.Visit(node); v == nil {
|
|
return
|
|
}
|
|
|
|
switch n := node.(type) {
|
|
case *Query:
|
|
Walk(v, n.Statements)
|
|
|
|
case Statements:
|
|
for _, s := range n {
|
|
Walk(v, s)
|
|
}
|
|
|
|
case *SelectStatement:
|
|
Walk(v, n.Fields)
|
|
Walk(v, n.Dimensions)
|
|
Walk(v, n.Source)
|
|
Walk(v, n.Condition)
|
|
|
|
case Fields:
|
|
for _, c := range n {
|
|
Walk(v, c)
|
|
}
|
|
|
|
case *Field:
|
|
Walk(v, n.Expr)
|
|
|
|
case Dimensions:
|
|
for _, c := range n {
|
|
Walk(v, c)
|
|
}
|
|
|
|
case *Dimension:
|
|
Walk(v, n.Expr)
|
|
|
|
case *BinaryExpr:
|
|
Walk(v, n.LHS)
|
|
Walk(v, n.RHS)
|
|
|
|
case *Call:
|
|
for _, expr := range n.Args {
|
|
Walk(v, expr)
|
|
}
|
|
}
|
|
}
|
|
|
|
// WalkFunc traverses a node hierarchy in depth-first order.
|
|
func WalkFunc(node Node, fn func(Node)) {
|
|
Walk(walkFuncVisitor(fn), node)
|
|
}
|
|
|
|
type walkFuncVisitor func(Node)
|
|
|
|
func (fn walkFuncVisitor) Visit(n Node) Visitor { fn(n); return fn }
|