pub struct PushDownLeafProjections {}Expand description
Pushes extraction projections down through schema-preserving nodes towards
leaf nodes (pass 2 of 2, after ExtractLeafExpressions).
Handles two types of projections:
- Pure extraction projections (all
__datafusion_extractedaliases + columns): pushes through Filter/Sort/Limit, merges into existing projections, or routes into multi-input node inputs (Join, SubqueryAlias, etc.) - Mixed projections (user projections containing
MoveTowardsLeafNodessub-expressions): splits into a recovery projection + extraction projection, then pushes the extraction projection down.
§Example: Pushing through a Filter
After pass 1, the extraction projection sits directly below the filter:
Projection: id, user <-- recovery
Filter: __datafusion_extracted_1 = 'active'
Projection: user['status'] AS __datafusion_extracted_1, id, user <-- extraction
TableScan: t [id, user]Pass 2 pushes the extraction projection through the recovery and filter,
and a subsequent OptimizeProjections pass removes the (now-redundant)
recovery projection:
Filter: __datafusion_extracted_1 = 'active'
Projection: user['status'] AS __datafusion_extracted_1, id, user <-- extraction (pushed down)
TableScan: t [id, user]Implementations§
Trait Implementations§
Source§impl Debug for PushDownLeafProjections
impl Debug for PushDownLeafProjections
Source§impl Default for PushDownLeafProjections
impl Default for PushDownLeafProjections
Source§fn default() -> PushDownLeafProjections
fn default() -> PushDownLeafProjections
Returns the “default value” for a type. Read more
Source§impl OptimizerRule for PushDownLeafProjections
impl OptimizerRule for PushDownLeafProjections
Source§fn apply_order(&self) -> Option<ApplyOrder>
fn apply_order(&self) -> Option<ApplyOrder>
How should the rule be applied by the optimizer? See comments on
ApplyOrder for details. Read moreSource§fn rewrite(
&self,
plan: LogicalPlan,
config: &dyn OptimizerConfig,
) -> Result<Transformed<LogicalPlan>>
fn rewrite( &self, plan: LogicalPlan, config: &dyn OptimizerConfig, ) -> Result<Transformed<LogicalPlan>>
Try to rewrite
plan to an optimized form, returning Transformed::yes
if the plan was rewritten and Transformed::no if it was not. Read moreSource§fn supports_rewrite(&self) -> bool
fn supports_rewrite(&self) -> bool
👎Deprecated since 47.0.0:
This method is no longer used
Does this rule support rewriting owned plans (rather than by reference)?
Auto Trait Implementations§
impl Freeze for PushDownLeafProjections
impl RefUnwindSafe for PushDownLeafProjections
impl Send for PushDownLeafProjections
impl Sync for PushDownLeafProjections
impl Unpin for PushDownLeafProjections
impl UnsafeUnpin for PushDownLeafProjections
impl UnwindSafe for PushDownLeafProjections
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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