Skip to content

Commit e9fba27

Browse files
committed
remove top-level Expression type and rename to Default<>Expression
1 parent e075d8f commit e9fba27

File tree

5 files changed

+57
-103
lines changed

5 files changed

+57
-103
lines changed

optd-mvp/src/expression/logical_expression.rs

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ use fxhash::hash;
1010
use serde::{Deserialize, Serialize};
1111

1212
#[derive(Clone, Debug)]
13-
pub enum LogicalExpression {
13+
pub enum DefaultLogicalExpression {
1414
Scan(Scan),
1515
Filter(Filter),
1616
Join(Join),
1717
}
1818

19-
impl LogicalExpression {
19+
impl DefaultLogicalExpression {
2020
pub fn kind(&self) -> i16 {
2121
match self {
22-
LogicalExpression::Scan(_) => 0,
23-
LogicalExpression::Filter(_) => 1,
24-
LogicalExpression::Join(_) => 2,
22+
DefaultLogicalExpression::Scan(_) => 0,
23+
DefaultLogicalExpression::Filter(_) => 1,
24+
DefaultLogicalExpression::Join(_) => 2,
2525
}
2626
}
2727

@@ -46,11 +46,11 @@ impl LogicalExpression {
4646

4747
let kind = self.kind() as u16 as usize;
4848
let hash = match self {
49-
LogicalExpression::Scan(scan) => hash(scan.table.as_str()),
50-
LogicalExpression::Filter(filter) => {
49+
DefaultLogicalExpression::Scan(scan) => hash(scan.table.as_str()),
50+
DefaultLogicalExpression::Filter(filter) => {
5151
hash(&rewrite(filter.child).0) ^ hash(filter.expression.as_str())
5252
}
53-
LogicalExpression::Join(join) => {
53+
DefaultLogicalExpression::Join(join) => {
5454
// Make sure that there is a difference between `Join(A, B)` and `Join(B, A)`.
5555
hash(&(rewrite(join.left).0 + 1))
5656
^ hash(&(rewrite(join.right).0 + 2))
@@ -80,14 +80,21 @@ impl LogicalExpression {
8080
};
8181

8282
match (self, other) {
83-
(LogicalExpression::Scan(scan_left), LogicalExpression::Scan(scan_right)) => {
84-
scan_left.table == scan_right.table
85-
}
86-
(LogicalExpression::Filter(filter_left), LogicalExpression::Filter(filter_right)) => {
83+
(
84+
DefaultLogicalExpression::Scan(scan_left),
85+
DefaultLogicalExpression::Scan(scan_right),
86+
) => scan_left.table == scan_right.table,
87+
(
88+
DefaultLogicalExpression::Filter(filter_left),
89+
DefaultLogicalExpression::Filter(filter_right),
90+
) => {
8791
rewrite(filter_left.child) == rewrite(filter_right.child)
8892
&& filter_left.expression == filter_right.expression
8993
}
90-
(LogicalExpression::Join(join_left), LogicalExpression::Join(join_right)) => {
94+
(
95+
DefaultLogicalExpression::Join(join_left),
96+
DefaultLogicalExpression::Join(join_right),
97+
) => {
9198
rewrite(join_left.left) == rewrite(join_right.left)
9299
&& rewrite(join_left.right) == rewrite(join_right.right)
93100
&& join_left.expression == join_right.expression
@@ -98,9 +105,9 @@ impl LogicalExpression {
98105

99106
pub fn children(&self) -> Vec<GroupId> {
100107
match self {
101-
LogicalExpression::Scan(_) => vec![],
102-
LogicalExpression::Filter(filter) => vec![filter.child],
103-
LogicalExpression::Join(join) => vec![join.left, join.right],
108+
DefaultLogicalExpression::Scan(_) => vec![],
109+
DefaultLogicalExpression::Filter(filter) => vec![filter.child],
110+
DefaultLogicalExpression::Join(join) => vec![join.left, join.right],
104111
}
105112
}
106113
}
@@ -124,7 +131,7 @@ pub struct Join {
124131
}
125132

126133
/// TODO Use a macro.
127-
impl From<logical_expression::Model> for LogicalExpression {
134+
impl From<logical_expression::Model> for DefaultLogicalExpression {
128135
fn from(value: logical_expression::Model) -> Self {
129136
match value.kind {
130137
0 => Self::Scan(
@@ -145,8 +152,8 @@ impl From<logical_expression::Model> for LogicalExpression {
145152
}
146153

147154
/// TODO Use a macro.
148-
impl From<LogicalExpression> for logical_expression::Model {
149-
fn from(value: LogicalExpression) -> logical_expression::Model {
155+
impl From<DefaultLogicalExpression> for logical_expression::Model {
156+
fn from(value: DefaultLogicalExpression) -> logical_expression::Model {
150157
fn create_logical_expression(
151158
kind: i16,
152159
data: serde_json::Value,
@@ -161,15 +168,15 @@ impl From<LogicalExpression> for logical_expression::Model {
161168

162169
let kind = value.kind();
163170
match value {
164-
LogicalExpression::Scan(scan) => create_logical_expression(
171+
DefaultLogicalExpression::Scan(scan) => create_logical_expression(
165172
kind,
166173
serde_json::to_value(scan).expect("unable to serialize logical `Scan`"),
167174
),
168-
LogicalExpression::Filter(filter) => create_logical_expression(
175+
DefaultLogicalExpression::Filter(filter) => create_logical_expression(
169176
kind,
170177
serde_json::to_value(filter).expect("unable to serialize logical `Filter`"),
171178
),
172-
LogicalExpression::Join(join) => create_logical_expression(
179+
DefaultLogicalExpression::Join(join) => create_logical_expression(
173180
kind,
174181
serde_json::to_value(join).expect("unable to serialize logical `Join`"),
175182
),
@@ -183,16 +190,16 @@ pub use build::*;
183190
#[cfg(test)]
184191
mod build {
185192
use super::*;
186-
use crate::expression::LogicalExpression;
193+
use crate::expression::DefaultLogicalExpression;
187194

188-
pub fn scan(table_schema: String) -> LogicalExpression {
189-
LogicalExpression::Scan(Scan {
195+
pub fn scan(table_schema: String) -> DefaultLogicalExpression {
196+
DefaultLogicalExpression::Scan(Scan {
190197
table: table_schema,
191198
})
192199
}
193200

194-
pub fn filter(child_group: GroupId, expression: String) -> LogicalExpression {
195-
LogicalExpression::Filter(Filter {
201+
pub fn filter(child_group: GroupId, expression: String) -> DefaultLogicalExpression {
202+
DefaultLogicalExpression::Filter(Filter {
196203
child: child_group,
197204
expression,
198205
})
@@ -202,8 +209,8 @@ mod build {
202209
left_group: GroupId,
203210
right_group: GroupId,
204211
expression: String,
205-
) -> LogicalExpression {
206-
LogicalExpression::Join(Join {
212+
) -> DefaultLogicalExpression {
213+
DefaultLogicalExpression::Join(Join {
207214
left: left_group,
208215
right: right_group,
209216
expression,

optd-mvp/src/expression/mod.rs

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -7,56 +7,3 @@ pub use logical_expression::*;
77

88
mod physical_expression;
99
pub use physical_expression::*;
10-
11-
/// The representation of an expression.
12-
///
13-
/// TODO more docs.
14-
#[derive(Clone, Debug)]
15-
pub enum Expression {
16-
Logical(LogicalExpression),
17-
Physical(PhysicalExpression),
18-
}
19-
20-
/// Converts the database / JSON representation of a logical expression into an in-memory one.
21-
impl From<crate::entities::logical_expression::Model> for Expression {
22-
fn from(value: crate::entities::logical_expression::Model) -> Self {
23-
Self::Logical(value.into())
24-
}
25-
}
26-
27-
/// Converts the in-memory representation of a logical expression into the database / JSON version.
28-
///
29-
/// # Panics
30-
///
31-
/// This will panic if the [`Expression`] is [`Expression::Physical`].
32-
impl From<Expression> for crate::entities::logical_expression::Model {
33-
fn from(value: Expression) -> Self {
34-
let Expression::Logical(expr) = value else {
35-
panic!("Attempted to convert an in-memory physical expression into a logical database / JSON expression");
36-
};
37-
38-
expr.into()
39-
}
40-
}
41-
42-
/// Converts the database / JSON representation of a physical expression into an in-memory one.
43-
impl From<crate::entities::physical_expression::Model> for Expression {
44-
fn from(value: crate::entities::physical_expression::Model) -> Self {
45-
Self::Physical(value.into())
46-
}
47-
}
48-
49-
/// Converts the in-memory representation of a physical expression into the database / JSON version.
50-
///
51-
/// # Panics
52-
///
53-
/// This will panic if the [`Expression`] is [`Expression::Physical`].
54-
impl From<Expression> for crate::entities::physical_expression::Model {
55-
fn from(value: Expression) -> Self {
56-
let Expression::Physical(expr) = value else {
57-
panic!("Attempted to convert an in-memory logical expression into a physical database / JSON expression");
58-
};
59-
60-
expr.into()
61-
}
62-
}

optd-mvp/src/expression/physical_expression.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::{entities::*, memo::GroupId};
99
use serde::{Deserialize, Serialize};
1010

1111
#[derive(Clone, Debug, PartialEq, Eq)]
12-
pub enum PhysicalExpression {
12+
pub enum DefaultPhysicalExpression {
1313
TableScan(TableScan),
1414
Filter(PhysicalFilter),
1515
HashJoin(HashJoin),
@@ -34,7 +34,7 @@ pub struct HashJoin {
3434
}
3535

3636
/// TODO Use a macro.
37-
impl From<physical_expression::Model> for PhysicalExpression {
37+
impl From<physical_expression::Model> for DefaultPhysicalExpression {
3838
fn from(value: physical_expression::Model) -> Self {
3939
match value.kind {
4040
0 => Self::TableScan(
@@ -55,8 +55,8 @@ impl From<physical_expression::Model> for PhysicalExpression {
5555
}
5656

5757
/// TODO Use a macro.
58-
impl From<PhysicalExpression> for physical_expression::Model {
59-
fn from(value: PhysicalExpression) -> physical_expression::Model {
58+
impl From<DefaultPhysicalExpression> for physical_expression::Model {
59+
fn from(value: DefaultPhysicalExpression) -> physical_expression::Model {
6060
fn create_physical_expression(
6161
kind: i16,
6262
data: serde_json::Value,
@@ -70,15 +70,15 @@ impl From<PhysicalExpression> for physical_expression::Model {
7070
}
7171

7272
match value {
73-
PhysicalExpression::TableScan(scan) => create_physical_expression(
73+
DefaultPhysicalExpression::TableScan(scan) => create_physical_expression(
7474
0,
7575
serde_json::to_value(scan).expect("unable to serialize physical `TableScan`"),
7676
),
77-
PhysicalExpression::Filter(filter) => create_physical_expression(
77+
DefaultPhysicalExpression::Filter(filter) => create_physical_expression(
7878
1,
7979
serde_json::to_value(filter).expect("unable to serialize physical `Filter`"),
8080
),
81-
PhysicalExpression::HashJoin(join) => create_physical_expression(
81+
DefaultPhysicalExpression::HashJoin(join) => create_physical_expression(
8282
2,
8383
serde_json::to_value(join).expect("unable to serialize physical `HashJoin`"),
8484
),
@@ -92,9 +92,9 @@ pub use build::*;
9292
#[cfg(test)]
9393
mod build {
9494
use super::*;
95-
use crate::expression::PhysicalExpression;
95+
use crate::expression::DefaultPhysicalExpression;
9696

97-
pub fn table_scan(table_schema: String) -> PhysicalExpression {
98-
PhysicalExpression::TableScan(TableScan { table_schema })
97+
pub fn table_scan(table_schema: String) -> DefaultPhysicalExpression {
98+
DefaultPhysicalExpression::TableScan(TableScan { table_schema })
9999
}
100100
}

optd-mvp/src/memo/persistent/implementation.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use super::PersistentMemo;
1010
use crate::{
1111
entities::*,
12-
expression::{LogicalExpression, PhysicalExpression},
12+
expression::{DefaultLogicalExpression, DefaultPhysicalExpression},
1313
memo::{GroupId, GroupStatus, LogicalExpressionId, MemoError, PhysicalExpressionId},
1414
OptimizerResult, DATABASE_URL,
1515
};
@@ -147,7 +147,7 @@ impl PersistentMemo {
147147
pub async fn get_physical_expression(
148148
&self,
149149
physical_expression_id: PhysicalExpressionId,
150-
) -> OptimizerResult<(GroupId, PhysicalExpression)> {
150+
) -> OptimizerResult<(GroupId, DefaultPhysicalExpression)> {
151151
// Lookup the entity in the database via the unique expression ID.
152152
let model = physical_expression::Entity::find_by_id(physical_expression_id.0)
153153
.one(&self.db)
@@ -167,7 +167,7 @@ impl PersistentMemo {
167167
pub async fn get_logical_expression(
168168
&self,
169169
logical_expression_id: LogicalExpressionId,
170-
) -> OptimizerResult<(GroupId, LogicalExpression)> {
170+
) -> OptimizerResult<(GroupId, DefaultLogicalExpression)> {
171171
// Lookup the entity in the database via the unique expression ID.
172172
let model = logical_expression::Entity::find_by_id(logical_expression_id.0)
173173
.one(&self.db)
@@ -288,7 +288,7 @@ impl PersistentMemo {
288288
pub async fn add_logical_expression_to_group(
289289
&self,
290290
group_id: GroupId,
291-
logical_expression: LogicalExpression,
291+
logical_expression: DefaultLogicalExpression,
292292
children: &[GroupId],
293293
) -> OptimizerResult<Result<LogicalExpressionId, (GroupId, LogicalExpressionId)>> {
294294
// Check if the expression already exists anywhere in the memo table.
@@ -323,7 +323,7 @@ impl PersistentMemo {
323323
.await?;
324324

325325
// Finally, insert the fingerprint of the logical expression as well.
326-
let new_expr: LogicalExpression = new_model.into();
326+
let new_expr: DefaultLogicalExpression = new_model.into();
327327
let kind = new_expr.kind();
328328

329329
// In order to calculate a correct fingerprint, we will want to use the IDs of the root
@@ -359,7 +359,7 @@ impl PersistentMemo {
359359
pub async fn add_physical_expression_to_group(
360360
&self,
361361
group_id: GroupId,
362-
physical_expression: PhysicalExpression,
362+
physical_expression: DefaultPhysicalExpression,
363363
children: &[GroupId],
364364
) -> OptimizerResult<PhysicalExpressionId> {
365365
// Check if the group actually exists.
@@ -399,7 +399,7 @@ impl PersistentMemo {
399399
/// expression should _not_ have G2 as a child, and should be replaced with G1.
400400
pub async fn is_duplicate_logical_expression(
401401
&self,
402-
logical_expression: &LogicalExpression,
402+
logical_expression: &DefaultLogicalExpression,
403403
children: &[GroupId],
404404
) -> OptimizerResult<Option<(GroupId, LogicalExpressionId)>> {
405405
let model: logical_expression::Model = logical_expression.clone().into();
@@ -473,7 +473,7 @@ impl PersistentMemo {
473473
/// expression, returning brand new IDs for both.
474474
pub async fn add_group(
475475
&self,
476-
logical_expression: LogicalExpression,
476+
logical_expression: DefaultLogicalExpression,
477477
children: &[GroupId],
478478
) -> OptimizerResult<Result<(GroupId, LogicalExpressionId), (GroupId, LogicalExpressionId)>>
479479
{
@@ -517,7 +517,7 @@ impl PersistentMemo {
517517
.await?;
518518

519519
// Finally, insert the fingerprint of the logical expression as well.
520-
let new_logical_expression: LogicalExpression = new_expression.into();
520+
let new_logical_expression: DefaultLogicalExpression = new_expression.into();
521521
let kind = new_logical_expression.kind();
522522

523523
// In order to calculate a correct fingerprint, we will want to use the IDs of the root
@@ -606,7 +606,7 @@ impl PersistentMemo {
606606
seen.insert(expr_id);
607607
}
608608

609-
let logical_expression: LogicalExpression = model.into();
609+
let logical_expression: DefaultLogicalExpression = model.into();
610610
let hash = logical_expression.fingerprint_with_rewrite(&rewrites);
611611

612612
let fingerprint = fingerprint::ActiveModel {

optd-mvp/src/memo/persistent/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ async fn test_simple_tree() {
9999
memo.cleanup().await;
100100

101101
// Create two scan groups.
102-
let scan1: LogicalExpression = scan("t1".to_string());
102+
let scan1: DefaultLogicalExpression = scan("t1".to_string());
103103
let scan2 = scan("t2".to_string());
104104
let (scan_id_1, scan_expr_id_1) = memo.add_group(scan1, &[]).await.unwrap().ok().unwrap();
105105
let (scan_id_2, scan_expr_id_2) = memo.add_group(scan2, &[]).await.unwrap().ok().unwrap();

0 commit comments

Comments
 (0)