1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use crate::logical_plan::aexpr::AExpr;
use crate::logical_plan::alp::ALogicalPlan;
use crate::prelude::{Arena, Node};
pub struct StackOptimizer {}
impl StackOptimizer {
pub fn optimize_loop(
&self,
rules: &mut [Box<dyn OptimizationRule>],
expr_arena: &mut Arena<AExpr>,
lp_arena: &mut Arena<ALogicalPlan>,
lp_top: Node,
) -> Node {
let mut changed = true;
let mut plans = Vec::with_capacity(32);
let mut exprs = Vec::with_capacity(32);
while changed {
changed = false;
plans.push(lp_top);
while let Some(current_node) = plans.pop() {
for rule in rules.iter_mut() {
while let Some(x) = rule.optimize_plan(lp_arena, expr_arena, current_node) {
lp_arena.replace(current_node, x);
changed = true;
}
}
let plan = lp_arena.get(current_node);
plan.copy_exprs(&mut exprs);
plan.copy_inputs(&mut plans);
while let Some(current_expr_node) = exprs.pop() {
for rule in rules.iter() {
while let Some(x) = rule.optimize_expr(
expr_arena,
current_expr_node,
lp_arena,
current_node,
) {
expr_arena.replace(current_expr_node, x);
changed = true;
}
}
let expr = expr_arena.get(current_expr_node);
expr.nodes(&mut exprs);
}
}
}
lp_top
}
}
pub trait OptimizationRule {
fn optimize_plan(
&mut self,
_lp_arena: &mut Arena<ALogicalPlan>,
_expr_arena: &mut Arena<AExpr>,
_node: Node,
) -> Option<ALogicalPlan> {
None
}
fn optimize_expr(
&self,
_expr_arena: &mut Arena<AExpr>,
_expr_node: Node,
_lp_arena: &Arena<ALogicalPlan>,
_lp_node: Node,
) -> Option<AExpr> {
None
}
}