@@ -32,7 +32,7 @@ pub struct OptimizerContext {
32
32
33
33
#[ derive( Default , Clone , Debug ) ]
34
34
pub struct OptimizerProperties {
35
- pub partial_explore_temporarily_disabled : bool ,
35
+ pub panic_on_budget : bool ,
36
36
/// If the number of rules applied exceeds this number, we stop applying logical rules.
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.
@@ -88,12 +88,8 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
88
88
Self :: new_with_prop ( rules, cost, property_builders, Default :: default ( ) )
89
89
}
90
90
91
- pub fn disable_explore_limit ( & mut self ) {
92
- self . prop . partial_explore_temporarily_disabled = true ;
93
- }
94
-
95
- pub fn enable_explore_limit ( & mut self ) {
96
- self . prop . partial_explore_temporarily_disabled = false ;
91
+ pub fn panic_on_explore_limit ( & mut self , enabled : bool ) {
92
+ self . prop . panic_on_budget = enabled;
97
93
}
98
94
99
95
pub fn new_with_prop (
@@ -190,12 +186,13 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
190
186
for expr_id in self . memo . get_all_exprs_in_group ( group_id) {
191
187
let memo_node = self . memo . get_expr_memoed ( expr_id) ;
192
188
println ! ( " expr_id={} | {}" , expr_id, memo_node) ;
193
- let bindings = self
194
- . memo
195
- . get_all_expr_bindings ( expr_id, false , true , Some ( 1 ) ) ;
196
- for binding in bindings {
197
- println ! ( " {}" , binding) ;
198
- }
189
+ // We removed get all bindings functionality
190
+ // let bindings = self
191
+ // .memo
192
+ // .get_all_expr_bindings(expr_id, false, true, Some(1));
193
+ // for binding in bindings {
194
+ // println!(" {}", binding);
195
+ // }
199
196
}
200
197
}
201
198
}
@@ -214,7 +211,7 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
214
211
215
212
/// Optimize a `RelNode`.
216
213
pub fn step_optimize_rel ( & mut self , root_rel : RelNodeRef < T > ) -> Result < GroupId > {
217
- let ( group_id, _) = self . add_group_expr ( root_rel, None ) ;
214
+ let ( group_id, _) = self . add_new_expr ( root_rel) ;
218
215
self . fire_optimize_tasks ( group_id) ?;
219
216
Ok ( group_id)
220
217
}
@@ -240,7 +237,7 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
240
237
let new_tasks = task. execute ( self ) ?;
241
238
self . tasks . extend ( new_tasks) ;
242
239
iter += 1 ;
243
- if !self . ctx . budget_used && ! self . prop . partial_explore_temporarily_disabled {
240
+ if !self . ctx . budget_used {
244
241
let plan_space = self . memo . compute_plan_space ( ) ;
245
242
if let Some ( partial_explore_space) = self . prop . partial_explore_space {
246
243
if plan_space - plan_space_begin > partial_explore_space {
@@ -249,6 +246,9 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
249
246
plan_space
250
247
) ;
251
248
self . ctx . budget_used = true ;
249
+ if self . prop . panic_on_budget {
250
+ panic ! ( "plan space size budget used" ) ;
251
+ }
252
252
}
253
253
} else if let Some ( partial_explore_iter) = self . prop . partial_explore_iter {
254
254
if iter >= partial_explore_iter {
@@ -257,15 +257,21 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
257
257
plan_space
258
258
) ;
259
259
self . ctx . budget_used = true ;
260
+ if self . prop . panic_on_budget {
261
+ panic ! ( "plan space size budget used" ) ;
262
+ }
260
263
}
261
264
}
262
265
}
263
266
}
267
+ // if self.ctx.budget_used {
268
+ // self.dump(None);
269
+ // }
264
270
Ok ( ( ) )
265
271
}
266
272
267
273
fn optimize_inner ( & mut self , root_rel : RelNodeRef < T > ) -> Result < RelNodeRef < T > > {
268
- let ( group_id, _) = self . add_group_expr ( root_rel, None ) ;
274
+ let ( group_id, _) = self . add_new_expr ( root_rel) ;
269
275
self . fire_optimize_tasks ( group_id) ?;
270
276
self . memo . get_best_group_binding ( group_id, & mut None )
271
277
}
@@ -286,37 +292,16 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
286
292
self . memo . get_expr_info ( expr)
287
293
}
288
294
289
- pub ( super ) fn add_group_expr (
290
- & mut self ,
291
- expr : RelNodeRef < T > ,
292
- group_id : Option < GroupId > ,
293
- ) -> ( GroupId , ExprId ) {
294
- self . memo . add_new_group_expr ( expr, group_id)
295
+ pub fn add_new_expr ( & mut self , rel_node : RelNodeRef < T > ) -> ( GroupId , ExprId ) {
296
+ self . memo . add_new_expr ( rel_node)
295
297
}
296
298
297
- #[ allow( dead_code) ]
298
- pub ( super ) fn replace_group_expr (
299
+ pub fn add_expr_to_group (
299
300
& mut self ,
300
- expr : RelNodeRef < T > ,
301
+ rel_node : RelNodeRef < T > ,
301
302
group_id : GroupId ,
302
- expr_id : ExprId ,
303
- ) {
304
- let replaced = self . memo . replace_group_expr ( expr_id, group_id, expr) ;
305
- if replaced {
306
- // the old expr is replaced, so we clear the fired rules for old expr
307
- self . fired_rules . entry ( expr_id) . or_default ( ) . clear ( ) ;
308
- return ;
309
- }
310
-
311
- // We can mark the expr as a deadend
312
- // However, even some of the exprs cannot be the winner for the group
313
- // We still need the physical form of those expr to start the optimizeInput task
314
- // So we don't mark the impl rules as fired
315
- for i in 0 ..self . rules . len ( ) {
316
- if !self . rules [ i] . rule ( ) . is_impl_rule ( ) {
317
- self . fired_rules . entry ( expr_id) . or_default ( ) . insert ( i) ;
318
- }
319
- }
303
+ ) -> Option < ExprId > {
304
+ self . memo . add_expr_to_group ( rel_node, group_id)
320
305
}
321
306
322
307
pub ( super ) fn get_group_info ( & self , group_id : GroupId ) -> GroupInfo {
@@ -327,10 +312,6 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
327
312
self . memo . update_group_info ( group_id, group_info)
328
313
}
329
314
330
- pub ( super ) fn merge_group ( & mut self , group_a : GroupId , group_b : GroupId ) {
331
- self . memo . merge_group ( group_a, group_b) ;
332
- }
333
-
334
315
/// Get the properties of a Cascades group
335
316
/// P is the type of the property you expect
336
317
/// idx is the idx of the property you want. The order of properties is defined
@@ -354,22 +335,8 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
354
335
self . memo . get_expr_memoed ( expr_id)
355
336
}
356
337
357
- pub ( super ) fn get_all_expr_bindings (
358
- & self ,
359
- expr_id : ExprId ,
360
- level : Option < usize > ,
361
- ) -> Vec < RelNodeRef < T > > {
362
- self . memo
363
- . get_all_expr_bindings ( expr_id, false , false , level)
364
- }
365
-
366
- pub fn get_all_group_bindings (
367
- & self ,
368
- group_id : GroupId ,
369
- physical_only : bool ,
370
- ) -> Vec < RelNodeRef < T > > {
371
- self . memo
372
- . get_all_group_bindings ( group_id, physical_only, true , Some ( 10 ) )
338
+ pub fn get_predicate_binding ( & self , group_id : GroupId ) -> Option < RelNodeRef < T > > {
339
+ self . memo . get_predicate_binding ( group_id)
373
340
}
374
341
375
342
pub ( super ) fn is_group_explored ( & self , group_id : GroupId ) -> bool {
0 commit comments