pub struct UnwrapCastInComparison {}Expand description
UnwrapCastInComparison attempts to remove casts from
comparisons to literals (ScalarValues) by applying the casts
to the literals if possible. It is inspired by the optimizer rule
UnwrapCastInBinaryComparison of Spark.
Removing casts often improves performance because:
- The cast is done once (to the literal) rather than to every value
- Can enable other optimizations such as predicate pushdown that don’t support casting
The rule is applied to expressions of the following forms:
cast(left_expr as data_type) comparison_op literal_exprliteral_expr comparison_op cast(left_expr as data_type)cast(literal_expr) IN (expr1, expr2, ...)literal_expr IN (cast(expr1) , cast(expr2), ...)
If the expression matches one of the forms above, the rule will
ensure the value of literal is in range(min, max) of the
expr’s data_type, and if the scalar is within range, the literal
will be casted to the data type of expr on the other side, and the
cast will be removed from the other side.
§Example
If the DataType of c1 is INT32. Given the filter
Filter: cast(c1 as INT64) > INT64(10)`
This rule will remove the cast and rewrite the expression to:
Filter: c1 > INT32(10)
Implementations§
source§impl UnwrapCastInComparison
impl UnwrapCastInComparison
pub fn new() -> UnwrapCastInComparison
Trait Implementations§
source§impl Default for UnwrapCastInComparison
impl Default for UnwrapCastInComparison
source§fn default() -> UnwrapCastInComparison
fn default() -> UnwrapCastInComparison
Returns the “default value” for a type. Read more
source§impl OptimizerRule for UnwrapCastInComparison
impl OptimizerRule for UnwrapCastInComparison
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 supports_rewrite(&self) -> bool
fn supports_rewrite(&self) -> bool
Does this rule support rewriting owned plans (rather than by reference)?
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>
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 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>
👎Deprecated since 40.0.0: please implement supports_rewrite and rewrite instead
Try and rewrite
plan to an optimized form, returning None if the plan
cannot be optimized by this rule. Read moreAuto Trait Implementations§
impl Freeze for UnwrapCastInComparison
impl RefUnwindSafe for UnwrapCastInComparison
impl Send for UnwrapCastInComparison
impl Sync for UnwrapCastInComparison
impl Unpin for UnwrapCastInComparison
impl UnwindSafe for UnwrapCastInComparison
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> 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>
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