use crate::core::error::Result;
use crate::query::plan::LogicalPlan;
use super::stats::Statistics;
mod filter_scan_fusion;
mod limit_pushdown;
mod operation_reordering;
mod predicate_pushdown;
pub use filter_scan_fusion::FilterScanFusion;
pub use limit_pushdown::LimitPushdown;
pub use operation_reordering::OperationReordering;
pub use predicate_pushdown::PredicatePushdown;
pub trait OptimizationRule: Send + Sync {
fn name(&self) -> &str;
fn apply(&self, plan: &LogicalPlan, stats: &Statistics) -> Result<Option<LogicalPlan>>;
}
#[must_use]
pub fn default_rules() -> Vec<Box<dyn OptimizationRule>> {
vec![
Box::new(PredicatePushdown),
Box::new(FilterScanFusion),
Box::new(LimitPushdown),
Box::new(OperationReordering),
]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_rules_exist() {
let rules = default_rules();
assert!(!rules.is_empty());
let names: Vec<&str> = rules.iter().map(|r| r.name()).collect();
assert!(names.contains(&"predicate-pushdown"));
assert!(names.contains(&"filter-scan-fusion"));
assert!(names.contains(&"limit-pushdown"));
assert!(names.contains(&"operation-reordering"));
}
}