dbx_core/sql/optimizer/
mod.rs1mod constant_folding;
7mod limit_pushdown;
8mod predicate_pushdown;
9mod projection_pushdown;
10
11#[cfg(test)]
12mod tests;
13
14use crate::error::DbxResult;
15use crate::sql::planner::LogicalPlan;
16
17pub use constant_folding::ConstantFoldingRule;
18pub use limit_pushdown::LimitPushdownRule;
19pub use predicate_pushdown::PredicatePushdownRule;
20pub use projection_pushdown::ProjectionPushdownRule;
21
22pub trait OptimizationRule: Send + Sync {
24 fn name(&self) -> &str;
26
27 fn apply(&self, plan: LogicalPlan) -> DbxResult<LogicalPlan>;
29}
30
31pub struct QueryOptimizer {
33 rules: Vec<Box<dyn OptimizationRule>>,
34}
35
36impl QueryOptimizer {
37 pub fn new() -> Self {
39 Self {
40 rules: vec![
41 Box::new(PredicatePushdownRule),
42 Box::new(ProjectionPushdownRule),
43 Box::new(ConstantFoldingRule),
44 Box::new(LimitPushdownRule),
45 ],
46 }
47 }
48
49 pub fn optimize(&self, plan: LogicalPlan) -> DbxResult<LogicalPlan> {
51 let mut optimized = plan;
52 for rule in &self.rules {
53 optimized = rule.apply(optimized)?;
54 }
55 Ok(optimized)
56 }
57}
58
59impl Default for QueryOptimizer {
60 fn default() -> Self {
61 Self::new()
62 }
63}