@@ -36,10 +36,9 @@ use types::operator::logical::{
3636use types:: operator:: physical:: {
3737 HashJoinOperator , PhysicalFilterOperator , PhysicalOperator , TableScanOperator ,
3838} ;
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 } ;
4342
4443struct OptdOptimizer { }
4544
@@ -49,44 +48,27 @@ impl OptdOptimizer {
4948 ) -> Arc < PhysicalOperator < PhysicalLink > > {
5049 match & * logical_node {
5150 LogicalOperator :: Scan ( logical_scan_operator) => {
52- Arc :: new ( PhysicalOperator :: TableScan ( TableScanOperator :: <
53- PhysicalLink ,
54- > {
51+ Arc :: new ( PhysicalOperator :: TableScan ( TableScanOperator {
5552 table_name : logical_scan_operator. table_name . clone ( ) ,
5653 predicate : None ,
5754 } ) )
5855 }
5956 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 ( ) ;
6859 Arc :: new ( PhysicalOperator :: Filter ( PhysicalFilterOperator :: <
6960 PhysicalLink ,
7061 > {
7162 child : PhysicalLink :: PhysicalNode ( Self :: conv_logical_to_physical (
7263 child. clone ( ) ,
7364 ) ) ,
74- predicate : PhysicalLink :: ScalarNode ( todo ! ( ) ) ,
65+ predicate : predicate ,
7566 } ) )
7667 }
7768 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 ( ) ;
9072 Arc :: new ( PhysicalOperator :: HashJoin (
9173 HashJoinOperator :: < PhysicalLink > {
9274 join_type : ( ) ,
@@ -96,7 +78,7 @@ impl OptdOptimizer {
9678 right : PhysicalLink :: PhysicalNode ( Self :: conv_logical_to_physical (
9779 right_join. clone ( ) ,
9880 ) ) ,
99- condition : PhysicalLink :: ScalarNode ( todo ! ( ) ) ,
81+ condition : condition ,
10082 } ,
10183 ) )
10284 }
@@ -112,37 +94,42 @@ pub struct OptdQueryPlanner {
11294}
11395
11496impl OptdQueryPlanner {
115- fn convert_into_optd_scalar ( predicate_expr : Expr ) -> Arc < ScalarOperator < ScalarLink > > {
97+ fn convert_into_optd_scalar ( predicate_expr : Expr ) -> Scalar {
11698 // TODO: Implement the conversion logic here
117- Arc :: new ( ScalarOperator :: new ( ) )
99+ Scalar { }
118100 }
119101
120102 fn convert_into_optd_logical ( plan_node : & LogicalPlan ) -> Arc < LogicalOperator < LogicalLink > > {
121103 match plan_node {
122104 LogicalPlan :: Filter ( filter) => {
123105 Arc :: new ( LogicalOperator :: Filter ( LogicalFilterOperator {
124106 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 ( ) ) ,
128108 } ) )
129109 }
130110
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 {
142129 table_name : table_scan. table_name . to_quoted_string ( ) ,
143130 predicate : None , // TODO fix this: there are multiple predicates in the scan but our IR only accepts one
144- } ) ,
145- ) ) ,
131+ } ) )
132+ }
146133 _ => panic ! ( "OptD does not support this type of query yet" ) ,
147134 }
148135 }
0 commit comments