Skip to content

Commit cbfbb88

Browse files
committed
Change join condition to match datafusion and fix type errors from prev commit
1 parent 0bc6a13 commit cbfbb88

File tree

3 files changed

+40
-49
lines changed

3 files changed

+40
-49
lines changed

infra/src/lib.rs

Lines changed: 34 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@ use types::operator::logical::{
3636
use 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

4443
struct 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

11496
impl 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
}

infra/src/types/operator/logical.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! Type representations of logical operators in (materialized) query plans.
22
3+
use std::sync::Arc;
4+
35
use crate::types::operator::Scalar;
46

57
/// A type representing a logical operator in an input logical query plan.
@@ -40,5 +42,5 @@ pub struct LogicalJoinOperator<Link> {
4042
pub join_type: (),
4143
pub left: Link,
4244
pub right: Link,
43-
pub condition: Scalar,
45+
pub condition: Arc<Vec<(Scalar, Scalar)>>,
4446
}

infra/src/types/operator/physical.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! Type representations of physical operators in (materialized) query plans.
22
3+
use std::sync::Arc;
4+
35
use crate::types::operator::Scalar;
46

57
/// A type representing a physical operator in an output physical query execution plan.
@@ -41,5 +43,5 @@ pub struct HashJoinOperator<Link> {
4143
pub join_type: (),
4244
pub left: Link,
4345
pub right: Link,
44-
pub condition: Scalar,
46+
pub condition: Arc<Vec<(Scalar, Scalar)>>,
4547
}

0 commit comments

Comments
 (0)