pub struct EliminateOuterJoin;Expand description
Attempt to replace outer joins with inner joins.
Outer joins are typically more expensive to compute at runtime than inner joins and prevent various forms of predicate pushdown and other optimizations, so removing them if possible is beneficial.
Inner joins filter out rows that do match. Outer joins pass rows that do not match padded with nulls. If there is a filter in the query that would filter any such null rows after the join the rows introduced by the outer join are filtered.
For example, in the select ... from a left join b on ... where b.xx = 100;
For rows when b.xx is null (as it would be after an outer join),
the b.xx = 100 predicate filters them out and there is no
need to produce null rows for output.
Generally, an outer join can be rewritten to inner join if the filters from the WHERE clause return false while any inputs are null and columns of those quals are come from nullable side of outer join.
Implementations§
source§impl EliminateOuterJoin
impl EliminateOuterJoin
pub fn new() -> EliminateOuterJoin
Trait Implementations§
source§impl Default for EliminateOuterJoin
impl Default for EliminateOuterJoin
source§fn default() -> EliminateOuterJoin
fn default() -> EliminateOuterJoin
source§impl OptimizerRule for EliminateOuterJoin
impl OptimizerRule for EliminateOuterJoin
Attempt to eliminate outer joins.
source§fn apply_order(&self) -> Option<ApplyOrder>
fn apply_order(&self) -> Option<ApplyOrder>
ApplyOrder for details. Read moresource§fn supports_rewrite(&self) -> bool
fn supports_rewrite(&self) -> bool
source§fn rewrite(
&self,
plan: LogicalPlan,
_config: &dyn OptimizerConfig,
) -> Result<Transformed<LogicalPlan>, DataFusionError>
fn rewrite( &self, plan: LogicalPlan, _config: &dyn OptimizerConfig, ) -> Result<Transformed<LogicalPlan>, DataFusionError>
plan to an optimized form, returning Transformed::yes
if the plan was rewritten and Transformed::no if it was not. Read moresource§fn try_optimize(
&self,
_plan: &LogicalPlan,
_config: &dyn OptimizerConfig,
) -> Result<Option<LogicalPlan>, DataFusionError>
fn try_optimize( &self, _plan: &LogicalPlan, _config: &dyn OptimizerConfig, ) -> Result<Option<LogicalPlan>, DataFusionError>
plan to an optimized form, returning None if the plan
cannot be optimized by this rule. Read moreAuto Trait Implementations§
impl Freeze for EliminateOuterJoin
impl RefUnwindSafe for EliminateOuterJoin
impl Send for EliminateOuterJoin
impl Sync for EliminateOuterJoin
impl Unpin for EliminateOuterJoin
impl UnwindSafe for EliminateOuterJoin
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
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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>
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>
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