@@ -36,10 +36,9 @@ use types::operator::logical::{
36
36
use types:: operator:: physical:: {
37
37
HashJoinOperator , PhysicalFilterOperator , PhysicalOperator , TableScanOperator ,
38
38
} ;
39
- use types:: operator:: ScalarOperator ;
40
- use types:: plan:: logical_plan:: { LogicalLink , LogicalPlan as OptDLogicalPlan , ScalarLink } ;
41
- use types:: plan:: partial_physical_plan:: PhysicalLink ;
42
- use types:: plan:: physical_plan:: PhysicalPlan ;
39
+ use types:: operator:: Scalar ;
40
+ use types:: plan:: logical_plan:: { LogicalLink , LogicalPlan as OptDLogicalPlan } ;
41
+ use types:: plan:: physical_plan:: { PhysicalLink , PhysicalPlan } ;
43
42
44
43
struct OptdOptimizer { }
45
44
@@ -49,44 +48,27 @@ impl OptdOptimizer {
49
48
) -> Arc < PhysicalOperator < PhysicalLink > > {
50
49
match & * logical_node {
51
50
LogicalOperator :: Scan ( logical_scan_operator) => {
52
- Arc :: new ( PhysicalOperator :: TableScan ( TableScanOperator :: <
53
- PhysicalLink ,
54
- > {
51
+ Arc :: new ( PhysicalOperator :: TableScan ( TableScanOperator {
55
52
table_name : logical_scan_operator. table_name . clone ( ) ,
56
53
predicate : None ,
57
54
} ) )
58
55
}
59
56
LogicalOperator :: Filter ( logical_filter_operator) => {
60
- let LogicalLink :: LogicalNode ( ref child) = logical_filter_operator. child else {
61
- panic ! ( "The child of filter is not a logical node" )
62
- } ;
63
-
64
- let LogicalLink :: ScalarNode ( ref predicate) = logical_filter_operator. predicate
65
- else {
66
- panic ! ( "The predicate of filter is not a scalar node" )
67
- } ;
57
+ let LogicalLink :: LogicalNode ( ref child) = logical_filter_operator. child ;
58
+ let predicate = logical_filter_operator. predicate . clone ( ) ;
68
59
Arc :: new ( PhysicalOperator :: Filter ( PhysicalFilterOperator :: <
69
60
PhysicalLink ,
70
61
> {
71
62
child : PhysicalLink :: PhysicalNode ( Self :: conv_logical_to_physical (
72
63
child. clone ( ) ,
73
64
) ) ,
74
- predicate : PhysicalLink :: ScalarNode ( todo ! ( ) ) ,
65
+ predicate : predicate ,
75
66
} ) )
76
67
}
77
68
LogicalOperator :: Join ( logical_join_operator) => {
78
- let LogicalLink :: LogicalNode ( ref left_join) = logical_join_operator. left else {
79
- panic ! ( "The left child of join is not a logical node" )
80
- } ;
81
-
82
- let LogicalLink :: LogicalNode ( ref right_join) = logical_join_operator. right else {
83
- panic ! ( "The right child of join is not a logical node" )
84
- } ;
85
-
86
- let LogicalLink :: ScalarNode ( ref condition) = logical_join_operator. condition else {
87
- panic ! ( "The condition child of join is not a Scalar Node" )
88
- } ;
89
-
69
+ let LogicalLink :: LogicalNode ( ref left_join) = logical_join_operator. left ;
70
+ let LogicalLink :: LogicalNode ( ref right_join) = logical_join_operator. right ;
71
+ let condition = logical_join_operator. condition . clone ( ) ;
90
72
Arc :: new ( PhysicalOperator :: HashJoin (
91
73
HashJoinOperator :: < PhysicalLink > {
92
74
join_type : ( ) ,
@@ -96,7 +78,7 @@ impl OptdOptimizer {
96
78
right : PhysicalLink :: PhysicalNode ( Self :: conv_logical_to_physical (
97
79
right_join. clone ( ) ,
98
80
) ) ,
99
- condition : PhysicalLink :: ScalarNode ( todo ! ( ) ) ,
81
+ condition : condition ,
100
82
} ,
101
83
) )
102
84
}
@@ -112,37 +94,42 @@ pub struct OptdQueryPlanner {
112
94
}
113
95
114
96
impl OptdQueryPlanner {
115
- fn convert_into_optd_scalar ( predicate_expr : Expr ) -> Arc < ScalarOperator < ScalarLink > > {
97
+ fn convert_into_optd_scalar ( predicate_expr : Expr ) -> Scalar {
116
98
// TODO: Implement the conversion logic here
117
- Arc :: new ( ScalarOperator :: new ( ) )
99
+ Scalar { }
118
100
}
119
101
120
102
fn convert_into_optd_logical ( plan_node : & LogicalPlan ) -> Arc < LogicalOperator < LogicalLink > > {
121
103
match plan_node {
122
104
LogicalPlan :: Filter ( filter) => {
123
105
Arc :: new ( LogicalOperator :: Filter ( LogicalFilterOperator {
124
106
child : LogicalLink :: LogicalNode ( Self :: convert_into_optd_logical ( & filter. input ) ) ,
125
- predicate : LogicalLink :: ScalarNode ( Self :: convert_into_optd_scalar (
126
- filter. predicate . clone ( ) ,
127
- ) ) ,
107
+ predicate : Self :: convert_into_optd_scalar ( filter. predicate . clone ( ) ) ,
128
108
} ) )
129
109
}
130
110
131
- LogicalPlan :: Join ( join) => Arc :: new ( LogicalOperator :: Join (
132
- ( LogicalJoinOperator {
133
- join_type : ( ) ,
134
- left : LogicalLink :: LogicalNode ( Self :: convert_into_optd_logical ( & join. left ) ) ,
135
- right : LogicalLink :: LogicalNode ( Self :: convert_into_optd_logical ( & join. right ) ) ,
136
- condition : LogicalLink :: ScalarNode ( Arc :: new ( todo ! ( ) ) ) ,
137
- } ) ,
138
- ) ) ,
139
-
140
- LogicalPlan :: TableScan ( table_scan) => Arc :: new ( LogicalOperator :: Scan (
141
- ( LogicalScanOperator {
111
+ LogicalPlan :: Join ( join) => Arc :: new ( LogicalOperator :: Join ( LogicalJoinOperator {
112
+ join_type : ( ) ,
113
+ left : LogicalLink :: LogicalNode ( Self :: convert_into_optd_logical ( & join. left ) ) ,
114
+ right : LogicalLink :: LogicalNode ( Self :: convert_into_optd_logical ( & join. right ) ) ,
115
+ condition : Arc :: new (
116
+ join. on
117
+ . iter ( )
118
+ . map ( |( left, right) | {
119
+ let left_scalar = Self :: convert_into_optd_scalar ( left. clone ( ) ) ;
120
+ let right_scalar = Self :: convert_into_optd_scalar ( right. clone ( ) ) ;
121
+ ( left_scalar, right_scalar)
122
+ } )
123
+ . collect ( ) ,
124
+ ) ,
125
+ } ) ) ,
126
+
127
+ LogicalPlan :: TableScan ( table_scan) => {
128
+ Arc :: new ( LogicalOperator :: Scan ( LogicalScanOperator {
142
129
table_name : table_scan. table_name . to_quoted_string ( ) ,
143
130
predicate : None , // TODO fix this: there are multiple predicates in the scan but our IR only accepts one
144
- } ) ,
145
- ) ) ,
131
+ } ) )
132
+ }
146
133
_ => panic ! ( "OptD does not support this type of query yet" ) ,
147
134
}
148
135
}
0 commit comments