Skip to content

Commit bcaa89e

Browse files
committed
in work
1 parent 4f97867 commit bcaa89e

File tree

8 files changed

+120
-21
lines changed

8 files changed

+120
-21
lines changed

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/logical_node.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ pub enum PlanNode {
113113
MultiStageMeasureCalculation(Rc<MultiStageMeasureCalculation>),
114114
MultiStageTimeSeries(Rc<MultiStageTimeSeries>),
115115
MultiStageRollingWindow(Rc<MultiStageRollingWindow>),
116+
LogicalMultiStageMember(Rc<LogicalMultiStageMember>),
116117
}
117118

118119
impl PlanNode {
@@ -133,6 +134,7 @@ impl PlanNode {
133134
PlanNode::MultiStageMeasureCalculation(_) => MultiStageMeasureCalculation::node_name(),
134135
PlanNode::MultiStageTimeSeries(_) => MultiStageTimeSeries::node_name(),
135136
PlanNode::MultiStageRollingWindow(_) => MultiStageRollingWindow::node_name(),
137+
PlanNode::LogicalMultiStageMember(_) => LogicalMultiStageMember::node_name(),
136138
}
137139
}
138140

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub mod pretty_print;
1515
mod query;
1616
mod resolve_multiplied_measures;
1717
mod schema;
18+
pub mod visitor;
1819

1920
pub use aggregate_multiplied_subquery::*;
2021
pub use cube::*;

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/multistage/member.rs

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,35 @@
11
use crate::logical_plan::*;
2+
use cubenativeutils::CubeError;
3+
use std::rc::Rc;
24

35
pub enum MultiStageMemberLogicalType {
4-
LeafMeasure(MultiStageLeafMeasure),
5-
MeasureCalculation(MultiStageMeasureCalculation),
6-
GetDateRange(MultiStageGetDateRange),
7-
TimeSeries(MultiStageTimeSeries),
8-
RollingWindow(MultiStageRollingWindow),
6+
LeafMeasure(Rc<MultiStageLeafMeasure>),
7+
MeasureCalculation(Rc<MultiStageMeasureCalculation>),
8+
GetDateRange(Rc<MultiStageGetDateRange>),
9+
TimeSeries(Rc<MultiStageTimeSeries>),
10+
RollingWindow(Rc<MultiStageRollingWindow>),
11+
}
12+
13+
impl MultiStageMemberLogicalType {
14+
fn as_plan_node(&self) -> PlanNode {
15+
match self {
16+
Self::LeafMeasure(item) => item.as_plan_node(),
17+
Self::MeasureCalculation(item) => item.as_plan_node(),
18+
Self::GetDateRange(item) => item.as_plan_node(),
19+
Self::TimeSeries(item) => item.as_plan_node(),
20+
Self::RollingWindow(item) => item.as_plan_node(),
21+
}
22+
}
23+
24+
fn with_plan_node(&self, plan_node: PlanNode) -> Result<Self, CubeError> {
25+
Ok(match self {
26+
Self::LeafMeasure(_) => Self::LeafMeasure(plan_node.into_logical_node()?),
27+
Self::MeasureCalculation(_) => Self::MeasureCalculation(plan_node.into_logical_node()?),
28+
Self::GetDateRange(_) => Self::GetDateRange(plan_node.into_logical_node()?),
29+
Self::TimeSeries(_) => Self::TimeSeries(plan_node.into_logical_node()?),
30+
Self::RollingWindow(_) => Self::RollingWindow(plan_node.into_logical_node()?),
31+
})
32+
}
933
}
1034

1135
impl PrettyPrint for MultiStageMemberLogicalType {
@@ -25,6 +49,39 @@ pub struct LogicalMultiStageMember {
2549
pub member_type: MultiStageMemberLogicalType,
2650
}
2751

52+
impl LogicalNode for LogicalMultiStageMember {
53+
type InputsType = SingleNodeInput;
54+
55+
fn as_plan_node(self: &Rc<Self>) -> PlanNode {
56+
PlanNode::LogicalMultiStageMember(self.clone())
57+
}
58+
59+
fn inputs(&self) -> Self::InputsType {
60+
SingleNodeInput::new(self.member_type.as_plan_node())
61+
}
62+
63+
fn with_inputs(self: Rc<Self>, inputs: Self::InputsType) -> Result<Rc<Self>, CubeError> {
64+
let input = inputs.unpack();
65+
66+
Ok(Rc::new(Self {
67+
name: self.name.clone(),
68+
member_type: self.member_type.with_plan_node(input)?,
69+
}))
70+
}
71+
72+
fn node_name() -> &'static str {
73+
"LogicalMultiStageMember"
74+
}
75+
76+
fn try_from_plan_node(plan_node: PlanNode) -> Result<Rc<Self>, CubeError> {
77+
if let PlanNode::LogicalMultiStageMember(item) = plan_node {
78+
Ok(item)
79+
} else {
80+
Err(cast_error::<Self>(&plan_node))
81+
}
82+
}
83+
}
84+
2885
impl PrettyPrint for LogicalMultiStageMember {
2986
fn pretty_print(&self, result: &mut PrettyPrintResult, state: &PrettyPrintState) {
3087
result.println(&format!("MultiStageMember `{}`: ", self.name), state);

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/query.rs

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,47 @@ pub struct Query {
4747
}
4848

4949
impl LogicalNode for Query {
50-
type InputsType = SingleNodeInput;
50+
type InputsType = QueryInput;
5151

5252
fn as_plan_node(self: &Rc<Self>) -> PlanNode {
5353
PlanNode::Query(self.clone())
5454
}
5555

5656
fn inputs(&self) -> Self::InputsType {
57-
SingleNodeInput::new(self.source.as_plan_node())
57+
let source = self.source.as_plan_node();
58+
let multistage_members = self
59+
.multistage_members
60+
.iter()
61+
.map(|member| member.as_plan_node())
62+
.collect();
63+
64+
QueryInput {
65+
source,
66+
multistage_members,
67+
}
5868
}
5969

6070
fn with_inputs(self: Rc<Self>, inputs: Self::InputsType) -> Result<Rc<Self>, CubeError> {
61-
let input = inputs.unpack();
71+
let QueryInput {
72+
source,
73+
multistage_members,
74+
} = inputs;
75+
76+
check_inputs_len::<Self>(
77+
"multistage_members",
78+
&multistage_members,
79+
self.multistage_members.len(),
80+
)?;
81+
6282
Ok(Rc::new(Self {
63-
multistage_members: self.multistage_members.clone(),
83+
multistage_members: multistage_members
84+
.into_iter()
85+
.map(|member| member.into_logical_node())
86+
.collect::<Result<Vec<_>, _>>()?,
6487
schema: self.schema.clone(),
6588
filter: self.filter.clone(),
6689
modifers: self.modifers.clone(),
67-
source: self.source.with_plan_node(self.source.as_plan_node())?,
90+
source: self.source.with_plan_node(source)?,
6891
}))
6992
}
7093

@@ -80,6 +103,20 @@ impl LogicalNode for Query {
80103
}
81104
}
82105

106+
pub struct QueryInput {
107+
pub source: PlanNode,
108+
pub multistage_members: Vec<PlanNode>,
109+
}
110+
111+
impl NodeInputs for QueryInput {
112+
fn iter(&self) -> Box<dyn Iterator<Item = &PlanNode> + '_> {
113+
Box::new(
114+
std::iter::once(&self.source)
115+
.chain(self.multistage_members.iter())
116+
)
117+
}
118+
}
119+
83120
impl PrettyPrint for Query {
84121
fn pretty_print(&self, result: &mut PrettyPrintResult, state: &PrettyPrintState) {
85122
result.println("Query: ", state);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
mod visitor;
2+
pub use visitor::*;

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/visitor/visitor.rs

Whitespace-only changes.

rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/multi_stage_member_type.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::super::context::PushDownBuilderContext;
22
use super::super::{LogicalNodeProcessor, ProcessableNode};
3-
use crate::logical_plan::MultiStageMemberLogicalType;
3+
use crate::logical_plan::{LogicalNode, MultiStageMemberLogicalType};
44
use crate::physical_plan_builder::PhysicalPlanBuilder;
55
use crate::plan::QueryPlan;
66
use cubenativeutils::CubeError;
@@ -24,19 +24,19 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageMemberLogicalType>
2424
) -> Result<Self::PhysycalNode, CubeError> {
2525
match multi_stage_member {
2626
MultiStageMemberLogicalType::LeafMeasure(measure) => {
27-
self.builder.process_node(measure, context)
27+
self.builder.process_node(measure.as_ref(), context)
2828
}
2929
MultiStageMemberLogicalType::MeasureCalculation(calculation) => {
30-
self.builder.process_node(calculation, context)
30+
self.builder.process_node(calculation.as_ref(), context)
3131
}
3232
MultiStageMemberLogicalType::GetDateRange(get_date_range) => {
33-
self.builder.process_node(get_date_range, context)
33+
self.builder.process_node(get_date_range.as_ref(), context)
3434
}
3535
MultiStageMemberLogicalType::TimeSeries(time_series) => {
36-
self.builder.process_node(time_series, context)
36+
self.builder.process_node(time_series.as_ref(), context)
3737
}
3838
MultiStageMemberLogicalType::RollingWindow(rolling_window) => {
39-
self.builder.process_node(rolling_window, context)
39+
self.builder.process_node(rolling_window.as_ref(), context)
4040
}
4141
}
4242
}

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member_query_planner.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ impl MultiStageMemberQueryPlanner {
8686
};
8787
let member = LogicalMultiStageMember {
8888
name: self.description.alias().clone(),
89-
member_type: MultiStageMemberLogicalType::GetDateRange(result),
89+
member_type: MultiStageMemberLogicalType::GetDateRange(Rc::new(result)),
9090
};
9191

9292
Ok(Rc::new(member))
@@ -104,7 +104,7 @@ impl MultiStageMemberQueryPlanner {
104104
};
105105
Ok(Rc::new(LogicalMultiStageMember {
106106
name: self.description.alias().clone(),
107-
member_type: MultiStageMemberLogicalType::TimeSeries(result),
107+
member_type: MultiStageMemberLogicalType::TimeSeries(Rc::new(result)),
108108
}))
109109
}
110110

@@ -176,7 +176,7 @@ impl MultiStageMemberQueryPlanner {
176176
};
177177
Ok(Rc::new(LogicalMultiStageMember {
178178
name: self.description.alias().clone(),
179-
member_type: MultiStageMemberLogicalType::RollingWindow(result),
179+
member_type: MultiStageMemberLogicalType::RollingWindow(Rc::new(result)),
180180
}))
181181
}
182182

@@ -248,7 +248,7 @@ impl MultiStageMemberQueryPlanner {
248248

249249
let result = LogicalMultiStageMember {
250250
name: self.description.alias().clone(),
251-
member_type: MultiStageMemberLogicalType::MeasureCalculation(result),
251+
member_type: MultiStageMemberLogicalType::MeasureCalculation(Rc::new(result)),
252252
};
253253
Ok(Rc::new(result))
254254
}
@@ -292,7 +292,7 @@ impl MultiStageMemberQueryPlanner {
292292
};
293293
let result = LogicalMultiStageMember {
294294
name: self.description.alias().clone(),
295-
member_type: MultiStageMemberLogicalType::LeafMeasure(leaf_measure_plan),
295+
member_type: MultiStageMemberLogicalType::LeafMeasure(Rc::new(leaf_measure_plan)),
296296
};
297297
Ok(Rc::new(result))
298298
}

0 commit comments

Comments
 (0)