Documentation ¶
Index ¶
- Constants
- Variables
- func CheckRequiredAttributes(node *PhysicalPlanNode) error
- func CheckSuccessorsMustRequire(node *PhysicalPlanNode) error
- func ClearRegisteredRules()
- func ComputeBounds(node Node) error
- func Formatted(p *Spec, opts ...FormatOption) fmt.Formatter
- func HasSideEffect(spec ProcedureSpec) bool
- func IndexOfNode(node Node, nodes []Node) int
- func RegisterLogicalRules(rules ...Rule)
- func RegisterParallelizeRules(rules ...Rule)
- func RegisterPhysicalRules(rules ...Rule)
- func RegisterProcedureSpec(k ProcedureKind, c CreateProcedureSpec, qks ...flux.OperationKind)
- func RegisterProcedureSpecWithSideEffect(k ProcedureKind, c CreateProcedureSpec, qks ...flux.OperationKind)
- func ReplaceNode(oldNode, newNode Node)
- func SetTriggerSpec(node Node) error
- func ValidatePhysicalPlan(plan *Spec) error
- func WalkPredecessors(roots []Node, visitFn func(node Node) error) error
- func WalkSuccessors(roots []Node, visitFn func(node Node) error) error
- type Administration
- type AfterAtLeastCountTriggerSpec
- type AfterProcessingTimeTriggerSpec
- type AfterWatermarkTriggerSpec
- type Bounds
- type BoundsAwareProcedureSpec
- type CollationAttr
- type Cost
- type CreateProcedureSpec
- type DefaultCost
- type Detailer
- type FormatOption
- type GeneratedYieldProcedureSpec
- type Location
- type LogicalNode
- func (e *LogicalNode) AddPredecessors(nodes ...Node)
- func (e *LogicalNode) AddSuccessors(nodes ...Node)
- func (b *LogicalNode) Bounds() *Bounds
- func (lpn *LogicalNode) CallStack() []interpreter.StackEntry
- func (e *LogicalNode) ClearPredecessors()
- func (e *LogicalNode) ClearSuccessors()
- func (lpn *LogicalNode) ID() NodeID
- func (lpn *LogicalNode) Kind() ProcedureKind
- func (e *LogicalNode) Predecessors() []Node
- func (lpn *LogicalNode) ProcedureSpec() ProcedureSpec
- func (lpn *LogicalNode) ReplaceSpec(newSpec ProcedureSpec) error
- func (b *LogicalNode) SetBounds(bounds *Bounds)
- func (lpn *LogicalNode) ShallowCopy() Node
- func (e *LogicalNode) Successors() []Node
- type LogicalOption
- type LogicalPlanner
- type NarrowTransformationTriggerSpec
- type Node
- func MergeToLogicalNode(top, bottom Node, procSpec ProcedureSpec) (Node, error)
- func MergeToPhysicalNode(top, bottom Node, procSpec PhysicalProcedureSpec) (Node, error)
- func ReplacePhysicalNodes(ctx context.Context, oldOutputNode, oldInputNode Node, name string, ...) Node
- func SwapPlanNodes(top, bottom Node) (Node, error)
- type NodeID
- type OrFinallyTriggerSpec
- type OutputAttributer
- type ParallelMergeAttribute
- type ParallelRunAttribute
- type PassThroughAttributer
- type Pattern
- func AnyMultiSuccessor() Pattern
- func AnySingleSuccessor() Pattern
- func MultiSuccessor(kind ProcedureKind, predecessors ...Pattern) Pattern
- func MultiSuccessorOneOf(kinds []ProcedureKind, predecessors ...Pattern) Pattern
- func PhysPat(pat Pattern) Pattern
- func SingleSuccessor(kind ProcedureKind, predecessors ...Pattern) Pattern
- func SingleSuccessorOneOf(kinds []ProcedureKind, predecessors ...Pattern) Pattern
- type PhysicalAttr
- type PhysicalAttributes
- type PhysicalOneKindPattern
- type PhysicalOption
- type PhysicalPlanNode
- func (e *PhysicalPlanNode) AddPredecessors(nodes ...Node)
- func (e *PhysicalPlanNode) AddSuccessors(nodes ...Node)
- func (b *PhysicalPlanNode) Bounds() *Bounds
- func (ppn *PhysicalPlanNode) CallStack() []interpreter.StackEntry
- func (e *PhysicalPlanNode) ClearPredecessors()
- func (e *PhysicalPlanNode) ClearSuccessors()
- func (ppn *PhysicalPlanNode) Cost(inStats []Statistics) (cost Cost, outStats Statistics)
- func (ppn *PhysicalPlanNode) ID() NodeID
- func (ppn *PhysicalPlanNode) Kind() ProcedureKind
- func (e *PhysicalPlanNode) Predecessors() []Node
- func (ppn *PhysicalPlanNode) ProcedureSpec() ProcedureSpec
- func (ppn *PhysicalPlanNode) ReplaceSpec(newSpec ProcedureSpec) error
- func (b *PhysicalPlanNode) SetBounds(bounds *Bounds)
- func (ppn *PhysicalPlanNode) ShallowCopy() Node
- func (e *PhysicalPlanNode) Successors() []Node
- type PhysicalPlanner
- type PhysicalProcedureSpec
- type Planner
- type PlannerBuilder
- type PostPhysicalValidator
- type ProcedureKind
- type ProcedureSpec
- type RepeatedTriggerSpec
- type RequiredAttributer
- type Rule
- type Spec
- type Statistics
- type TriggerAwareProcedureSpec
- type TriggerKind
- type TriggerSpec
- type UnionKindPattern
- type WindowSpec
- type YieldProcedureSpec
Constants ¶
const AnyKind = "*** any procedure kind ***"
const (
CollationKey = "collation"
)
const DefaultYieldName = "_result"
DefaultYieldName is the name of a result that doesn't have any name assigned.
const NextPlanNodeIDKey nodeIDKey = "NextPlanNodeID"
const ParallelMergeKey = "parallel-merge"
const ParallelRunKey = "parallel-run"
Variables ¶
var DefaultTriggerSpec = AfterWatermarkTriggerSpec{}
EmptyBounds is a time range containing only a single point
Functions ¶
func CheckRequiredAttributes ¶
func CheckRequiredAttributes(node *PhysicalPlanNode) error
CheckRequiredAttributes will check that if the given node requires any attributes from its predecessors, then they are provided, either directly or because a predecessor passes on the attribute from one of its own predecessors. If all requirements are met, nil is returned, otherwise an error wil an appopriate diagnostic is produced.
func CheckSuccessorsMustRequire ¶
func CheckSuccessorsMustRequire(node *PhysicalPlanNode) error
CheckSuccessorsMustRequire will return an error if the node has an output attribute that must be required by *all* successors, but there exists some node that does not require it.
E.g., the parallel-run attribute is like this in that it must be required by a merge node. This function will walk forward through successors to find the requiring node.
The desired effect here is that if an attribute must be required by successors, we walk forward through the graph and ensure that it is required on every branch that succeeds the given node, with ohly pass-through nodes in between.
func ClearRegisteredRules ¶
func ClearRegisteredRules()
func ComputeBounds ¶
ComputeBounds computes the time bounds for a plan node from the bounds of its predecessors.
func Formatted ¶
func Formatted(p *Spec, opts ...FormatOption) fmt.Formatter
Formatted accepts a plan.Spec and options, and returns a Formatter that can be used with the standard fmt package, e.g.,
fmt.Println(Formatted(plan, WithDetails())
func HasSideEffect ¶
func HasSideEffect(spec ProcedureSpec) bool
func IndexOfNode ¶
IndexOfNode is a utility function that will return the offset of the given node in the slice of nodes. This is useful to determine whether a node is the 1st or 2nd predecessor of some other node for example. Returns -1 if node not found.
func RegisterLogicalRules ¶
func RegisterLogicalRules(rules ...Rule)
RegisterLogicalRules registers the rule created by createFn with the logical plan.
func RegisterParallelizeRules ¶
func RegisterParallelizeRules(rules ...Rule)
RegisterParallelizationRule registers the rule created by createFn with the physical plan.
func RegisterPhysicalRules ¶
func RegisterPhysicalRules(rules ...Rule)
RegisterPhysicalRules registers the rule created by createFn with the physical plan.
func RegisterProcedureSpec ¶
func RegisterProcedureSpec(k ProcedureKind, c CreateProcedureSpec, qks ...flux.OperationKind)
RegisterProcedureSpec registers a new procedure with the specified kind. The call panics if the kind is not unique.
func RegisterProcedureSpecWithSideEffect ¶
func RegisterProcedureSpecWithSideEffect(k ProcedureKind, c CreateProcedureSpec, qks ...flux.OperationKind)
RegisterProcedureSpecWithSideEffect registers a new procedure that produces side effects
func ReplaceNode ¶
func ReplaceNode(oldNode, newNode Node)
ReplaceNode accepts two nodes and attaches all the predecessors of the old node to the new node.
S1 S2 S1 S2 \ / oldNode => newNode / \ / \ P1 P2 P1 P2
As is convention, newNode will not have any successors attached. The planner will take care of this.
func SetTriggerSpec ¶
func ValidatePhysicalPlan ¶
func WalkPredecessors ¶
WalkPredecessor visits every node in the plan rooted at `roots` in topological order, following predecessor links. If a cycle is detected, no node is visited and an error is returned.
Types ¶
type Administration ¶
type AfterAtLeastCountTriggerSpec ¶
type AfterAtLeastCountTriggerSpec struct {
Count int
}
func (AfterAtLeastCountTriggerSpec) Kind ¶
func (AfterAtLeastCountTriggerSpec) Kind() TriggerKind
type AfterProcessingTimeTriggerSpec ¶
func (AfterProcessingTimeTriggerSpec) Kind ¶
func (AfterProcessingTimeTriggerSpec) Kind() TriggerKind
type AfterWatermarkTriggerSpec ¶
func (AfterWatermarkTriggerSpec) Kind ¶
func (AfterWatermarkTriggerSpec) Kind() TriggerKind
type Bounds ¶
Bounds is a range of time
func FromFluxBounds ¶
func (*Bounds) Intersect ¶
Intersect returns the intersection of two bounds. It returns empty bounds if one of the input bounds are empty.
type BoundsAwareProcedureSpec ¶
BoundsAwareProcedureSpec is any procedure that modifies the time bounds of its data.
type CollationAttr ¶
CollationAttr is a physical attribute that describes the collation of the rows within a table. Note: the collation attribute does not say anything about how the tables in a stream are ordered.
func (*CollationAttr) Key ¶
func (ca *CollationAttr) Key() string
func (*CollationAttr) SatisfiedBy ¶
func (ca *CollationAttr) SatisfiedBy(attr PhysicalAttr) bool
func (*CollationAttr) String ¶
func (ca *CollationAttr) String() string
func (*CollationAttr) SuccessorsMustRequire ¶
func (ca *CollationAttr) SuccessorsMustRequire() bool
type CreateProcedureSpec ¶
type CreateProcedureSpec func(flux.OperationSpec, Administration) (ProcedureSpec, error)
CreateProcedureSpec creates a ProcedureSpec from an OperationSpec and Administration
type DefaultCost ¶
type DefaultCost struct { }
func (DefaultCost) Cost ¶
func (c DefaultCost) Cost(inStats []Statistics) (Cost, Statistics)
type Detailer ¶
type Detailer interface {
PlanDetails() string
}
Detailer provides an optional interface that ProcedureSpecs can implement. Implementors of this interface will have their details appear in the formatted output for a plan if the WithDetails() option is set.
type FormatOption ¶
type FormatOption func(*formatter)
func WithDetails ¶
func WithDetails() FormatOption
WithDetails returns a FormatOption that can be used to provide extra details in a formatted plan.
type GeneratedYieldProcedureSpec ¶
type GeneratedYieldProcedureSpec struct { DefaultCost Name string }
GeneratedYieldProcedureSpec provides a special planner-generated yield for queries that don't have explicit calls to yield().
func (*GeneratedYieldProcedureSpec) Copy ¶
func (y *GeneratedYieldProcedureSpec) Copy() ProcedureSpec
func (*GeneratedYieldProcedureSpec) Kind ¶
func (y *GeneratedYieldProcedureSpec) Kind() ProcedureKind
func (*GeneratedYieldProcedureSpec) YieldName ¶
func (y *GeneratedYieldProcedureSpec) YieldName() string
type LogicalNode ¶
type LogicalNode struct { Spec ProcedureSpec Source []interpreter.StackEntry // contains filtered or unexported fields }
LogicalNode consists of the input and output edges and a procedure spec that describes what the node does.
func CreateLogicalNode ¶
func CreateLogicalNode(id NodeID, spec ProcedureSpec) *LogicalNode
CreateLogicalNode creates a single logical plan node from a procedure spec. The newly created logical node has no incoming or outgoing edges.
func (*LogicalNode) AddPredecessors ¶
func (e *LogicalNode) AddPredecessors(nodes ...Node)
func (*LogicalNode) AddSuccessors ¶
func (e *LogicalNode) AddSuccessors(nodes ...Node)
func (*LogicalNode) CallStack ¶
func (lpn *LogicalNode) CallStack() []interpreter.StackEntry
CallStack returns the call stack that created this LogicalNode.
func (*LogicalNode) ClearPredecessors ¶
func (e *LogicalNode) ClearPredecessors()
func (*LogicalNode) ClearSuccessors ¶
func (e *LogicalNode) ClearSuccessors()
func (*LogicalNode) ID ¶
func (lpn *LogicalNode) ID() NodeID
ID returns a human-readable identifier unique to this plan.
func (*LogicalNode) Kind ¶
func (lpn *LogicalNode) Kind() ProcedureKind
Kind returns the kind of procedure performed by this plan node.
func (*LogicalNode) Predecessors ¶
func (e *LogicalNode) Predecessors() []Node
func (*LogicalNode) ProcedureSpec ¶
func (lpn *LogicalNode) ProcedureSpec() ProcedureSpec
ProcedureSpec returns the procedure spec for this plan node.
func (*LogicalNode) ReplaceSpec ¶
func (lpn *LogicalNode) ReplaceSpec(newSpec ProcedureSpec) error
func (*LogicalNode) ShallowCopy ¶
func (lpn *LogicalNode) ShallowCopy() Node
func (*LogicalNode) Successors ¶
func (e *LogicalNode) Successors() []Node
type LogicalOption ¶
type LogicalOption interface {
// contains filtered or unexported methods
}
LogicalOption is an option to configure the behavior of the logical plan.
func AddLogicalRules ¶
func AddLogicalRules(rules ...Rule) LogicalOption
func DisableIntegrityChecks ¶
func DisableIntegrityChecks() LogicalOption
DisableIntegrityChecks disables integrity checks in the logical planner.
func OnlyLogicalRules ¶
func OnlyLogicalRules(rules ...Rule) LogicalOption
OnlyLogicalRules produces a logical plan option that forces only a set of particular rules to be applied.
func RemoveLogicalRules ¶
func RemoveLogicalRules(rules ...string) LogicalOption
type LogicalPlanner ¶
type LogicalPlanner interface { CreateInitialPlan(spec *operation.Spec) (*Spec, error) Plan(context.Context, *Spec) (*Spec, error) }
LogicalPlanner translates a flux.Spec into a plan.Spec and applies any registered logical rules to the plan.
Logical planning should transform the plan in ways that are independent of actual physical algorithms used to implement operations, and independent of the actual data being processed.
func NewLogicalPlanner ¶
func NewLogicalPlanner(options ...LogicalOption) LogicalPlanner
NewLogicalPlanner returns a new logical plan with the given options. The plan will be configured to apply any logical rules that have been registered.
type NarrowTransformationTriggerSpec ¶
type NarrowTransformationTriggerSpec struct{}
func (NarrowTransformationTriggerSpec) Kind ¶
func (NarrowTransformationTriggerSpec) Kind() TriggerKind
type Node ¶
type Node interface { // ID returns an identifier for this plan node. ID() NodeID // Bounds returns the time bounds for this plan node. Bounds() *Bounds // Predecessors returns plan nodes executed immediately before this node. Predecessors() []Node // Successors returns plan nodes executed immediately after this node. Successors() []Node // ProcedureSpec returns the specification of the procedure represented by this node. ProcedureSpec() ProcedureSpec // ReplaceSpec replaces the procedure spec of this node with another. ReplaceSpec(ProcedureSpec) error // Kind returns the type of procedure represented by this node. Kind() ProcedureKind // CallStack returns the list of StackEntry values that created this // Node. A Node may have no associated call stack. This happens // when a Node is constructed from a planner rule and not from a // source location. CallStack() []interpreter.StackEntry // Helper methods for manipulating a plan // These methods are used during planning SetBounds(bounds *Bounds) AddSuccessors(...Node) AddPredecessors(...Node) ClearSuccessors() ClearPredecessors() ShallowCopy() Node }
Node defines the common interface for interacting with logical and physical plan nodes.
func MergeToLogicalNode ¶
func MergeToLogicalNode(top, bottom Node, procSpec ProcedureSpec) (Node, error)
MergeToLogicalNode merges top and bottom plan nodes into a new plan node, with the given procedure spec.
V1 V2 V1 V2 <-- successors \ / top mergedNode | ==> | bottom W | W
The returned node will have its predecessors set to the predecessors of "bottom", however, it's successors will not be set---it will be the responsibility of the plan to attach the merged node to its successors.
func MergeToPhysicalNode ¶
func MergeToPhysicalNode(top, bottom Node, procSpec PhysicalProcedureSpec) (Node, error)
func ReplacePhysicalNodes ¶
func ReplacePhysicalNodes(ctx context.Context, oldOutputNode, oldInputNode Node, name string, newSpec PhysicalProcedureSpec) Node
ReplacePhysicalNodes accepts a connected group of nodes that has a single output and a single input, and replaces them with a single node with the predecessors of the old input node. Note that the planner has a convention of connecting successors itself (rather than having the rules doing it) so the old output's successors remain unconnected.
func SwapPlanNodes ¶
SwapPlanNodes swaps two plan nodes and returns an equivalent sub-plan with the nodes swapped.
V1 V2 V1 V2 \ / A B | ==> | B copy of A | | W W
Note that successors of the original top node will not be updated, and the returned plan node will have no successors. It will be the responsibility of the plan to attach the swapped nodes to successors.
type OrFinallyTriggerSpec ¶
type OrFinallyTriggerSpec struct { Main TriggerSpec Finally TriggerSpec }
func (OrFinallyTriggerSpec) Kind ¶
func (OrFinallyTriggerSpec) Kind() TriggerKind
type OutputAttributer ¶
type OutputAttributer interface {
OutputAttributes() PhysicalAttributes
}
OutputAttributer is an interface to be implemented by PhysicalProcedureSpec implementations that produce output that has particular attributes.
type ParallelMergeAttribute ¶
type ParallelMergeAttribute struct {
Factor int
}
ParallelMergeAttribute means that the node accepts parallel data, merges the streams, and produces non-parallel data that covers the entire data source.
func (ParallelMergeAttribute) Key ¶
func (ParallelMergeAttribute) Key() string
func (ParallelMergeAttribute) PlanDetails ¶
func (a ParallelMergeAttribute) PlanDetails() string
func (ParallelMergeAttribute) SatisfiedBy ¶
func (a ParallelMergeAttribute) SatisfiedBy(attr PhysicalAttr) bool
func (ParallelMergeAttribute) String ¶
func (a ParallelMergeAttribute) String() string
func (ParallelMergeAttribute) SuccessorsMustRequire ¶
func (ParallelMergeAttribute) SuccessorsMustRequire() bool
type ParallelRunAttribute ¶
type ParallelRunAttribute struct {
Factor int
}
ParallelRunAttribute means the node executes in parallel when present. It accepts parallel data (a subset of the source) and produces parallel data.
func (ParallelRunAttribute) Key ¶
func (ParallelRunAttribute) Key() string
func (ParallelRunAttribute) SatisfiedBy ¶
func (a ParallelRunAttribute) SatisfiedBy(attr PhysicalAttr) bool
func (ParallelRunAttribute) String ¶
func (a ParallelRunAttribute) String() string
func (ParallelRunAttribute) SuccessorsMustRequire ¶
func (ParallelRunAttribute) SuccessorsMustRequire() bool
SuccessorsMustRequire implements the PhysicalAttribute interface. if a node produces parallel data, then all successors must require parallel data, otherwise there will be a plan error.
type PassThroughAttributer ¶
PassThroughAttributer is an interface to be implemented by PhysicalProcedureSpec implementations that allow attributes to propagate from input to output.
type Pattern ¶
type Pattern interface { // Roots returns the list of procedure kinds that may appear // at the "root" of the pattern. "Root" here means a node with // some predecessors. Roots() []ProcedureKind // Match returns true when the given node and its predecessors match // with this pattern. Match(Node) bool }
Pattern represents an operator tree pattern It can match itself against a query plan.
func AnyMultiSuccessor ¶
func AnyMultiSuccessor() Pattern
AnyMultiSuccessor returns a pattern that matches any node with any number of successors
func AnySingleSuccessor ¶
func AnySingleSuccessor() Pattern
AnySingleSuccessor returns a pattern that matches any node that has a single successor.
func MultiSuccessor ¶
func MultiSuccessor(kind ProcedureKind, predecessors ...Pattern) Pattern
MultiSuccessor returns a pattern that can match a plan node with the given ProcedureKind and whose predecessors match the given predecessor patterns. The matched node may have any number of successors, including zero.
func MultiSuccessorOneOf ¶
func MultiSuccessorOneOf(kinds []ProcedureKind, predecessors ...Pattern) Pattern
MultiSuccessorOneOf matches any plan node from a given set of ProcedureKind and whose predecessors match the given predecessor patterns. This is identical to MultiSuccessor, except for matching any pattern root from a set of ProcedureKinds.
func PhysPat ¶
PhysPat returns a pattern that matches a physical plan node with the given ProcedureKind and whose predecessors match the given predecessor patterns.
func SingleSuccessor ¶
func SingleSuccessor(kind ProcedureKind, predecessors ...Pattern) Pattern
SingleSuccessor returns a pattern that can match a plan node with the given ProcedureKind and whose predecessors match the given predecessor patterns. The matched node must have exactly one successor.
For example, to construct a pattern that matches a sort node that succeeds a join:
sort | join <=> join(A, B) |> sum() <=> MultiSuccessor(SortKind, SingleSuccessor(JoinKind, AnyMultiSuccessor(), AnyMultiSuccessor())) / \
A B
func SingleSuccessorOneOf ¶
func SingleSuccessorOneOf(kinds []ProcedureKind, predecessors ...Pattern) Pattern
SingleSuccessorOneOf matches any plan node from a given set of ProcedureKind and whose predecessors match the given predecessor patterns. This is identical to SingleSuccessor, except for matching any pattern root from a set of ProcedureKinds.
type PhysicalAttr ¶
type PhysicalAttr interface { String() string Key() string SuccessorsMustRequire() bool SatisfiedBy(attr PhysicalAttr) bool }
PhysicalAttr represents an attribute (collation, parallel execution) of a plan node.
func GetOutputAttribute ¶
func GetOutputAttribute(node Node, attrKey string) PhysicalAttr
GetOutputAttribute will return the attribute with the given key provided by the given plan node, traversing backwards through predecessors as needed for attributes that may pass through. E.g.,
sort |> filter
The "filter" node will still provide the collation attribute, even though it's the "sort" node that actually does the collating.
type PhysicalAttributes ¶
type PhysicalAttributes map[string]PhysicalAttr
PhysicalAttributes encapsulates any physical attributes of the result produced by a physical plan node, such as collation, etc.
type PhysicalOneKindPattern ¶
type PhysicalOneKindPattern struct {
// contains filtered or unexported fields
}
PhysicalOneKindPattern matches a physical operator pattern
func (PhysicalOneKindPattern) Match ¶
func (p PhysicalOneKindPattern) Match(node Node) bool
func (PhysicalOneKindPattern) Roots ¶
func (p PhysicalOneKindPattern) Roots() []ProcedureKind
type PhysicalOption ¶
type PhysicalOption interface {
// contains filtered or unexported methods
}
PhysicalOption is an option to configure the behavior of the physical plan.
func AddParallelRules ¶
func AddParallelRules(rules ...Rule) PhysicalOption
func DisableValidation ¶
func DisableValidation() PhysicalOption
DisableValidation disables validation in the physical planner.
func OnlyPhysicalRules ¶
func OnlyPhysicalRules(rules ...Rule) PhysicalOption
OnlyPhysicalRules produces a physical plan option that forces only a particular set of rules to be applied.
func RemovePhysicalRules ¶
func RemovePhysicalRules(rules ...string) PhysicalOption
func WithDefaultMemoryLimit ¶
func WithDefaultMemoryLimit(memBytes int64) PhysicalOption
WithDefaultMemoryLimit sets the default memory limit for plans generated by the plan. If the query spec explicitly sets a memory limit, that limit is used instead of the default.
type PhysicalPlanNode ¶
type PhysicalPlanNode struct { Spec PhysicalProcedureSpec Source []interpreter.StackEntry // The trigger spec defines how and when a transformation // sends its tables to downstream operators TriggerSpec TriggerSpec // contains filtered or unexported fields }
PhysicalPlanNode represents a physical operation in a plan.
func CreatePhysicalNode ¶
func CreatePhysicalNode(id NodeID, spec PhysicalProcedureSpec) *PhysicalPlanNode
CreatePhysicalNode creates a single physical plan node from a procedure spec. The newly created physical node has no incoming or outgoing edges.
func CreateUniquePhysicalNode ¶
func CreateUniquePhysicalNode(ctx context.Context, prefix string, spec PhysicalProcedureSpec) *PhysicalPlanNode
func (*PhysicalPlanNode) AddPredecessors ¶
func (e *PhysicalPlanNode) AddPredecessors(nodes ...Node)
func (*PhysicalPlanNode) AddSuccessors ¶
func (e *PhysicalPlanNode) AddSuccessors(nodes ...Node)
func (*PhysicalPlanNode) CallStack ¶
func (ppn *PhysicalPlanNode) CallStack() []interpreter.StackEntry
func (*PhysicalPlanNode) ClearPredecessors ¶
func (e *PhysicalPlanNode) ClearPredecessors()
func (*PhysicalPlanNode) ClearSuccessors ¶
func (e *PhysicalPlanNode) ClearSuccessors()
func (*PhysicalPlanNode) Cost ¶
func (ppn *PhysicalPlanNode) Cost(inStats []Statistics) (cost Cost, outStats Statistics)
Cost provides the self-cost (i.e., does not include the cost of its predecessors) for this plan node. Caller must provide statistics of predecessors to this node.
func (*PhysicalPlanNode) ID ¶
func (ppn *PhysicalPlanNode) ID() NodeID
ID returns a human-readable id for this plan node.
func (*PhysicalPlanNode) Kind ¶
func (ppn *PhysicalPlanNode) Kind() ProcedureKind
Kind returns the procedure kind for this plan node.
func (*PhysicalPlanNode) Predecessors ¶
func (e *PhysicalPlanNode) Predecessors() []Node
func (*PhysicalPlanNode) ProcedureSpec ¶
func (ppn *PhysicalPlanNode) ProcedureSpec() ProcedureSpec
ProcedureSpec returns the procedure spec for this plan node.
func (*PhysicalPlanNode) ReplaceSpec ¶
func (ppn *PhysicalPlanNode) ReplaceSpec(newSpec ProcedureSpec) error
func (*PhysicalPlanNode) ShallowCopy ¶
func (ppn *PhysicalPlanNode) ShallowCopy() Node
func (*PhysicalPlanNode) Successors ¶
func (e *PhysicalPlanNode) Successors() []Node
type PhysicalPlanner ¶
PhysicalPlanner performs transforms a logical plan to a physical plan, by applying any registered physical rules.
func NewPhysicalPlanner ¶
func NewPhysicalPlanner(options ...PhysicalOption) PhysicalPlanner
NewPhysicalPlanner creates a new physical plan with the specified options. The new plan will be configured to apply any physical rules that have been registered.
type PhysicalProcedureSpec ¶
type PhysicalProcedureSpec interface { Kind() ProcedureKind Copy() ProcedureSpec Cost(inStats []Statistics) (cost Cost, outStats Statistics) }
PhysicalProcedureSpec is similar to its logical counterpart but must provide a method to determine cost.
type PlannerBuilder ¶
type PlannerBuilder struct {
// contains filtered or unexported fields
}
PlannerBuilder provides clients with an easy way to create planners.
func (*PlannerBuilder) AddLogicalOptions ¶
func (pb *PlannerBuilder) AddLogicalOptions(lopt ...LogicalOption)
AddLogicalOptions lets callers specify attributes of the logical planner that will be part of the created planner.
func (*PlannerBuilder) AddPhysicalOptions ¶
func (pb *PlannerBuilder) AddPhysicalOptions(popt ...PhysicalOption)
AddPhysicalOptions lets callers specify attributes of the physical planner that will be part of the created planner.
func (PlannerBuilder) Build ¶
func (pb PlannerBuilder) Build() Planner
Build builds a planner with specified attributes.
type PostPhysicalValidator ¶
PostPhysicalValidator provides an interface that can be implemented by PhysicalProcedureSpecs for any validation checks to be performed post-physical planning.
type ProcedureSpec ¶
type ProcedureSpec interface { Kind() ProcedureKind Copy() ProcedureSpec }
ProcedureSpec specifies a query operation
type RepeatedTriggerSpec ¶
type RepeatedTriggerSpec struct {
Trigger TriggerSpec
}
func (RepeatedTriggerSpec) Kind ¶
func (RepeatedTriggerSpec) Kind() TriggerKind
type RequiredAttributer ¶
type RequiredAttributer interface {
RequiredAttributes() []PhysicalAttributes
}
RequiredAttributer is an interface to be implemented by PhysicalProcedureSpec implementations that require physical attributes to be provided by inputs. The return value here is a slice, since each input may be required to have a different set of attributes.
type Rule ¶
type Rule interface { // Name of this rule (must be unique). Name() string // Pattern for this rule to match against. Pattern() Pattern // Rewrite an operation into an equivalent one. // The returned node is the new root of the sub tree. // The boolean return value should be true if anything changed during the rewrite. Rewrite(context.Context, Node) (Node, bool, error) }
Rule is transformation rule for a query operation
type Spec ¶
type Spec struct { // Roots are the "sink" nodes in the plan, which have no successors. Roots map[Node]struct{} Resources flux.ResourceManagement Now time.Time }
Spec holds the result nodes of a query plan with associated metadata
func (*Spec) BottomUpWalk ¶
BottomUpWalk will execute f for each plan node in the Spec, starting from the sources, and only visiting a node after all its predecessors have been visited.
func (*Spec) CheckIntegrity ¶
CheckIntegrity checks the integrity of the plan, i.e.:
- node A is predecessor of B iff B is successor of A;
- there is no cycle.
This check only detects this problem (N2 is predecessor of R, but not viceversa):
N1 <----> R | N2 <-------
And this one (R is successor of N2, but not viceversa):
N1 <------- | |--> R N2 --------
But not this one, because N2 is not reachable from R (root):
N1 <------- |--> R N2 --------
func (*Spec) TopDownWalk ¶
TopDownWalk will execute f for each plan node in the Spec. It always visits a node before visiting its predecessors.
type Statistics ¶
type TriggerAwareProcedureSpec ¶
type TriggerAwareProcedureSpec interface {
TriggerSpec() TriggerSpec
}
type TriggerKind ¶
type TriggerKind int
const ( NarrowTransformation TriggerKind = iota AfterWatermark Repeated AfterProcessingTime AfterAtLeastCount OrFinally )
type TriggerSpec ¶
type TriggerSpec interface {
Kind() TriggerKind
}
type UnionKindPattern ¶
type UnionKindPattern struct {
// contains filtered or unexported fields
}
UnionKindPattern matches any one of a set of procedures that have a specified predecessor pattern.
For example, UnionKindPattern( { Proc1Kind, Proc2Kind }, { Pat1, Pat2 } ) will match either Proc1Kind { Pat1, Pat2 } or Proc2Kind { Pat1, Pat2 }
[ ProcedureKind ] / | ... \ pattern1 pattern2 ... patternK
func (UnionKindPattern) Match ¶
func (ukp UnionKindPattern) Match(node Node) bool
func (UnionKindPattern) Roots ¶
func (ukp UnionKindPattern) Roots() []ProcedureKind
type WindowSpec ¶
type WindowSpec struct { Every flux.Duration Period flux.Duration Offset flux.Duration Location Location }
func (WindowSpec) LoadLocation ¶
func (w WindowSpec) LoadLocation() (interval.Location, error)
type YieldProcedureSpec ¶
type YieldProcedureSpec interface {
YieldName() string
}
YieldProcedureSpec is a special procedure that has the side effect of returning a result to the client.