use std::sync::Arc;
use datafusion::optimizer::OptimizerRule;
use datafusion::physical_optimizer::PhysicalOptimizerRule;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum OptimizerPhase {
Logical,
Physical,
Both,
}
pub trait OptimizerRuleProvider: Send + Sync {
fn rule(&self) -> Arc<dyn OptimizerRule + Send + Sync> {
Arc::new(NoopOptimizerRule)
}
fn physical_rule(&self) -> Option<Arc<dyn PhysicalOptimizerRule + Send + Sync>> {
None
}
fn phase(&self) -> OptimizerPhase;
fn precedence(&self) -> i32 {
0
}
}
#[derive(Debug, Default)]
pub struct NoopOptimizerRule;
impl OptimizerRule for NoopOptimizerRule {
fn name(&self) -> &str {
"uni_noop_optimizer_rule"
}
fn apply_order(&self) -> Option<datafusion::optimizer::ApplyOrder> {
Some(datafusion::optimizer::ApplyOrder::BottomUp)
}
fn rewrite(
&self,
plan: datafusion::logical_expr::LogicalPlan,
_config: &dyn datafusion::optimizer::OptimizerConfig,
) -> Result<
datafusion::common::tree_node::Transformed<datafusion::logical_expr::LogicalPlan>,
datafusion::error::DataFusionError,
> {
Ok(datafusion::common::tree_node::Transformed::no(plan))
}
}