Skip to content

Commit f193dec

Browse files
committed
render references refactor
1 parent e79bedd commit f193dec

File tree

12 files changed

+129
-137
lines changed

12 files changed

+129
-137
lines changed

rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/builder.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,17 @@ impl PhysicalPlanBuilder {
148148
&self,
149149
dimension_subqueries: &Vec<Rc<DimensionSubQuery>>,
150150
references_builder: &ReferencesBuilder,
151-
render_references: &mut HashMap<String, QualifiedColumnName>,
151+
context_factory: &mut SqlNodesFactory,
152152
) -> Result<(), CubeError> {
153153
for dimension_subquery in dimension_subqueries.iter() {
154154
if let Some(dim_ref) = references_builder.find_reference_for_member(
155155
&dimension_subquery.measure_for_subquery_dimension,
156156
&None,
157157
) {
158-
render_references
159-
.insert(dimension_subquery.subquery_dimension.full_name(), dim_ref);
158+
context_factory.add_render_reference(
159+
dimension_subquery.subquery_dimension.full_name(),
160+
dim_ref,
161+
);
160162
} else {
161163
return Err(CubeError::internal(format!(
162164
"Can't find source for subquery dimension {}",

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ impl<'a> LogicalNodeProcessor<'a, AggregateMultipliedSubquery>
2727
aggregate_multiplied_subquery: &AggregateMultipliedSubquery,
2828
context: &PushDownBuilderContext,
2929
) -> Result<Self::PhysycalNode, CubeError> {
30-
let mut render_references = HashMap::new();
3130
let query_tools = self.builder.query_tools();
3231
let keys_query = self.builder.process_node(
3332
aggregate_multiplied_subquery.keys_subquery.as_ref(),
@@ -43,7 +42,10 @@ impl<'a> LogicalNodeProcessor<'a, AggregateMultipliedSubquery>
4342
let primary_keys_dimensions = &aggregate_multiplied_subquery
4443
.keys_subquery
4544
.primary_keys_dimensions();
46-
let pk_cube = aggregate_multiplied_subquery.keys_subquery.pk_cube().clone();
45+
let pk_cube = aggregate_multiplied_subquery
46+
.keys_subquery
47+
.pk_cube()
48+
.clone();
4749
let pk_cube_alias = pk_cube
4850
.cube()
4951
.default_alias_with_prefix(&Some(format!("{}_key", pk_cube.cube().default_alias())));
@@ -97,9 +99,8 @@ impl<'a> LogicalNodeProcessor<'a, AggregateMultipliedSubquery>
9799
Ok(vec![(keys_query_ref, measure_subquery_ref)])
98100
})
99101
.collect::<Result<Vec<_>, _>>()?;
100-
let mut ungrouped_measure_references = HashMap::new();
101102
for meas in aggregate_multiplied_subquery.schema.measures.iter() {
102-
ungrouped_measure_references.insert(
103+
context_factory.add_ungrouped_measure_reference(
103104
meas.full_name(),
104105
QualifiedColumnName::new(
105106
Some(pk_cube_alias.clone()),
@@ -108,8 +109,6 @@ impl<'a> LogicalNodeProcessor<'a, AggregateMultipliedSubquery>
108109
);
109110
}
110111

111-
context_factory.set_ungrouped_measure_references(ungrouped_measure_references);
112-
113112
join_builder.left_join_subselect(
114113
subquery,
115114
pk_cube_alias.clone(),
@@ -126,14 +125,14 @@ impl<'a> LogicalNodeProcessor<'a, AggregateMultipliedSubquery>
126125
self.builder.resolve_subquery_dimensions_references(
127126
&aggregate_multiplied_subquery.dimension_subqueries,
128127
&references_builder,
129-
&mut render_references,
128+
&mut context_factory,
130129
)?;
131130

132131
for member in aggregate_multiplied_subquery.schema.all_dimensions() {
133132
references_builder.resolve_references_for_member(
134133
member.clone(),
135134
&None,
136-
&mut render_references,
135+
context_factory.render_references_mut(),
137136
)?;
138137
let alias = references_builder.resolve_alias_for_member(&member, &None);
139138
group_by.push(Expr::Member(MemberExpression::new(member.clone())));
@@ -151,7 +150,7 @@ impl<'a> LogicalNodeProcessor<'a, AggregateMultipliedSubquery>
151150
references_builder.resolve_references_for_member(
152151
measure.clone(),
153152
&None,
154-
&mut render_references,
153+
context_factory.render_references_mut(),
155154
)?;
156155
}
157156
select_builder.add_projection_member(&measure, None);
@@ -160,7 +159,6 @@ impl<'a> LogicalNodeProcessor<'a, AggregateMultipliedSubquery>
160159
}
161160
}
162161
select_builder.set_group_by(group_by);
163-
context_factory.set_render_references(render_references);
164162
context_factory.set_rendered_as_multiplied_measures(
165163
aggregate_multiplied_subquery
166164
.schema

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ impl<'a> LogicalNodeProcessor<'a, KeysSubQuery> for KeysSubQueryProcessor<'a> {
2323
context: &PushDownBuilderContext,
2424
) -> Result<Self::PhysycalNode, CubeError> {
2525
let query_tools = self.builder.query_tools();
26-
let mut render_references = HashMap::new();
2726
let alias_prefix = Some(format!(
2827
"{}_key",
2928
query_tools.alias_for_cube(&keys_subquery.pk_cube().cube().name())?
@@ -42,7 +41,7 @@ impl<'a> LogicalNodeProcessor<'a, KeysSubQuery> for KeysSubQueryProcessor<'a> {
4241
self.builder.resolve_subquery_dimensions_references(
4342
&keys_subquery.source().dimension_subqueries(),
4443
&references_builder,
45-
&mut render_references,
44+
&mut context_factory,
4645
)?;
4746
for member in keys_subquery
4847
.schema()
@@ -58,14 +57,13 @@ impl<'a> LogicalNodeProcessor<'a, KeysSubQuery> for KeysSubQueryProcessor<'a> {
5857
references_builder.resolve_references_for_member(
5958
member.clone(),
6059
&None,
61-
&mut render_references,
60+
context_factory.render_references_mut(),
6261
)?;
6362
select_builder.add_projection_member(member, Some(alias));
6463
}
6564

6665
select_builder.set_distinct();
6766
select_builder.set_filter(keys_subquery.filter().all_filters());
68-
context_factory.set_render_references(render_references);
6967
let res = Rc::new(select_builder.build(query_tools.clone(), context_factory));
7068
Ok(res)
7169
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ impl<'a> LogicalNodeProcessor<'a, MeasureSubquery> for MeasureSubqueryProcessor<
2323
context: &PushDownBuilderContext,
2424
) -> Result<Self::PhysycalNode, CubeError> {
2525
let query_tools = self.builder.query_tools();
26-
let mut render_references = HashMap::new();
2726
let from = self
2827
.builder
2928
.process_node(measure_subquery.source.as_ref(), context)?;
@@ -43,7 +42,7 @@ impl<'a> LogicalNodeProcessor<'a, MeasureSubquery> for MeasureSubqueryProcessor<
4342
self.builder.resolve_subquery_dimensions_references(
4443
&measure_subquery.source.dimension_subqueries(),
4544
&references_builder,
46-
&mut render_references,
45+
&mut context_factory,
4746
)?;
4847
for dim in measure_subquery.schema.dimensions.iter() {
4948
select_builder.add_projection_member(dim, None);
@@ -53,7 +52,6 @@ impl<'a> LogicalNodeProcessor<'a, MeasureSubquery> for MeasureSubqueryProcessor<
5352
}
5453

5554
context_factory.set_ungrouped_measure(true);
56-
context_factory.set_render_references(render_references);
5755

5856
let select = Rc::new(select_builder.build(query_tools.clone(), context_factory));
5957
Ok(select)

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageGetDateRange> for MultiStageGetDateR
2424
context: &PushDownBuilderContext,
2525
) -> Result<Self::PhysycalNode, CubeError> {
2626
let query_tools = self.builder.query_tools();
27-
let mut render_references = HashMap::new();
2827
let from = self
2928
.builder
3029
.process_node(get_date_range.source.as_ref(), context)?;
@@ -47,9 +46,8 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageGetDateRange> for MultiStageGetDateR
4746
self.builder.resolve_subquery_dimensions_references(
4847
&get_date_range.source.dimension_subqueries(),
4948
&references_builder,
50-
&mut render_references,
49+
&mut context_factory,
5150
)?;
52-
context_factory.set_render_references(render_references);
5351
let select = Rc::new(select_builder.build(query_tools.clone(), context_factory));
5452
Ok(QueryPlan::Select(select))
5553
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageMeasureCalculation>
2727
context: &PushDownBuilderContext,
2828
) -> Result<Self::PhysycalNode, CubeError> {
2929
let (query_tools, templates) = self.builder.qtools_and_templates();
30+
let mut context_factory = context.make_sql_nodes_factory()?;
3031
let from = self
3132
.builder
3233
.process_node(measure_calculation.source().as_ref(), context)?;
3334
let references_builder = ReferencesBuilder::new(from.clone());
34-
let mut render_references = HashMap::new();
3535

3636
let mut select_builder = SelectBuilder::new(from.clone());
3737
let all_dimensions = measure_calculation
@@ -44,7 +44,7 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageMeasureCalculation>
4444
references_builder.resolve_references_for_member(
4545
member.clone(),
4646
&None,
47-
&mut render_references,
47+
context_factory.render_references_mut(),
4848
)?;
4949
select_builder.add_projection_member(&member, None);
5050
}
@@ -53,7 +53,7 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageMeasureCalculation>
5353
references_builder.resolve_references_for_member(
5454
measure.clone(),
5555
&None,
56-
&mut render_references,
56+
context_factory.render_references_mut(),
5757
)?;
5858
let alias = references_builder.resolve_alias_for_member(&measure, &None);
5959
select_builder.add_projection_member(measure, alias);
@@ -73,7 +73,6 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageMeasureCalculation>
7373
);
7474
}
7575

76-
let mut context_factory = context.make_sql_nodes_factory()?;
7776
let partition_by = measure_calculation
7877
.partition_by()
7978
.iter()
@@ -106,7 +105,6 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageMeasureCalculation>
106105
}
107106
MultiStageCalculationWindowFunction::None => {}
108107
}
109-
context_factory.set_render_references(render_references);
110108
let select = Rc::new(select_builder.build(query_tools.clone(), context_factory));
111109
Ok(QueryPlan::Select(select))
112110
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,16 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageRollingWindow>
9393
context_factory.set_rolling_window(true);
9494
let from = From::new_from_join(join_builder.build());
9595
let references_builder = ReferencesBuilder::new(from.clone());
96-
let mut render_references = HashMap::new();
9796
let mut select_builder = SelectBuilder::new(from.clone());
9897

9998
//We insert render reference for main time dimension (with some granularity as in time series to avoid unnecessary date_tranc)
100-
render_references.insert(
99+
context_factory.add_render_reference(
101100
time_dimension.full_name(),
102101
QualifiedColumnName::new(Some(root_alias.clone()), format!("date_from")),
103102
);
104103

105104
//We also insert render reference for the base dimension of the time dimension (i.e. without `_granularity` prefix to let other time dimensions make date_tranc)
106-
render_references.insert(
105+
context_factory.add_render_reference(
107106
time_dimension
108107
.as_time_dimension()?
109108
.base_symbol()
@@ -125,7 +124,7 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageRollingWindow>
125124
references_builder.resolve_references_for_member(
126125
dim.clone(),
127126
&Some(measure_input_alias.clone()),
128-
&mut render_references,
127+
context_factory.render_references_mut(),
129128
)?;
130129
}
131130
let alias = references_builder
@@ -160,7 +159,6 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageRollingWindow>
160159
context_factory.set_ungrouped(true);
161160
}
162161

163-
context_factory.set_render_references(render_references);
164162
let select = Rc::new(select_builder.build(query_tools.clone(), context_factory));
165163
Ok(QueryPlan::Select(select))
166164
}

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
3838
) -> Result<Self::PhysycalNode, CubeError> {
3939
let query_tools = self.builder.query_tools();
4040
let mut context_factory = context.make_sql_nodes_factory()?;
41-
let mut render_references = HashMap::new();
4241
let mut context = context.clone();
4342
let mut ctes = vec![];
4443

@@ -86,7 +85,7 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
8685
self.builder.resolve_subquery_dimensions_references(
8786
&join.dimension_subqueries(),
8887
&references_builder,
89-
&mut render_references,
88+
&mut context_factory,
9089
)?;
9190
}
9291
QuerySource::PreAggregation(pre_aggregation) => {
@@ -95,11 +94,12 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
9594
}
9695
context_factory.set_use_local_tz_in_date_range(true);
9796

98-
let dimensions_references = pre_aggregation.all_dimensions_refererences();
99-
let measure_references = pre_aggregation.all_measures_refererences();
100-
101-
context_factory.set_pre_aggregation_measures_references(measure_references);
102-
context_factory.set_pre_aggregation_dimensions_references(dimensions_references);
97+
for (name, column) in pre_aggregation.all_dimensions_refererences().into_iter() {
98+
context_factory.add_pre_aggregation_dimension_reference(name, column);
99+
}
100+
for (name, column) in pre_aggregation.all_measures_refererences().into_iter() {
101+
context_factory.add_pre_aggregation_measure_reference(name, column);
102+
}
103103
}
104104
QuerySource::FullKeyAggregate(_) => {}
105105
}
@@ -116,7 +116,7 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
116116
references_builder.resolve_references_for_member(
117117
member.clone(),
118118
&None,
119-
&mut render_references,
119+
context_factory.render_references_mut(),
120120
)?;
121121
self.builder
122122
.process_calc_group(member, &mut context_factory, &filter)?;
@@ -135,7 +135,7 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
135135
references_builder.resolve_references_for_member(
136136
measure.clone(),
137137
&None,
138-
&mut render_references,
138+
context_factory.render_references_mut(),
139139
)?;
140140
select_builder.add_projection_member(&measure, None);
141141
} else {
@@ -144,7 +144,8 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
144144
}
145145

146146
if self.is_over_full_aggregated_source(logical_plan) {
147-
references_builder.resolve_references_for_filter(&having, &mut render_references)?;
147+
references_builder
148+
.resolve_references_for_filter(&having, context_factory.render_references_mut())?;
148149
select_builder.set_filter(having);
149150
} else {
150151
if !logical_plan.modifers().ungrouped {
@@ -166,8 +167,9 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
166167

167168
context_factory
168169
.set_rendered_as_multiplied_measures(logical_plan.schema().multiplied_measures.clone());
169-
if !is_pre_aggregation {
170-
context_factory.set_render_references(render_references);
170+
171+
if is_pre_aggregation {
172+
context_factory.clear_render_references();
171173
}
172174
if logical_plan.modifers().ungrouped {
173175
context_factory.set_ungrouped(true);

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/references_builder.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use crate::plan::{
22
CalcGroupsJoin, Filter, FilterItem, From, FromSource, Join, QualifiedColumnName,
33
SingleAliasedSource, SingleSource,
44
};
5+
use crate::planner::sql_evaluator::sql_nodes::RenderReferences;
56
use cubenativeutils::CubeError;
6-
use std::collections::HashMap;
77
use std::rc::Rc;
88

99
use super::MemberSymbol;
@@ -49,7 +49,7 @@ impl ReferencesBuilder {
4949
&self,
5050
member: Rc<MemberSymbol>,
5151
strict_source: &Option<String>,
52-
references: &mut HashMap<String, QualifiedColumnName>,
52+
references: &mut RenderReferences,
5353
) -> Result<(), CubeError> {
5454
let member_name = member.full_name();
5555
if references.contains_key(&member_name) {
@@ -108,7 +108,7 @@ impl ReferencesBuilder {
108108
pub fn resolve_references_for_filter(
109109
&self,
110110
filter: &Option<Filter>,
111-
references: &mut HashMap<String, QualifiedColumnName>,
111+
references: &mut RenderReferences,
112112
) -> Result<(), CubeError> {
113113
if let Some(filter) = filter {
114114
for itm in filter.items.iter() {
@@ -138,7 +138,7 @@ impl ReferencesBuilder {
138138
fn resolve_references_for_filter_item(
139139
&self,
140140
item: &FilterItem,
141-
references: &mut HashMap<String, QualifiedColumnName>,
141+
references: &mut RenderReferences,
142142
) -> Result<(), CubeError> {
143143
match item {
144144
FilterItem::Item(item) => self.resolve_references_for_member(

0 commit comments

Comments
 (0)