@@ -12,12 +12,13 @@ mod projection;
12
12
mod scan;
13
13
mod sort;
14
14
15
+ use std:: fmt:: Debug ;
15
16
use std:: sync:: Arc ;
16
17
17
18
use arrow_schema:: DataType ;
18
19
use optd_core:: {
19
20
cascades:: { CascadesOptimizer , GroupId } ,
20
- rel_node:: { RelNode , RelNodeRef , RelNodeTyp } ,
21
+ rel_node:: { RelNode , RelNodeMeta , RelNodeMetaMap , RelNodeRef , RelNodeTyp } ,
21
22
} ;
22
23
23
24
pub use agg:: { LogicalAgg , PhysicalAgg } ;
@@ -168,21 +169,21 @@ pub trait OptRelNode: 'static + Clone {
168
169
where
169
170
Self : Sized ;
170
171
171
- fn dispatch_explain ( & self ) -> Pretty < ' static > ;
172
+ fn dispatch_explain ( & self , meta_map : Option < & RelNodeMetaMap > ) -> Pretty < ' static > ;
172
173
173
- fn explain ( & self ) -> Pretty < ' static > {
174
- explain ( self . clone ( ) . into_rel_node ( ) )
174
+ fn explain ( & self , meta_map : Option < & RelNodeMetaMap > ) -> Pretty < ' static > {
175
+ explain ( self . clone ( ) . into_rel_node ( ) , meta_map )
175
176
}
176
177
177
- fn explain_to_string ( & self ) -> String {
178
+ fn explain_to_string ( & self , meta_map : Option < & RelNodeMetaMap > ) -> String {
178
179
let mut config = PrettyConfig {
179
180
need_boundaries : false ,
180
181
reduced_spaces : false ,
181
182
width : 300 ,
182
183
..Default :: default ( )
183
184
} ;
184
185
let mut out = String :: new ( ) ;
185
- config. unicode ( & mut out, & self . explain ( ) ) ;
186
+ config. unicode ( & mut out, & self . explain ( meta_map ) ) ;
186
187
out
187
188
}
188
189
@@ -221,6 +222,12 @@ impl PlanNode {
221
222
pub fn from_group ( rel_node : OptRelNodeRef ) -> Self {
222
223
Self ( rel_node)
223
224
}
225
+
226
+ pub fn get_meta < ' a > ( & self , meta_map : & ' a RelNodeMetaMap ) -> & ' a RelNodeMeta {
227
+ meta_map
228
+ . get ( & ( self . 0 . as_ref ( ) as * const _ as usize ) )
229
+ . unwrap ( )
230
+ }
224
231
}
225
232
226
233
impl OptRelNode for PlanNode {
@@ -235,7 +242,7 @@ impl OptRelNode for PlanNode {
235
242
Some ( Self ( rel_node) )
236
243
}
237
244
238
- fn dispatch_explain ( & self ) -> Pretty < ' static > {
245
+ fn dispatch_explain ( & self , meta_map : Option < & RelNodeMetaMap > ) -> Pretty < ' static > {
239
246
Pretty :: simple_record (
240
247
"<PlanNode>" ,
241
248
vec ! [ (
@@ -245,7 +252,7 @@ impl OptRelNode for PlanNode {
245
252
self . 0
246
253
. children
247
254
. iter ( )
248
- . map ( |child| explain ( child. clone ( ) ) )
255
+ . map ( |child| explain ( child. clone ( ) , meta_map ) )
249
256
. collect ( ) ,
250
257
)
251
258
}
@@ -274,7 +281,7 @@ impl OptRelNode for Expr {
274
281
}
275
282
Some ( Self ( rel_node) )
276
283
}
277
- fn dispatch_explain ( & self ) -> Pretty < ' static > {
284
+ fn dispatch_explain ( & self , meta_map : Option < & RelNodeMetaMap > ) -> Pretty < ' static > {
278
285
Pretty :: simple_record (
279
286
"<Expr>" ,
280
287
vec ! [ (
@@ -284,107 +291,107 @@ impl OptRelNode for Expr {
284
291
self . 0
285
292
. children
286
293
. iter ( )
287
- . map ( |child| explain ( child. clone ( ) ) )
294
+ . map ( |child| explain ( child. clone ( ) , meta_map ) )
288
295
. collect ( ) ,
289
296
)
290
297
}
291
298
}
292
299
293
- pub fn explain ( rel_node : OptRelNodeRef ) -> Pretty < ' static > {
300
+ pub fn explain ( rel_node : OptRelNodeRef , meta_map : Option < & RelNodeMetaMap > ) -> Pretty < ' static > {
294
301
match rel_node. typ {
295
302
OptRelNodeTyp :: ColumnRef => ColumnRefExpr :: from_rel_node ( rel_node)
296
303
. unwrap ( )
297
- . dispatch_explain ( ) ,
304
+ . dispatch_explain ( meta_map ) ,
298
305
OptRelNodeTyp :: Constant ( _) => ConstantExpr :: from_rel_node ( rel_node)
299
306
. unwrap ( )
300
- . dispatch_explain ( ) ,
307
+ . dispatch_explain ( meta_map ) ,
301
308
OptRelNodeTyp :: UnOp ( _) => UnOpExpr :: from_rel_node ( rel_node)
302
309
. unwrap ( )
303
- . dispatch_explain ( ) ,
310
+ . dispatch_explain ( meta_map ) ,
304
311
OptRelNodeTyp :: BinOp ( _) => BinOpExpr :: from_rel_node ( rel_node)
305
312
. unwrap ( )
306
- . dispatch_explain ( ) ,
313
+ . dispatch_explain ( meta_map ) ,
307
314
OptRelNodeTyp :: Func ( _) => FuncExpr :: from_rel_node ( rel_node)
308
315
. unwrap ( )
309
- . dispatch_explain ( ) ,
316
+ . dispatch_explain ( meta_map ) ,
310
317
OptRelNodeTyp :: Join ( _) => LogicalJoin :: from_rel_node ( rel_node)
311
318
. unwrap ( )
312
- . dispatch_explain ( ) ,
319
+ . dispatch_explain ( meta_map ) ,
313
320
OptRelNodeTyp :: Scan => LogicalScan :: from_rel_node ( rel_node)
314
321
. unwrap ( )
315
- . dispatch_explain ( ) ,
322
+ . dispatch_explain ( meta_map ) ,
316
323
OptRelNodeTyp :: Filter => LogicalFilter :: from_rel_node ( rel_node)
317
324
. unwrap ( )
318
- . dispatch_explain ( ) ,
325
+ . dispatch_explain ( meta_map ) ,
319
326
OptRelNodeTyp :: Apply ( _) => LogicalApply :: from_rel_node ( rel_node)
320
327
. unwrap ( )
321
- . dispatch_explain ( ) ,
328
+ . dispatch_explain ( meta_map ) ,
322
329
OptRelNodeTyp :: EmptyRelation => LogicalEmptyRelation :: from_rel_node ( rel_node)
323
330
. unwrap ( )
324
- . dispatch_explain ( ) ,
331
+ . dispatch_explain ( meta_map ) ,
325
332
OptRelNodeTyp :: Limit => LogicalLimit :: from_rel_node ( rel_node)
326
333
. unwrap ( )
327
- . dispatch_explain ( ) ,
334
+ . dispatch_explain ( meta_map ) ,
328
335
OptRelNodeTyp :: PhysicalFilter => PhysicalFilter :: from_rel_node ( rel_node)
329
336
. unwrap ( )
330
- . dispatch_explain ( ) ,
337
+ . dispatch_explain ( meta_map ) ,
331
338
OptRelNodeTyp :: PhysicalScan => PhysicalScan :: from_rel_node ( rel_node)
332
339
. unwrap ( )
333
- . dispatch_explain ( ) ,
340
+ . dispatch_explain ( meta_map ) ,
334
341
OptRelNodeTyp :: PhysicalNestedLoopJoin ( _) => PhysicalNestedLoopJoin :: from_rel_node ( rel_node)
335
342
. unwrap ( )
336
- . dispatch_explain ( ) ,
343
+ . dispatch_explain ( meta_map ) ,
337
344
OptRelNodeTyp :: Placeholder ( _) => unreachable ! ( "should not explain a placeholder" ) ,
338
345
OptRelNodeTyp :: List => {
339
346
ExprList :: from_rel_node ( rel_node) // ExprList is the only place that we will have list in the datafusion repr
340
347
. unwrap ( )
341
- . dispatch_explain ( )
348
+ . dispatch_explain ( meta_map )
342
349
}
343
350
OptRelNodeTyp :: Agg => LogicalAgg :: from_rel_node ( rel_node)
344
351
. unwrap ( )
345
- . dispatch_explain ( ) ,
352
+ . dispatch_explain ( meta_map ) ,
346
353
OptRelNodeTyp :: Sort => LogicalSort :: from_rel_node ( rel_node)
347
354
. unwrap ( )
348
- . dispatch_explain ( ) ,
355
+ . dispatch_explain ( meta_map ) ,
349
356
OptRelNodeTyp :: Projection => LogicalProjection :: from_rel_node ( rel_node)
350
357
. unwrap ( )
351
- . dispatch_explain ( ) ,
358
+ . dispatch_explain ( meta_map ) ,
352
359
OptRelNodeTyp :: PhysicalProjection => PhysicalProjection :: from_rel_node ( rel_node)
353
360
. unwrap ( )
354
- . dispatch_explain ( ) ,
361
+ . dispatch_explain ( meta_map ) ,
355
362
OptRelNodeTyp :: PhysicalAgg => PhysicalAgg :: from_rel_node ( rel_node)
356
363
. unwrap ( )
357
- . dispatch_explain ( ) ,
364
+ . dispatch_explain ( meta_map ) ,
358
365
OptRelNodeTyp :: PhysicalSort => PhysicalSort :: from_rel_node ( rel_node)
359
366
. unwrap ( )
360
- . dispatch_explain ( ) ,
367
+ . dispatch_explain ( meta_map ) ,
361
368
OptRelNodeTyp :: PhysicalHashJoin ( _) => PhysicalHashJoin :: from_rel_node ( rel_node)
362
369
. unwrap ( )
363
- . dispatch_explain ( ) ,
370
+ . dispatch_explain ( meta_map ) ,
364
371
OptRelNodeTyp :: SortOrder ( _) => SortOrderExpr :: from_rel_node ( rel_node)
365
372
. unwrap ( )
366
- . dispatch_explain ( ) ,
373
+ . dispatch_explain ( meta_map ) ,
367
374
OptRelNodeTyp :: PhysicalEmptyRelation => PhysicalEmptyRelation :: from_rel_node ( rel_node)
368
375
. unwrap ( )
369
- . dispatch_explain ( ) ,
376
+ . dispatch_explain ( meta_map ) ,
370
377
OptRelNodeTyp :: PhysicalLimit => PhysicalLimit :: from_rel_node ( rel_node)
371
378
. unwrap ( )
372
- . dispatch_explain ( ) ,
379
+ . dispatch_explain ( meta_map ) ,
373
380
OptRelNodeTyp :: Between => BetweenExpr :: from_rel_node ( rel_node)
374
381
. unwrap ( )
375
- . dispatch_explain ( ) ,
382
+ . dispatch_explain ( meta_map ) ,
376
383
OptRelNodeTyp :: Cast => CastExpr :: from_rel_node ( rel_node)
377
384
. unwrap ( )
378
- . dispatch_explain ( ) ,
385
+ . dispatch_explain ( meta_map ) ,
379
386
OptRelNodeTyp :: Like => LikeExpr :: from_rel_node ( rel_node)
380
387
. unwrap ( )
381
- . dispatch_explain ( ) ,
388
+ . dispatch_explain ( meta_map ) ,
382
389
OptRelNodeTyp :: DataType ( _) => DataTypeExpr :: from_rel_node ( rel_node)
383
390
. unwrap ( )
384
- . dispatch_explain ( ) ,
391
+ . dispatch_explain ( meta_map ) ,
385
392
OptRelNodeTyp :: InList => InListExpr :: from_rel_node ( rel_node)
386
393
. unwrap ( )
387
- . dispatch_explain ( ) ,
394
+ . dispatch_explain ( meta_map ) ,
388
395
}
389
396
}
390
397
0 commit comments