use std::fmt::Debug;
use std::sync::Arc;
use crate::aggregate_statistics::AggregateStatistics;
use crate::combine_partial_final_agg::CombinePartialFinalAggregate;
use crate::ensure_coop::EnsureCooperative;
use crate::ensure_requirements::EnsureRequirements;
use crate::filter_pushdown::FilterPushdown;
use crate::join_selection::JoinSelection;
use crate::limit_pushdown::LimitPushdown;
use crate::limited_distinct_aggregation::LimitedDistinctAggregation;
use crate::output_requirements::OutputRequirements;
use crate::projection_pushdown::ProjectionPushdown;
use crate::sanity_checker::SanityCheckPlan;
use crate::topk_aggregation::TopKAggregation;
use crate::topk_repartition::TopKRepartition;
use crate::update_aggr_exprs::OptimizeAggregateOrder;
use crate::hash_join_buffering::HashJoinBuffering;
use crate::limit_pushdown_past_window::LimitPushPastWindows;
use crate::pushdown_sort::PushdownSort;
use crate::window_topn::WindowTopN;
use datafusion_common::config::ConfigOptions;
pub use datafusion_session::{PhysicalOptimizerContext, PhysicalOptimizerRule};
pub struct ConfigOnlyContext<'a> {
config: &'a ConfigOptions,
}
impl<'a> ConfigOnlyContext<'a> {
pub fn new(config: &'a ConfigOptions) -> Self {
Self { config }
}
}
impl PhysicalOptimizerContext for ConfigOnlyContext<'_> {
fn config_options(&self) -> &ConfigOptions {
self.config
}
}
#[derive(Clone, Debug)]
pub struct PhysicalOptimizer {
pub rules: Vec<Arc<dyn PhysicalOptimizerRule + Send + Sync>>,
}
impl Default for PhysicalOptimizer {
fn default() -> Self {
Self::new()
}
}
impl PhysicalOptimizer {
pub fn new() -> Self {
let rules: Vec<Arc<dyn PhysicalOptimizerRule + Send + Sync>> = vec![
Arc::new(OutputRequirements::new_add_mode()),
Arc::new(AggregateStatistics::new()),
Arc::new(JoinSelection::new()),
Arc::new(LimitedDistinctAggregation::new()),
Arc::new(FilterPushdown::new()),
Arc::new(WindowTopN::new()),
Arc::new(EnsureRequirements::new()),
Arc::new(CombinePartialFinalAggregate::new()),
Arc::new(OptimizeAggregateOrder::new()),
Arc::new(ProjectionPushdown::new()),
Arc::new(OutputRequirements::new_remove_mode()),
Arc::new(TopKAggregation::new()),
Arc::new(LimitPushPastWindows::new()),
Arc::new(HashJoinBuffering::new()),
Arc::new(LimitPushdown::new()),
Arc::new(TopKRepartition::new()),
Arc::new(ProjectionPushdown::new()),
Arc::new(PushdownSort::new()),
Arc::new(EnsureCooperative::new()),
Arc::new(FilterPushdown::new_post_optimization()),
Arc::new(SanityCheckPlan::new()),
];
Self::with_rules(rules)
}
pub fn with_rules(rules: Vec<Arc<dyn PhysicalOptimizerRule + Send + Sync>>) -> Self {
Self { rules }
}
}