Skip to content

Commit

Permalink
first draft of attempt at modeling optimization with persistent memo
Browse files Browse the repository at this point in the history
  • Loading branch information
connortsui20 committed Jan 15, 2025
1 parent 3bbc871 commit 1a8be91
Show file tree
Hide file tree
Showing 6 changed files with 176 additions and 10 deletions.
43 changes: 33 additions & 10 deletions optd-types/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,37 @@
pub fn add(left: u64, right: u64) -> u64 {
left + right
mod memo;
pub use memo::MemoNode;

/// A type representing a transformation or implementation rule for query operators.
///
/// TODO The variants are just placeholders.
pub enum Rule {
Transformation,
Implementation
}

#[cfg(test)]
mod tests {
use super::*;
pub struct GroupId(usize);

Check warning on line 12 in optd-types/src/lib.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/lib.rs#L12

warning: field `0` is never read --> optd-types/src/lib.rs:12:20 | 12 | pub struct GroupId(usize); | ------- ^^^^^ | | | field in this struct | = help: consider removing this field = note: `#[warn(dead_code)]` on by default
Raw output
optd-types/src/lib.rs:12:12:w:warning: field `0` is never read
  --> optd-types/src/lib.rs:12:20
   |
12 | pub struct GroupId(usize);
   |            ------- ^^^^^
   |            |
   |            field in this struct
   |
   = help: consider removing this field
   = note: `#[warn(dead_code)]` on by default


__END__

/// An in-memory tree of logical operators. Used as the input / entrypoint of the optimizer.
///
/// TODO The variants are just placeholders. The actual type will look more similar to
/// https://docs.rs/substrait/latest/substrait/proto/rel/enum.RelType.html
pub enum LogicalPlan {
Scan(String),
Filter(Box<LogicalPlan>),
Sort(Box<LogicalPlan>),
Join(Box<LogicalPlan>),
}

#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
/// An in-memory tree of physical operators. Used as the final materialized output of the optimizer.
///
/// TODO The variants are just placeholders. The actual type will look more similar to
/// https://docs.rs/substrait/latest/substrait/proto/rel/enum.RelType.html
pub enum PhysicalPlan {
TableScan(String),
IndexScan(String),
PhysicalFilter(Box<PhysicalPlan>),
NestedLoopJoin(Box<PhysicalPlan>),
SortMergeJoin(Box<PhysicalPlan>),
HashJoin(Box<PhysicalPlan>),
MergeSort(Box<PhysicalPlan>),
}
60 changes: 60 additions & 0 deletions optd-types/src/memo/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use relation::{LogicalExpression, Relation};
use scalar::Scalar;

use crate::Rule;

mod relation;
mod scalar;

/// A type representing an optimization node / object in the memo table.
pub enum MemoNode {
Relation(Relation),
Scalar(Scalar),
}

/// A type representing a tree of logical nodes, scalar nodes, and group IDs.
///
/// Note that group IDs must be leaves of this tree.
///
/// TODO Make this an actual tree with the correct modeling of types.
pub struct PartialLogicalExpression;

Check warning on line 20 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L20

warning: struct `PartialLogicalExpression` is never constructed --> optd-types/src/memo/mod.rs:20:12 | 20 | pub struct PartialLogicalExpression; | ^^^^^^^^^^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/mod.rs:20:12:w:warning: struct `PartialLogicalExpression` is never constructed
  --> optd-types/src/memo/mod.rs:20:12
   |
20 | pub struct PartialLogicalExpression;
   |            ^^^^^^^^^^^^^^^^^^^^^^^^


__END__

/// A type representing a tree of logical nodes, physical nodes, scalar nodes, and group IDs.
///
/// Note that group IDs must be leaves of this tree, and that physical nodes cannot have children
/// that are logical nodes.
///
/// TODO Make this an actual tree with the correct modeling of types.
pub struct PartialPhysicalExpression;

Check warning on line 28 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L28

warning: struct `PartialPhysicalExpression` is never constructed --> optd-types/src/memo/mod.rs:28:12 | 28 | pub struct PartialPhysicalExpression; | ^^^^^^^^^^^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/mod.rs:28:12:w:warning: struct `PartialPhysicalExpression` is never constructed
  --> optd-types/src/memo/mod.rs:28:12
   |
28 | pub struct PartialPhysicalExpression;
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^


__END__

pub struct Memo;

Check warning on line 30 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L30

warning: struct `Memo` is never constructed --> optd-types/src/memo/mod.rs:30:12 | 30 | pub struct Memo; | ^^^^
Raw output
optd-types/src/memo/mod.rs:30:12:w:warning: struct `Memo` is never constructed
  --> optd-types/src/memo/mod.rs:30:12
   |
30 | pub struct Memo;
   |            ^^^^


__END__

impl Memo {

Check warning on line 32 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L32

warning: methods `check_transformation`, `check_implementation`, `apply_transformation`, `apply_implementation`, and `add_expressions` are never used --> optd-types/src/memo/mod.rs:33:18 | 32 | impl Memo { | --------- methods in this implementation 33 | pub async fn check_transformation( | ^^^^^^^^^^^^^^^^^^^^ ... 41 | pub async fn check_implementation( | ^^^^^^^^^^^^^^^^^^^^ ... 49 | pub fn apply_transformation(&mut self, expr: PartialLogicalExpression, rule: Rule) -> Vec<MemoNode> { | ^^^^^^^^^^^^^^^^^^^^ ... 53 | pub fn apply_implementation(&mut self, expr: PartialPhysicalExpression, rule: Rule) -> Vec<MemoNode> { | ^^^^^^^^^^^^^^^^^^^^ ... 57 | pub fn add_expressions(&mut self, new_exprs: Vec<MemoNode>) { | ^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/mod.rs:32:1:w:warning: methods `check_transformation`, `check_implementation`, `apply_transformation`, `apply_implementation`, and `add_expressions` are never used
  --> optd-types/src/memo/mod.rs:33:18
   |
32 | impl Memo {
   | --------- methods in this implementation
33 |     pub async fn check_transformation(
   |                  ^^^^^^^^^^^^^^^^^^^^
...
41 |     pub async fn check_implementation(
   |                  ^^^^^^^^^^^^^^^^^^^^
...
49 |     pub fn apply_transformation(&mut self, expr: PartialLogicalExpression, rule: Rule) -> Vec<MemoNode> {
   |            ^^^^^^^^^^^^^^^^^^^^
...
53 |     pub fn apply_implementation(&mut self, expr: PartialPhysicalExpression, rule: Rule) -> Vec<MemoNode> {
   |            ^^^^^^^^^^^^^^^^^^^^
...
57 |     pub fn add_expressions(&mut self, new_exprs: Vec<MemoNode>) {
   |            ^^^^^^^^^^^^^^^


__END__
pub async fn check_transformation(
&self,
expr: LogicalExpression,

Check warning on line 35 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L35

warning: unused variable: `expr` --> optd-types/src/memo/mod.rs:35:9 | 35 | expr: LogicalExpression, | ^^^^ help: if this is intentional, prefix it with an underscore: `_expr` | = note: `#[warn(unused_variables)]` on by default
Raw output
optd-types/src/memo/mod.rs:35:9:w:warning: unused variable: `expr`
  --> optd-types/src/memo/mod.rs:35:9
   |
35 |         expr: LogicalExpression,
   |         ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
   |
   = note: `#[warn(unused_variables)]` on by default


__END__
rule: Rule,

Check warning on line 36 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L36

warning: unused variable: `rule` --> optd-types/src/memo/mod.rs:36:9 | 36 | rule: Rule, | ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`
Raw output
optd-types/src/memo/mod.rs:36:9:w:warning: unused variable: `rule`
  --> optd-types/src/memo/mod.rs:36:9
   |
36 |         rule: Rule,
   |         ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`


__END__
) -> Vec<PartialLogicalExpression> {
todo!()
}

pub async fn check_implementation(
&self,
expr: LogicalExpression,

Check warning on line 43 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L43

warning: unused variable: `expr` --> optd-types/src/memo/mod.rs:43:9 | 43 | expr: LogicalExpression, | ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
Raw output
optd-types/src/memo/mod.rs:43:9:w:warning: unused variable: `expr`
  --> optd-types/src/memo/mod.rs:43:9
   |
43 |         expr: LogicalExpression,
   |         ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`


__END__
rule: Rule,

Check warning on line 44 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L44

warning: unused variable: `rule` --> optd-types/src/memo/mod.rs:44:9 | 44 | rule: Rule, | ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`
Raw output
optd-types/src/memo/mod.rs:44:9:w:warning: unused variable: `rule`
  --> optd-types/src/memo/mod.rs:44:9
   |
44 |         rule: Rule,
   |         ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`


__END__
) -> Vec<PartialPhysicalExpression> {
todo!()
}

pub fn apply_transformation(&mut self, expr: PartialLogicalExpression, rule: Rule) -> Vec<MemoNode> {

Check warning on line 49 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L49

warning: unused variable: `expr` --> optd-types/src/memo/mod.rs:49:44 | 49 | pub fn apply_transformation(&mut self, expr: PartialLogicalExpression, rule: Rule) -> Vec<MemoNode> { | ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
Raw output
optd-types/src/memo/mod.rs:49:44:w:warning: unused variable: `expr`
  --> optd-types/src/memo/mod.rs:49:44
   |
49 |     pub fn apply_transformation(&mut self, expr: PartialLogicalExpression, rule: Rule) -> Vec<MemoNode> {
   |                                            ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`


__END__

Check warning on line 49 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L49

warning: unused variable: `rule` --> optd-types/src/memo/mod.rs:49:76 | 49 | pub fn apply_transformation(&mut self, expr: PartialLogicalExpression, rule: Rule) -> Vec<MemoNode> { | ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`
Raw output
optd-types/src/memo/mod.rs:49:76:w:warning: unused variable: `rule`
  --> optd-types/src/memo/mod.rs:49:76
   |
49 |     pub fn apply_transformation(&mut self, expr: PartialLogicalExpression, rule: Rule) -> Vec<MemoNode> {
   |                                                                            ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`


__END__
todo!()
}

pub fn apply_implementation(&mut self, expr: PartialPhysicalExpression, rule: Rule) -> Vec<MemoNode> {

Check warning on line 53 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L53

warning: unused variable: `expr` --> optd-types/src/memo/mod.rs:53:44 | 53 | pub fn apply_implementation(&mut self, expr: PartialPhysicalExpression, rule: Rule) -> Vec<MemoNode> { | ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
Raw output
optd-types/src/memo/mod.rs:53:44:w:warning: unused variable: `expr`
  --> optd-types/src/memo/mod.rs:53:44
   |
53 |     pub fn apply_implementation(&mut self, expr: PartialPhysicalExpression, rule: Rule) -> Vec<MemoNode> {
   |                                            ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`


__END__

Check warning on line 53 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L53

warning: unused variable: `rule` --> optd-types/src/memo/mod.rs:53:77 | 53 | pub fn apply_implementation(&mut self, expr: PartialPhysicalExpression, rule: Rule) -> Vec<MemoNode> { | ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`
Raw output
optd-types/src/memo/mod.rs:53:77:w:warning: unused variable: `rule`
  --> optd-types/src/memo/mod.rs:53:77
   |
53 |     pub fn apply_implementation(&mut self, expr: PartialPhysicalExpression, rule: Rule) -> Vec<MemoNode> {
   |                                                                             ^^^^ help: if this is intentional, prefix it with an underscore: `_rule`


__END__
todo!()
}

pub fn add_expressions(&mut self, new_exprs: Vec<MemoNode>) {

Check warning on line 57 in optd-types/src/memo/mod.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/mod.rs#L57

warning: unused variable: `new_exprs` --> optd-types/src/memo/mod.rs:57:39 | 57 | pub fn add_expressions(&mut self, new_exprs: Vec<MemoNode>) { | ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_new_exprs`
Raw output
optd-types/src/memo/mod.rs:57:39:w:warning: unused variable: `new_exprs`
  --> optd-types/src/memo/mod.rs:57:39
   |
57 |     pub fn add_expressions(&mut self, new_exprs: Vec<MemoNode>) {
   |                                       ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_new_exprs`


__END__
todo!()
}
}
29 changes: 29 additions & 0 deletions optd-types/src/memo/relation/logical_expression.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
use crate::GroupId;

/// A type representing different kinds of logical expressions / operators.
pub enum LogicalExpression {
Scan(Scan),

Check warning on line 5 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L5

warning: type `memo::relation::logical_expression::Scan` is more private than the item `memo::relation::logical_expression::LogicalExpression::Scan::0` --> optd-types/src/memo/relation/logical_expression.rs:5:10 | 5 | Scan(Scan), | ^^^^ field `memo::relation::logical_expression::LogicalExpression::Scan::0` is reachable at visibility `pub` | note: but type `memo::relation::logical_expression::Scan` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/logical_expression.rs:11:1 | 11 | struct Scan { | ^^^^^^^^^^^ = note: `#[warn(private_interfaces)]` on by default
Raw output
optd-types/src/memo/relation/logical_expression.rs:5:10:w:warning: type `memo::relation::logical_expression::Scan` is more private than the item `memo::relation::logical_expression::LogicalExpression::Scan::0`
  --> optd-types/src/memo/relation/logical_expression.rs:5:10
   |
5  |     Scan(Scan),
   |          ^^^^ field `memo::relation::logical_expression::LogicalExpression::Scan::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::logical_expression::Scan` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/logical_expression.rs:11:1
   |
11 | struct Scan {
   | ^^^^^^^^^^^
   = note: `#[warn(private_interfaces)]` on by default


__END__
Filter(Filter),

Check warning on line 6 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L6

warning: type `memo::relation::logical_expression::Filter` is more private than the item `memo::relation::logical_expression::LogicalExpression::Filter::0` --> optd-types/src/memo/relation/logical_expression.rs:6:12 | 6 | Filter(Filter), | ^^^^^^ field `memo::relation::logical_expression::LogicalExpression::Filter::0` is reachable at visibility `pub` | note: but type `memo::relation::logical_expression::Filter` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/logical_expression.rs:15:1 | 15 | struct Filter { | ^^^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/logical_expression.rs:6:12:w:warning: type `memo::relation::logical_expression::Filter` is more private than the item `memo::relation::logical_expression::LogicalExpression::Filter::0`
  --> optd-types/src/memo/relation/logical_expression.rs:6:12
   |
6  |     Filter(Filter),
   |            ^^^^^^ field `memo::relation::logical_expression::LogicalExpression::Filter::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::logical_expression::Filter` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/logical_expression.rs:15:1
   |
15 | struct Filter {
   | ^^^^^^^^^^^^^


__END__
Join(Join),

Check warning on line 7 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L7

warning: type `memo::relation::logical_expression::Join` is more private than the item `memo::relation::logical_expression::LogicalExpression::Join::0` --> optd-types/src/memo/relation/logical_expression.rs:7:10 | 7 | Join(Join), | ^^^^ field `memo::relation::logical_expression::LogicalExpression::Join::0` is reachable at visibility `pub` | note: but type `memo::relation::logical_expression::Join` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/logical_expression.rs:20:1 | 20 | struct Join { | ^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/logical_expression.rs:7:10:w:warning: type `memo::relation::logical_expression::Join` is more private than the item `memo::relation::logical_expression::LogicalExpression::Join::0`
  --> optd-types/src/memo/relation/logical_expression.rs:7:10
   |
7  |     Join(Join),
   |          ^^^^ field `memo::relation::logical_expression::LogicalExpression::Join::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::logical_expression::Join` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/logical_expression.rs:20:1
   |
20 | struct Join {
   | ^^^^^^^^^^^


__END__
Sort(Sort),

Check warning on line 8 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L8

warning: type `memo::relation::logical_expression::Sort` is more private than the item `memo::relation::logical_expression::LogicalExpression::Sort::0` --> optd-types/src/memo/relation/logical_expression.rs:8:10 | 8 | Sort(Sort), | ^^^^ field `memo::relation::logical_expression::LogicalExpression::Sort::0` is reachable at visibility `pub` | note: but type `memo::relation::logical_expression::Sort` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/logical_expression.rs:26:1 | 26 | struct Sort { | ^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/logical_expression.rs:8:10:w:warning: type `memo::relation::logical_expression::Sort` is more private than the item `memo::relation::logical_expression::LogicalExpression::Sort::0`
  --> optd-types/src/memo/relation/logical_expression.rs:8:10
   |
8  |     Sort(Sort),
   |          ^^^^ field `memo::relation::logical_expression::LogicalExpression::Sort::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::logical_expression::Sort` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/logical_expression.rs:26:1
   |
26 | struct Sort {
   | ^^^^^^^^^^^


__END__
}

struct Scan {

Check warning on line 11 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L11

warning: field `table_name` is never read --> optd-types/src/memo/relation/logical_expression.rs:12:5 | 11 | struct Scan { | ---- field in this struct 12 | table_name: String, | ^^^^^^^^^^
Raw output
optd-types/src/memo/relation/logical_expression.rs:11:8:w:warning: field `table_name` is never read
  --> optd-types/src/memo/relation/logical_expression.rs:12:5
   |
11 | struct Scan {
   |        ---- field in this struct
12 |     table_name: String,
   |     ^^^^^^^^^^


__END__
table_name: String,
}

struct Filter {

Check warning on line 15 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L15

warning: fields `child` and `predicate` are never read --> optd-types/src/memo/relation/logical_expression.rs:16:5 | 15 | struct Filter { | ------ fields in this struct 16 | child: GroupId, | ^^^^^ 17 | predicate: GroupId, | ^^^^^^^^^
Raw output
optd-types/src/memo/relation/logical_expression.rs:15:8:w:warning: fields `child` and `predicate` are never read
  --> optd-types/src/memo/relation/logical_expression.rs:16:5
   |
15 | struct Filter {
   |        ------ fields in this struct
16 |     child: GroupId,
   |     ^^^^^
17 |     predicate: GroupId,
   |     ^^^^^^^^^


__END__
child: GroupId,
predicate: GroupId,
}

struct Join {

Check warning on line 20 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L20

warning: fields `left`, `right`, and `condition` are never read --> optd-types/src/memo/relation/logical_expression.rs:21:5 | 20 | struct Join { | ---- fields in this struct 21 | left: GroupId, | ^^^^ 22 | right: GroupId, | ^^^^^ 23 | condition: GroupId, | ^^^^^^^^^
Raw output
optd-types/src/memo/relation/logical_expression.rs:20:8:w:warning: fields `left`, `right`, and `condition` are never read
  --> optd-types/src/memo/relation/logical_expression.rs:21:5
   |
20 | struct Join {
   |        ---- fields in this struct
21 |     left: GroupId,
   |     ^^^^
22 |     right: GroupId,
   |     ^^^^^
23 |     condition: GroupId,
   |     ^^^^^^^^^


__END__
left: GroupId,
right: GroupId,
condition: GroupId,
}

struct Sort {

Check warning on line 26 in optd-types/src/memo/relation/logical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/logical_expression.rs#L26

warning: fields `child` and `sort_expr` are never read --> optd-types/src/memo/relation/logical_expression.rs:27:5 | 26 | struct Sort { | ---- fields in this struct 27 | child: GroupId, | ^^^^^ 28 | sort_expr: GroupId, | ^^^^^^^^^
Raw output
optd-types/src/memo/relation/logical_expression.rs:26:8:w:warning: fields `child` and `sort_expr` are never read
  --> optd-types/src/memo/relation/logical_expression.rs:27:5
   |
26 | struct Sort {
   |        ---- fields in this struct
27 |     child: GroupId,
   |     ^^^^^
28 |     sort_expr: GroupId,
   |     ^^^^^^^^^


__END__
child: GroupId,
sort_expr: GroupId,
}
11 changes: 11 additions & 0 deletions optd-types/src/memo/relation/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
mod logical_expression;
pub use logical_expression::LogicalExpression;

mod physical_expression;
pub use physical_expression::PhysicalExpression;

/// A type representing logical or physical operators in a relational algebraic query plan.
pub enum Relation {
Logical(LogicalExpression),
Physical(PhysicalExpression),
}
39 changes: 39 additions & 0 deletions optd-types/src/memo/relation/physical_expression.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use crate::GroupId;

/// A type representing different kinds of physical expressions / operators.
pub enum PhysicalExpression {
TableScan(TableScan),

Check warning on line 5 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L5

warning: type `memo::relation::physical_expression::TableScan` is more private than the item `memo::relation::physical_expression::PhysicalExpression::TableScan::0` --> optd-types/src/memo/relation/physical_expression.rs:5:15 | 5 | TableScan(TableScan), | ^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::TableScan::0` is reachable at visibility `pub` | note: but type `memo::relation::physical_expression::TableScan` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/physical_expression.rs:12:1 | 12 | struct TableScan { | ^^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:5:15:w:warning: type `memo::relation::physical_expression::TableScan` is more private than the item `memo::relation::physical_expression::PhysicalExpression::TableScan::0`
  --> optd-types/src/memo/relation/physical_expression.rs:5:15
   |
5  |     TableScan(TableScan),
   |               ^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::TableScan::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::physical_expression::TableScan` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/physical_expression.rs:12:1
   |
12 | struct TableScan {
   | ^^^^^^^^^^^^^^^^


__END__
PhysicalFilter(PhysicalFilter),

Check warning on line 6 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L6

warning: type `memo::relation::physical_expression::PhysicalFilter` is more private than the item `memo::relation::physical_expression::PhysicalExpression::PhysicalFilter::0` --> optd-types/src/memo/relation/physical_expression.rs:6:20 | 6 | PhysicalFilter(PhysicalFilter), | ^^^^^^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::PhysicalFilter::0` is reachable at visibility `pub` | note: but type `memo::relation::physical_expression::PhysicalFilter` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/physical_expression.rs:16:1 | 16 | struct PhysicalFilter { | ^^^^^^^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:6:20:w:warning: type `memo::relation::physical_expression::PhysicalFilter` is more private than the item `memo::relation::physical_expression::PhysicalExpression::PhysicalFilter::0`
  --> optd-types/src/memo/relation/physical_expression.rs:6:20
   |
6  |     PhysicalFilter(PhysicalFilter),
   |                    ^^^^^^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::PhysicalFilter::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::physical_expression::PhysicalFilter` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/physical_expression.rs:16:1
   |
16 | struct PhysicalFilter {
   | ^^^^^^^^^^^^^^^^^^^^^


__END__
SortMergeJoin(SortMergeJoin),

Check warning on line 7 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L7

warning: type `memo::relation::physical_expression::SortMergeJoin` is more private than the item `memo::relation::physical_expression::PhysicalExpression::SortMergeJoin::0` --> optd-types/src/memo/relation/physical_expression.rs:7:19 | 7 | SortMergeJoin(SortMergeJoin), | ^^^^^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::SortMergeJoin::0` is reachable at visibility `pub` | note: but type `memo::relation::physical_expression::SortMergeJoin` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/physical_expression.rs:22:1 | 22 | struct SortMergeJoin { | ^^^^^^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:7:19:w:warning: type `memo::relation::physical_expression::SortMergeJoin` is more private than the item `memo::relation::physical_expression::PhysicalExpression::SortMergeJoin::0`
  --> optd-types/src/memo/relation/physical_expression.rs:7:19
   |
7  |     SortMergeJoin(SortMergeJoin),
   |                   ^^^^^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::SortMergeJoin::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::physical_expression::SortMergeJoin` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/physical_expression.rs:22:1
   |
22 | struct SortMergeJoin {
   | ^^^^^^^^^^^^^^^^^^^^


__END__
HashJoin(HashJoin),

Check warning on line 8 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L8

warning: type `memo::relation::physical_expression::HashJoin` is more private than the item `memo::relation::physical_expression::PhysicalExpression::HashJoin::0` --> optd-types/src/memo/relation/physical_expression.rs:8:14 | 8 | HashJoin(HashJoin), | ^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::HashJoin::0` is reachable at visibility `pub` | note: but type `memo::relation::physical_expression::HashJoin` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/physical_expression.rs:29:1 | 29 | struct HashJoin { | ^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:8:14:w:warning: type `memo::relation::physical_expression::HashJoin` is more private than the item `memo::relation::physical_expression::PhysicalExpression::HashJoin::0`
  --> optd-types/src/memo/relation/physical_expression.rs:8:14
   |
8  |     HashJoin(HashJoin),
   |              ^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::HashJoin::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::physical_expression::HashJoin` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/physical_expression.rs:29:1
   |
29 | struct HashJoin {
   | ^^^^^^^^^^^^^^^


__END__
MergeSort(MergeSort),

Check warning on line 9 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L9

warning: type `memo::relation::physical_expression::MergeSort` is more private than the item `memo::relation::physical_expression::PhysicalExpression::MergeSort::0` --> optd-types/src/memo/relation/physical_expression.rs:9:15 | 9 | MergeSort(MergeSort), | ^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::MergeSort::0` is reachable at visibility `pub` | note: but type `memo::relation::physical_expression::MergeSort` is only usable at visibility `pub(self)` --> optd-types/src/memo/relation/physical_expression.rs:35:1 | 35 | struct MergeSort { | ^^^^^^^^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:9:15:w:warning: type `memo::relation::physical_expression::MergeSort` is more private than the item `memo::relation::physical_expression::PhysicalExpression::MergeSort::0`
  --> optd-types/src/memo/relation/physical_expression.rs:9:15
   |
9  |     MergeSort(MergeSort),
   |               ^^^^^^^^^ field `memo::relation::physical_expression::PhysicalExpression::MergeSort::0` is reachable at visibility `pub`
   |
note: but type `memo::relation::physical_expression::MergeSort` is only usable at visibility `pub(self)`
  --> optd-types/src/memo/relation/physical_expression.rs:35:1
   |
35 | struct MergeSort {
   | ^^^^^^^^^^^^^^^^


__END__
}

struct TableScan {

Check warning on line 12 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L12

warning: field `table_name` is never read --> optd-types/src/memo/relation/physical_expression.rs:13:5 | 12 | struct TableScan { | --------- field in this struct 13 | table_name: String, | ^^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:12:8:w:warning: field `table_name` is never read
  --> optd-types/src/memo/relation/physical_expression.rs:13:5
   |
12 | struct TableScan {
   |        --------- field in this struct
13 |     table_name: String,
   |     ^^^^^^^^^^


__END__
table_name: String,
}

struct PhysicalFilter {

Check warning on line 16 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L16

warning: fields `child` and `predicate` are never read --> optd-types/src/memo/relation/physical_expression.rs:17:5 | 16 | struct PhysicalFilter { | -------------- fields in this struct 17 | child: GroupId, | ^^^^^ 18 | predicate: GroupId, | ^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:16:8:w:warning: fields `child` and `predicate` are never read
  --> optd-types/src/memo/relation/physical_expression.rs:17:5
   |
16 | struct PhysicalFilter {
   |        -------------- fields in this struct
17 |     child: GroupId,
   |     ^^^^^
18 |     predicate: GroupId,
   |     ^^^^^^^^^


__END__
child: GroupId,
predicate: GroupId,
}


struct SortMergeJoin {

Check warning on line 22 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L22

warning: fields `left`, `right`, `condition`, and `sort_expr` are never read --> optd-types/src/memo/relation/physical_expression.rs:23:5 | 22 | struct SortMergeJoin { | ------------- fields in this struct 23 | left: GroupId, | ^^^^ 24 | right: GroupId, | ^^^^^ 25 | condition: GroupId, | ^^^^^^^^^ 26 | sort_expr: GroupId, | ^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:22:8:w:warning: fields `left`, `right`, `condition`, and `sort_expr` are never read
  --> optd-types/src/memo/relation/physical_expression.rs:23:5
   |
22 | struct SortMergeJoin {
   |        ------------- fields in this struct
23 |     left: GroupId,
   |     ^^^^
24 |     right: GroupId,
   |     ^^^^^
25 |     condition: GroupId,
   |     ^^^^^^^^^
26 |     sort_expr: GroupId,
   |     ^^^^^^^^^


__END__
left: GroupId,
right: GroupId,
condition: GroupId,
sort_expr: GroupId,
}

struct HashJoin {

Check warning on line 29 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L29

warning: fields `left`, `right`, and `condition` are never read --> optd-types/src/memo/relation/physical_expression.rs:30:5 | 29 | struct HashJoin { | -------- fields in this struct 30 | left: GroupId, | ^^^^ 31 | right: GroupId, | ^^^^^ 32 | condition: GroupId, | ^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:29:8:w:warning: fields `left`, `right`, and `condition` are never read
  --> optd-types/src/memo/relation/physical_expression.rs:30:5
   |
29 | struct HashJoin {
   |        -------- fields in this struct
30 |     left: GroupId,
   |     ^^^^
31 |     right: GroupId,
   |     ^^^^^
32 |     condition: GroupId,
   |     ^^^^^^^^^


__END__
left: GroupId,
right: GroupId,
condition: GroupId,
}

struct MergeSort {

Check warning on line 35 in optd-types/src/memo/relation/physical_expression.rs

View workflow job for this annotation

GitHub Actions / clippy

[clippy] optd-types/src/memo/relation/physical_expression.rs#L35

warning: fields `child` and `sort_expr` are never read --> optd-types/src/memo/relation/physical_expression.rs:36:5 | 35 | struct MergeSort { | --------- fields in this struct 36 | child: GroupId, | ^^^^^ 37 | sort_expr: GroupId, | ^^^^^^^^^
Raw output
optd-types/src/memo/relation/physical_expression.rs:35:8:w:warning: fields `child` and `sort_expr` are never read
  --> optd-types/src/memo/relation/physical_expression.rs:36:5
   |
35 | struct MergeSort {
   |        --------- fields in this struct
36 |     child: GroupId,
   |     ^^^^^
37 |     sort_expr: GroupId,
   |     ^^^^^^^^^


__END__
child: GroupId,
sort_expr: GroupId,
}

4 changes: 4 additions & 0 deletions optd-types/src/memo/scalar.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/// A type that represent scalar SQL expression / predicates.
///
/// TODO Add fields to this type.
pub struct Scalar;

0 comments on commit 1a8be91

Please sign in to comment.