Documentation ¶
Index ¶
- Constants
- func CanBuildDefaultSelectExecutionPlan(lp *LogicalPlan, reg udf.FunctionRegistry) bool
- func CanBuildFilterPlan(lp *LogicalPlan, reg udf.FunctionRegistry) bool
- func CanBuildGroupbyExecutionPlan(lp *LogicalPlan, reg udf.FunctionRegistry) bool
- func EvaluateFoldable(expr parser.Expression, reg udf.FunctionRegistry) (data.Value, error)
- func EvaluateOnInput(expr parser.Expression, input data.Value, reg udf.FunctionRegistry) (data.Value, error)
- type Evaluator
- type FlatExpression
- type LogicalPlan
- type PhysicalPlan
- type VolatilityType
Constants ¶
const ( // UnknownVolatility describes an unset value. This is not // a valid return value for FlatExpression.Volatility(). UnknownVolatility = iota // Volatile expressions can do anything, in particular return a // different result on every call Volatile // Stable expressions return the same result for the same input // values within a single statement execution Stable // Immutable expressions return the same result for the same input // values forever. One good hint to distinguish between Stable // and Immutable is that (in PostgreSQL) Immutable functions can // be used in functional indexes, while Stable functions can't. Immutable )
const ( MaxRangeTuples float64 = 1<<20 - 1 MaxRangeSec float64 = 60 * 60 * 24 MaxRangeMillisec float64 = 60 * 60 * 24 * 1000 )
Variables ¶
This section is empty.
Functions ¶
func CanBuildDefaultSelectExecutionPlan ¶
func CanBuildDefaultSelectExecutionPlan(lp *LogicalPlan, reg udf.FunctionRegistry) bool
CanBuildDefaultSelectExecutionPlan checks whether the given statement allows to use an defaultSelectExecutionPlan.
func CanBuildFilterPlan ¶
func CanBuildFilterPlan(lp *LogicalPlan, reg udf.FunctionRegistry) bool
CanBuildFilterPlan checks whether the given statement allows to use a filterPlan.
func CanBuildGroupbyExecutionPlan ¶
func CanBuildGroupbyExecutionPlan(lp *LogicalPlan, reg udf.FunctionRegistry) bool
CanBuildGroupbyExecutionPlan checks whether the given statement allows to use an groupbyExecutionPlan.
func EvaluateFoldable ¶
func EvaluateFoldable(expr parser.Expression, reg udf.FunctionRegistry) (data.Value, error)
EvaluateFoldable evaluates a foldable expression, i.e., one that is independent from the input row. Note that foldable is not necessarily equivalent to constant (e.g., the expression `random()` is foldable, but not constant), and also note that this function should not be used for frequent evaluation of the same expression due to performance reasons.
func EvaluateOnInput ¶
func EvaluateOnInput(expr parser.Expression, input data.Value, reg udf.FunctionRegistry) (data.Value, error)
EvaluateOnInput evaluates a (not necessarily foldable) expression, given a Map that represents a row of data.
Types ¶
type Evaluator ¶
type Evaluator interface { // Eval evaluates the expression that this Evaluator represents // on the given input data. Note that in order to deal with joins and // meta information such as timestamps properly, the input data must have // the shape: // {"alias_1": {"col_0": ..., "col_1": ...}, // "alias_1:meta:x": (meta datum "x" for alias_1's row), // "alias_2": {"col_0": ..., "col_1": ...}, // "alias_2:meta:x": (meta datum "x" for alias_2's row), // ...} // and every caller (in particular all execution plans) // must ensure that the data has this shape even if there's only one input // stream. // // Eval must NOT modify the input. Eval(input data.Value) (data.Value, error) }
An Evaluator represents an expression such as `colX + 2` or `t1:col AND t2:col` and can be evaluated, given the actual data contained in one row.
func ExpressionToEvaluator ¶
func ExpressionToEvaluator(ast FlatExpression, reg udf.FunctionRegistry) (Evaluator, error)
ExpressionToEvaluator takes one of the Expression structs that result from parsing a BQL Expression (see parser/ast.go) and turns it into an Evaluator that can be used to evaluate an expression given a particular input Value.
type FlatExpression ¶
type FlatExpression interface { // Repr returns a string representation that can be used to // identify this expression (e.g., "stream:col+3") and used as // a dictionary key for finding duplicate expressions. Repr() string // Columns returns a list of rowValues used in this expression. Columns() []rowValue // Volatility returns the volatility of an expression. Volatility() VolatilityType // ContainsWildcard returns whether this expression contains // a wildcard symbol. ContainsWildcard() bool }
FlatExpression represents an expression that can be completely evaluated on a single row and results in an unnamed value. In particular, it cannot contain/represent a call to an aggregate function.
func ParserExprToFlatExpr ¶
func ParserExprToFlatExpr(e parser.Expression, reg udf.FunctionRegistry) (FlatExpression, error)
ParserExprToFlatExpr converts an expression obtained by the BQL parser to a FlatExpression, i.e., there are only expressions contained that can be evaluated on one single row and return an (unnamed) value. In particular, this fails for Expressions containing aggregate functions.
func ParserExprToMaybeAggregate ¶
func ParserExprToMaybeAggregate(e parser.Expression, aggIdx int, reg udf.FunctionRegistry) (FlatExpression, map[string]FlatExpression, error)
ParserExprToMaybeAggregate converts an expression obtained by the BQL parser into a data structure where the aggregate and the non-aggregate parts are separated.
type LogicalPlan ¶
type LogicalPlan struct { GroupingStmt bool EmitterType parser.Emitter EmitterLimit int64 EmitterSampling float64 EmitterSamplingType parser.EmitterSamplingType Projections []aliasedExpression parser.WindowedFromAST Filter FlatExpression GroupList []FlatExpression parser.HavingAST }
LogicalPlan represents a parsed and analyzed version of a SELECT statement. A LogicalPlan as returned by `Analyze` should not contain logical errors such as "... must appear in GROUP BY clause" etc.
func Analyze ¶
func Analyze(s parser.SelectStmt, reg udf.FunctionRegistry) (*LogicalPlan, error)
Analyze checks the given SELECT statement for logical errors (references to unknown tables etc.) and creates a LogicalPlan that is internally consistent.
func (*LogicalPlan) LogicalOptimize ¶
func (lp *LogicalPlan) LogicalOptimize() (*LogicalPlan, error)
LogicalOptimize does nothing at the moment. In the future, logical optimizations (evaluation of foldable terms etc.) can be added here.
func (*LogicalPlan) MakePhysicalPlan ¶
func (lp *LogicalPlan) MakePhysicalPlan(reg udf.FunctionRegistry) (PhysicalPlan, error)
MakePhysicalPlan creates a physical execution plan that is able to deal with the statement under consideration.
type PhysicalPlan ¶
type PhysicalPlan interface { // Process must be called whenever a new tuple arrives in // the input stream. It will return a list of data.Map // items where each of these items is to be emitted as // a tuple. It is the caller's task to create those tuples // and set appropriate meta information such as timestamps. // // Process must NOT modify any field of the input tuple when its // core.TFShared flag is set. To modify the tuple, create a shallow copy of // it. Moreover, when Tuple.Data field is cached in the plan, // core.TFSharedData flag of the input tuple must be set and the plan must // not modify the Data. // // NB. Process is not thread-safe, i.e., it must be called in // a single-threaded context. Process(input *core.Tuple) ([]data.Map, error) }
PhysicalPlan is a physical interface that is capable of computing the data that needs to be emitted into an output stream when a new tuple arrives in the input stream.
func NewDefaultSelectExecutionPlan ¶
func NewDefaultSelectExecutionPlan(lp *LogicalPlan, reg udf.FunctionRegistry) (PhysicalPlan, error)
NewDefaultSelectExecutionPlan creates a plan that follows the theoretical processing model. It does not support aggregration.
After each tuple arrives,
- compute the contents of the current window using the specified window size/type,
- perform a SELECT query on that data,
- compute the data that need to be emitted by comparison with the previous run's results.
func NewFilterPlan ¶
func NewFilterPlan(lp *LogicalPlan, reg udf.FunctionRegistry) (PhysicalPlan, error)
NewFilterPlan creates a fast and simple plan for the case where the BQL statement has an Rstream emitter, a [RANGE 1 TUPLES] and (maybe) a WHERE clause (no GROUP BY/aggregate functions). In that case we can perform the check with less memory and faster than the default plan.
func NewGroupbyExecutionPlan ¶
func NewGroupbyExecutionPlan(lp *LogicalPlan, reg udf.FunctionRegistry) (PhysicalPlan, error)
NewGroupbyExecutionPlan builds a plan that follows the theoretical processing model. It supports only statements that use aggregation.
After each tuple arrives,
- compute the contents of the current window using the specified window size/type,
- perform a SELECT query on that data,
- compute the data that need to be emitted by comparison with the previous run's results.
type VolatilityType ¶
type VolatilityType int
VolatilityType describes the volatility of an expression as per the PostgreSQL classification.
func (VolatilityType) String ¶
func (v VolatilityType) String() string