use crate::simplify_expressions::{ConstEvaluator, Simplifier};
use datafusion_common::Result;
use datafusion_expr::{expr_rewriter::ExprRewritable, Expr};
use datafusion_physical_expr::execution_props::ExecutionProps;
#[allow(rustdoc::private_intra_doc_links)]
pub trait SimplifyInfo {
fn is_boolean_type(&self, expr: &Expr) -> Result<bool>;
fn nullable(&self, expr: &Expr) -> Result<bool>;
fn execution_props(&self) -> &ExecutionProps;
}
pub trait ExprSimplifiable: Sized {
fn simplify<S: SimplifyInfo>(self, info: &S) -> Result<Self>;
}
impl ExprSimplifiable for Expr {
fn simplify<S: SimplifyInfo>(self, info: &S) -> Result<Self> {
let mut rewriter = Simplifier::new(info);
let mut const_evaluator = ConstEvaluator::new(info.execution_props());
self.rewrite(&mut const_evaluator)?.rewrite(&mut rewriter)
}
}