mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-04-26 14:08:29 -05:00
c0553c7273
* enhancement: add more kql spec tests and simplify ast normalization * enhancement: kql parser error if query starts with AND * enhancement: add kql docs and support for date and time only dateTimeRestriction queries * enhancement: add the ability to decide how kql nodes get connected connecting nodes (with edges) seem straight forward when not using group, the default connection for nodes with the same node is always OR. THis only applies for first level nodes, for grouped nodes it is defined differently. The KQL docs are saying, nodes inside a grouped node, with the same key are connected by a AND edge. * enhancement: explicit error handling for falsy group nodes and queries with leading binary operator * enhancement: use optimized grammar for kql parser and toolify pigeon * enhancement: simplify error handling * fix: kql implicit 'AND' and 'OR' follows the ms html spec instead of the pdf spec
108 lines
1.9 KiB
Go
108 lines
1.9 KiB
Go
// Package ast provides available ast nodes.
|
|
package ast
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// Node represents abstract syntax tree node
|
|
type Node interface {
|
|
Location() *Location
|
|
}
|
|
|
|
// Position represents a specific location in the source
|
|
type Position struct {
|
|
Line int
|
|
Column int
|
|
}
|
|
|
|
// Location represents the location of a node in the AST
|
|
type Location struct {
|
|
Start Position `json:"start"`
|
|
End Position `json:"end"`
|
|
Source *string `json:"source,omitempty"`
|
|
}
|
|
|
|
// Base contains shared node attributes
|
|
// each node should inherit from this
|
|
type Base struct {
|
|
Loc *Location
|
|
}
|
|
|
|
// Location is the source location of the Node
|
|
func (b *Base) Location() *Location { return b.Loc }
|
|
|
|
// Ast represents the query - node structure as abstract syntax tree
|
|
type Ast struct {
|
|
*Base
|
|
Nodes []Node `json:"body"`
|
|
}
|
|
|
|
// StringNode represents a string value
|
|
type StringNode struct {
|
|
*Base
|
|
Key string
|
|
Value string
|
|
}
|
|
|
|
// BooleanNode represents a bool value
|
|
type BooleanNode struct {
|
|
*Base
|
|
Key string
|
|
Value bool
|
|
}
|
|
|
|
// DateTimeNode represents a time.Time value
|
|
type DateTimeNode struct {
|
|
*Base
|
|
Key string
|
|
Operator *OperatorNode
|
|
Value time.Time
|
|
}
|
|
|
|
// OperatorNode represents an operator value like
|
|
// AND, OR, NOT, =, <= ... and so on
|
|
type OperatorNode struct {
|
|
*Base
|
|
Value string
|
|
}
|
|
|
|
// GroupNode represents a collection of many grouped nodes
|
|
type GroupNode struct {
|
|
*Base
|
|
Key string
|
|
Nodes []Node
|
|
}
|
|
|
|
// NodeKey tries to return the node key
|
|
func NodeKey(n Node) string {
|
|
switch node := n.(type) {
|
|
case *StringNode:
|
|
return node.Key
|
|
case *DateTimeNode:
|
|
return node.Key
|
|
case *BooleanNode:
|
|
return node.Key
|
|
case *GroupNode:
|
|
return node.Key
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
// NodeValue tries to return the node key
|
|
func NodeValue(n Node) interface{} {
|
|
switch node := n.(type) {
|
|
case *StringNode:
|
|
return node.Value
|
|
case *DateTimeNode:
|
|
return node.Value
|
|
case *BooleanNode:
|
|
return node.Value
|
|
case *GroupNode:
|
|
return node.Nodes
|
|
default:
|
|
return ""
|
|
}
|
|
}
|