DefaultPhysicalPlanner

Struct DefaultPhysicalPlanner 

Source
pub struct DefaultPhysicalPlanner {
    extension_planners: Vec<Arc<dyn ExtensionPlanner + Send + Sync>>,
}
Expand description

Default single node physical query planner that converts a LogicalPlan to an ExecutionPlan suitable for execution.

This planner will first flatten the LogicalPlan tree via a depth first approach, which allows it to identify the leaves of the tree.

Tasks are spawned from these leaves and traverse back up the tree towards the root, converting each LogicalPlan node it reaches into their equivalent ExecutionPlan node. When these tasks reach a common node, they will terminate until the last task reaches the node which will then continue building up the tree.

Up to planning_concurrency tasks are buffered at once to execute concurrently.

Fields§

§extension_planners: Vec<Arc<dyn ExtensionPlanner + Send + Sync>>

Implementations§

Source§

impl DefaultPhysicalPlanner

Source

pub fn with_extension_planners( extension_planners: Vec<Arc<dyn ExtensionPlanner + Send + Sync>>, ) -> Self

Create a physical planner that uses extension_planners to plan user-defined logical nodes LogicalPlan::Extension. The planner uses the first ExtensionPlanner to return a non-None plan.

Source

async fn create_initial_plan( &self, logical_plan: &LogicalPlan, session_state: &SessionState, ) -> Result<Arc<dyn ExecutionPlan>>

Create a physical plan from a logical plan

Source

async fn task_helper<'a>( &'a self, leaf_starter_index: usize, flat_tree: Arc<Vec<LogicalNode<'a>>>, session_state: &'a SessionState, ) -> Result<Option<Arc<dyn ExecutionPlan>>>

These tasks start at a leaf and traverse up the tree towards the root, building an ExecutionPlan as they go. When they reach a node with two or more children, they append their current result (a child of the parent node) to the children vector, and if this is sufficient to create the parent then continues traversing the tree to create nodes. Otherwise, the task terminates.

Source

async fn map_logical_node_to_physical( &self, node: &LogicalPlan, session_state: &SessionState, children: ChildrenContainer, ) -> Result<Arc<dyn ExecutionPlan>>

Given a single LogicalPlan node, map it to its physical ExecutionPlan counterpart.

Source

fn create_grouping_physical_expr( &self, group_expr: &[Expr], input_dfschema: &DFSchema, input_schema: &Schema, session_state: &SessionState, ) -> Result<PhysicalGroupBy>

Source§

impl DefaultPhysicalPlanner

Source

async fn handle_explain_or_analyze( &self, logical_plan: &LogicalPlan, session_state: &SessionState, ) -> Result<Option<Arc<dyn ExecutionPlan>>>

Handles capturing the various plans for EXPLAIN queries

Returns Some(plan) if optimized, and None if logical_plan was not an explain (and thus needs to be optimized as normal)

Source

async fn handle_explain( &self, e: &Explain, session_state: &SessionState, ) -> Result<Arc<dyn ExecutionPlan>>

Planner for LogicalPlan::Explain

Source

async fn handle_analyze( &self, a: &Analyze, session_state: &SessionState, ) -> Result<Arc<dyn ExecutionPlan>>

Source

pub fn optimize_physical_plan<F>( &self, plan: Arc<dyn ExecutionPlan>, session_state: &SessionState, observer: F, ) -> Result<Arc<dyn ExecutionPlan>>

Optimize a physical plan by applying each physical optimizer, calling observer(plan, optimizer after each one)

Source

fn plan_describe( &self, table_schema: Arc<Schema>, output_schema: Arc<Schema>, ) -> Result<Arc<dyn ExecutionPlan>>

Source

fn create_project_physical_exec( &self, session_state: &SessionState, input_exec: Arc<dyn ExecutionPlan>, input: &Arc<LogicalPlan>, expr: &[Expr], ) -> Result<Arc<dyn ExecutionPlan>>

Source

fn try_plan_async_exprs( &self, num_input_columns: usize, physical_expr: PlannedExprResult, schema: &Schema, ) -> Result<PlanAsyncExpr>

Trait Implementations§

Source§

impl Default for DefaultPhysicalPlanner

Source§

fn default() -> DefaultPhysicalPlanner

Returns the “default value” for a type. Read more
Source§

impl PhysicalPlanner for DefaultPhysicalPlanner

Source§

fn create_physical_plan<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, logical_plan: &'life1 LogicalPlan, session_state: &'life2 SessionState, ) -> Pin<Box<dyn Future<Output = Result<Arc<dyn ExecutionPlan>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Create a physical plan from a logical plan

Source§

fn create_physical_expr( &self, expr: &Expr, input_dfschema: &DFSchema, session_state: &SessionState, ) -> Result<Arc<dyn PhysicalExpr>>

Create a physical expression from a logical expression suitable for evaluation

e: the expression to convert

input_dfschema: the logical plan schema for evaluating e

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,