|
1 | 1 | use std::{
|
2 |
| - collections::{HashMap, HashSet, VecDeque}, |
| 2 | + collections::{BTreeSet, HashMap, HashSet, VecDeque}, |
3 | 3 | fmt::Display,
|
4 | 4 | sync::Arc,
|
5 | 5 | };
|
@@ -37,6 +37,8 @@ pub struct OptimizerProperties {
|
37 | 37 | pub partial_explore_iter: Option<usize>,
|
38 | 38 | /// Plan space can be expanded by this number of times before we stop applying logical rules.
|
39 | 39 | pub partial_explore_space: Option<usize>,
|
| 40 | + /// Disable pruning during optimization. |
| 41 | + pub disable_pruning: bool, |
40 | 42 | }
|
41 | 43 |
|
42 | 44 | pub struct CascadesOptimizer<T: NodeType, M: Memo<T> = NaiveMemo<T>> {
|
@@ -142,6 +144,10 @@ impl<T: NodeType, M: Memo<T>> CascadesOptimizer<T, M> {
|
142 | 144 | self.prop.panic_on_budget = enabled;
|
143 | 145 | }
|
144 | 146 |
|
| 147 | + pub fn disable_pruning(&mut self, enabled: bool) { |
| 148 | + self.prop.disable_pruning = enabled; |
| 149 | + } |
| 150 | + |
145 | 151 | pub fn cost(&self) -> Arc<dyn CostModel<T, M>> {
|
146 | 152 | self.cost.clone()
|
147 | 153 | }
|
@@ -191,10 +197,17 @@ impl<T: NodeType, M: Memo<T>> CascadesOptimizer<T, M> {
|
191 | 197 | if let Some(predicate_binding) = self.memo.try_get_predicate_binding(group_id) {
|
192 | 198 | println!(" predicate={}", predicate_binding);
|
193 | 199 | }
|
| 200 | + let mut all_predicates = BTreeSet::new(); |
194 | 201 | for expr_id in self.memo.get_all_exprs_in_group(group_id) {
|
195 | 202 | let memo_node = self.memo.get_expr_memoed(expr_id);
|
| 203 | + for pred in &memo_node.predicates { |
| 204 | + all_predicates.insert(*pred); |
| 205 | + } |
196 | 206 | println!(" expr_id={} | {}", expr_id, memo_node);
|
197 | 207 | }
|
| 208 | + for pred in all_predicates { |
| 209 | + println!(" {}={}", pred, self.memo.get_pred(pred)); |
| 210 | + } |
198 | 211 | }
|
199 | 212 | }
|
200 | 213 |
|
|
0 commit comments