@@ -56,13 +56,15 @@ use crate::interpreters::interpreter_merge_into::MergeIntoInterpreter;
56
56
use crate :: interpreters:: InterpreterFactory ;
57
57
use crate :: sessions:: QueryContext ;
58
58
59
+ #[ allow( dead_code) ]
59
60
struct MergeStyleJoin < ' a > {
60
- source_conditions : & ' a [ ScalarExpr ] ,
61
- target_conditions : & ' a [ ScalarExpr ] ,
62
- source_sexpr : & ' a SExpr ,
63
- target_sexpr : & ' a SExpr ,
61
+ build_conditions : & ' a [ ScalarExpr ] ,
62
+ probe_conditions : & ' a [ ScalarExpr ] ,
63
+ build_sexpr : & ' a SExpr ,
64
+ probe_sexpr : & ' a SExpr ,
64
65
}
65
66
67
+ #[ allow( dead_code) ]
66
68
impl MergeStyleJoin < ' _ > {
67
69
pub fn new ( join : & SExpr ) -> MergeStyleJoin {
68
70
let join_op = match join. plan ( ) {
@@ -73,25 +75,27 @@ impl MergeStyleJoin<'_> {
73
75
join_op. join_type == JoinType :: Right
74
76
|| join_op. join_type == JoinType :: RightAnti
75
77
|| join_op. join_type == JoinType :: Inner
78
+ || join_op. join_type == JoinType :: Left
79
+ || join_op. join_type == JoinType :: LeftAnti
76
80
) ;
77
- let source_conditions = & join_op. right_conditions ;
78
- let target_conditions = & join_op. left_conditions ;
79
- let source_sexpr = join. child ( 1 ) . unwrap ( ) ;
80
- let target_sexpr = join. child ( 0 ) . unwrap ( ) ;
81
+ let build_conditions = & join_op. right_conditions ;
82
+ let probe_conditions = & join_op. left_conditions ;
83
+ let build_sexpr = join. child ( 1 ) . unwrap ( ) ;
84
+ let probe_sexpr = join. child ( 0 ) . unwrap ( ) ;
81
85
MergeStyleJoin {
82
- source_conditions ,
83
- target_conditions ,
84
- source_sexpr ,
85
- target_sexpr ,
86
+ build_conditions ,
87
+ probe_conditions ,
88
+ build_sexpr ,
89
+ probe_sexpr ,
86
90
}
87
91
}
88
92
89
93
pub fn collect_column_map ( & self ) -> HashMap < String , ColumnBinding > {
90
94
let mut column_map = HashMap :: new ( ) ;
91
95
for ( t, s) in self
92
- . target_conditions
96
+ . probe_conditions
93
97
. iter ( )
94
- . zip ( self . source_conditions . iter ( ) )
98
+ . zip ( self . build_conditions . iter ( ) )
95
99
{
96
100
if let ( ScalarExpr :: BoundColumnRef ( t_col) , ScalarExpr :: BoundColumnRef ( s_col) ) = ( t, s) {
97
101
column_map. insert ( t_col. column . column_name . clone ( ) , s_col. column . clone ( ) ) ;
@@ -101,6 +105,7 @@ impl MergeStyleJoin<'_> {
101
105
}
102
106
}
103
107
108
+ #[ allow( dead_code) ]
104
109
impl MergeIntoInterpreter {
105
110
pub async fn build_static_filter (
106
111
join : & SExpr ,
@@ -119,7 +124,7 @@ impl MergeIntoInterpreter {
119
124
// \
120
125
// SourcePlan
121
126
let m_join = MergeStyleJoin :: new ( join) ;
122
- if m_join. source_conditions . is_empty ( ) {
127
+ if m_join. build_conditions . is_empty ( ) {
123
128
return Ok ( Box :: new ( join. clone ( ) ) ) ;
124
129
}
125
130
let column_map = m_join. collect_column_map ( ) ;
@@ -181,9 +186,9 @@ impl MergeIntoInterpreter {
181
186
182
187
// 2. build filter and push down to target side
183
188
ctx. set_status_info ( "building pushdown filters" ) ;
184
- let mut filters = Vec :: with_capacity ( m_join. target_conditions . len ( ) ) ;
189
+ let mut filters = Vec :: with_capacity ( m_join. probe_conditions . len ( ) ) ;
185
190
186
- for ( i, target_side_expr) in m_join. target_conditions . iter ( ) . enumerate ( ) {
191
+ for ( i, target_side_expr) in m_join. probe_conditions . iter ( ) . enumerate ( ) {
187
192
let mut filter_parts = vec ! [ ] ;
188
193
for block in blocks. iter ( ) {
189
194
let block = block. convert_to_full ( ) ;
@@ -225,11 +230,11 @@ impl MergeIntoInterpreter {
225
230
}
226
231
filters. extend ( Self :: combine_filter_parts ( & filter_parts) . into_iter ( ) ) ;
227
232
}
228
- let mut target_plan = m_join. target_sexpr . clone ( ) ;
229
- Self :: push_down_filters ( & mut target_plan , & filters) ?;
230
- let source_plan = m_join. source_sexpr ;
233
+ let mut probe_plan = m_join. probe_sexpr . clone ( ) ;
234
+ Self :: push_down_filters ( & mut probe_plan , & filters) ?;
235
+ let build_plan = m_join. build_sexpr ;
231
236
let new_sexpr =
232
- join. replace_children ( vec ! [ Arc :: new( target_plan ) , Arc :: new( source_plan . clone( ) ) ] ) ;
237
+ join. replace_children ( vec ! [ Arc :: new( probe_plan ) , Arc :: new( build_plan . clone( ) ) ] ) ;
233
238
234
239
ctx. set_status_info ( "join expression replaced" ) ;
235
240
Ok ( Box :: new ( new_sexpr) )
@@ -381,9 +386,9 @@ impl MergeIntoInterpreter {
381
386
metadata : & MetadataRef ,
382
387
group_expr : ScalarExpr ,
383
388
) -> Result < Plan > {
384
- let mut eval_scalar_items = Vec :: with_capacity ( m_join. source_conditions . len ( ) ) ;
385
- let mut min_max_binding = Vec :: with_capacity ( m_join. source_conditions . len ( ) * 2 ) ;
386
- let mut min_max_scalar_items = Vec :: with_capacity ( m_join. source_conditions . len ( ) * 2 ) ;
389
+ let mut eval_scalar_items = Vec :: with_capacity ( m_join. build_conditions . len ( ) ) ;
390
+ let mut min_max_binding = Vec :: with_capacity ( m_join. build_conditions . len ( ) * 2 ) ;
391
+ let mut min_max_scalar_items = Vec :: with_capacity ( m_join. build_conditions . len ( ) * 2 ) ;
387
392
let mut group_items = vec ! [ ] ;
388
393
389
394
let index = metadata
@@ -407,46 +412,46 @@ impl MergeIntoInterpreter {
407
412
scalar : evaled,
408
413
index,
409
414
} ) ;
410
- for source_side_expr in m_join. source_conditions {
415
+ for build_side_expr in m_join. build_conditions {
411
416
// eval source side join expr
412
417
let index = metadata
413
418
. write ( )
414
- . add_derived_column ( "" . to_string ( ) , source_side_expr . data_type ( ) ?) ;
419
+ . add_derived_column ( "" . to_string ( ) , build_side_expr . data_type ( ) ?) ;
415
420
let evaled = ScalarExpr :: BoundColumnRef ( BoundColumnRef {
416
421
span : None ,
417
422
column : ColumnBindingBuilder :: new (
418
423
"" . to_string ( ) ,
419
424
index,
420
- Box :: new ( source_side_expr . data_type ( ) ?) ,
425
+ Box :: new ( build_side_expr . data_type ( ) ?) ,
421
426
Visibility :: Visible ,
422
427
)
423
428
. build ( ) ,
424
429
} ) ;
425
430
eval_scalar_items. push ( ScalarItem {
426
- scalar : source_side_expr . clone ( ) ,
431
+ scalar : build_side_expr . clone ( ) ,
427
432
index,
428
433
} ) ;
429
434
430
435
// eval min/max of source side join expr
431
- let min_display_name = format ! ( "min({:?})" , source_side_expr ) ;
432
- let max_display_name = format ! ( "max({:?})" , source_side_expr ) ;
436
+ let min_display_name = format ! ( "min({:?})" , build_side_expr ) ;
437
+ let max_display_name = format ! ( "max({:?})" , build_side_expr ) ;
433
438
let min_index = metadata
434
439
. write ( )
435
- . add_derived_column ( min_display_name. clone ( ) , source_side_expr . data_type ( ) ?) ;
440
+ . add_derived_column ( min_display_name. clone ( ) , build_side_expr . data_type ( ) ?) ;
436
441
let max_index = metadata
437
442
. write ( )
438
- . add_derived_column ( max_display_name. clone ( ) , source_side_expr . data_type ( ) ?) ;
443
+ . add_derived_column ( max_display_name. clone ( ) , build_side_expr . data_type ( ) ?) ;
439
444
let min_binding = ColumnBindingBuilder :: new (
440
445
min_display_name. clone ( ) ,
441
446
min_index,
442
- Box :: new ( source_side_expr . data_type ( ) ?) ,
447
+ Box :: new ( build_side_expr . data_type ( ) ?) ,
443
448
Visibility :: Visible ,
444
449
)
445
450
. build ( ) ;
446
451
let max_binding = ColumnBindingBuilder :: new (
447
452
max_display_name. clone ( ) ,
448
453
max_index,
449
- Box :: new ( source_side_expr . data_type ( ) ?) ,
454
+ Box :: new ( build_side_expr . data_type ( ) ?) ,
450
455
Visibility :: Visible ,
451
456
)
452
457
. build ( ) ;
@@ -458,7 +463,7 @@ impl MergeIntoInterpreter {
458
463
distinct : false ,
459
464
params : vec ! [ ] ,
460
465
args : vec ! [ evaled. clone( ) ] ,
461
- return_type : Box :: new ( source_side_expr . data_type ( ) ?) ,
466
+ return_type : Box :: new ( build_side_expr . data_type ( ) ?) ,
462
467
display_name : min_display_name. clone ( ) ,
463
468
} ) ,
464
469
index : min_index,
@@ -469,7 +474,7 @@ impl MergeIntoInterpreter {
469
474
distinct : false ,
470
475
params : vec ! [ ] ,
471
476
args : vec ! [ evaled] ,
472
- return_type : Box :: new ( source_side_expr . data_type ( ) ?) ,
477
+ return_type : Box :: new ( build_side_expr . data_type ( ) ?) ,
473
478
display_name : max_display_name. clone ( ) ,
474
479
} ) ,
475
480
index : max_index,
@@ -478,21 +483,26 @@ impl MergeIntoInterpreter {
478
483
min_max_scalar_items. push ( max) ;
479
484
}
480
485
481
- let eval_source_side_join_expr_op = EvalScalar {
486
+ let eval_build_side_join_expr_op = EvalScalar {
482
487
items : eval_scalar_items,
483
488
} ;
484
- let source_plan = m_join. source_sexpr ;
485
- let eval_target_side_condition_sexpr = if let RelOperator :: Exchange ( _) = source_plan. plan ( )
486
- {
489
+ let build_plan = m_join. build_sexpr ;
490
+ let eval_probe_side_condition_sexpr = if let RelOperator :: Exchange ( _) = build_plan. plan ( ) {
487
491
// there is another row_number operator here
488
492
SExpr :: create_unary (
489
- Arc :: new ( eval_source_side_join_expr_op. into ( ) ) ,
490
- Arc :: new ( source_plan. child ( 0 ) ?. child ( 0 ) ?. clone ( ) ) ,
493
+ Arc :: new ( eval_build_side_join_expr_op. into ( ) ) ,
494
+ Arc :: new ( SExpr :: create_unary (
495
+ // merge data here
496
+ Arc :: new ( RelOperator :: Exchange (
497
+ databend_common_sql:: plans:: Exchange :: Merge ,
498
+ ) ) ,
499
+ Arc :: new ( build_plan. child ( 0 ) ?. child ( 0 ) ?. clone ( ) ) ,
500
+ ) ) ,
491
501
)
492
502
} else {
493
503
SExpr :: create_unary (
494
- Arc :: new ( eval_source_side_join_expr_op . into ( ) ) ,
495
- Arc :: new ( source_plan . clone ( ) ) ,
504
+ Arc :: new ( eval_build_side_join_expr_op . into ( ) ) ,
505
+ Arc :: new ( build_plan . clone ( ) ) ,
496
506
)
497
507
} ;
498
508
@@ -509,7 +519,7 @@ impl MergeIntoInterpreter {
509
519
} ;
510
520
let agg_partial_sexpr = SExpr :: create_unary (
511
521
Arc :: new ( agg_partial_op. into ( ) ) ,
512
- Arc :: new ( eval_target_side_condition_sexpr ) ,
522
+ Arc :: new ( eval_probe_side_condition_sexpr ) ,
513
523
) ;
514
524
let agg_final_op = Aggregate {
515
525
mode : AggregateMode :: Final ,
0 commit comments