Skip to content

Commit d8182d5

Browse files
committed
in work
1 parent a79c7dc commit d8182d5

File tree

6 files changed

+84
-78
lines changed

6 files changed

+84
-78
lines changed

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

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ impl MultiStageQueryPlanner {
405405

406406
fn add_time_series_get_range_query(
407407
&self,
408-
time_dimension: Rc<BaseTimeDimension>,
408+
time_dimension: Rc<MemberSymbol>,
409409
state: Rc<MultiStageAppliedState>,
410410
descriptions: &mut Vec<Rc<MultiStageQueryDescription>>,
411411
) -> Result<Rc<MultiStageQueryDescription>, CubeError> {
@@ -420,7 +420,7 @@ impl MultiStageQueryPlanner {
420420
MultiStageMemberType::Leaf(MultiStageLeafMemberType::TimeSeriesGetRange(
421421
time_dimension.clone(),
422422
)),
423-
time_dimension.member_evaluator(),
423+
time_dimension.clone(),
424424
true,
425425
false,
426426
),
@@ -436,7 +436,7 @@ impl MultiStageQueryPlanner {
436436

437437
fn add_time_series(
438438
&self,
439-
time_dimension: Rc<BaseTimeDimension>,
439+
time_dimension: Rc<MemberSymbol>,
440440
state: Rc<MultiStageAppliedState>,
441441
descriptions: &mut Vec<Rc<MultiStageQueryDescription>>,
442442
) -> Result<Rc<MultiStageQueryDescription>, CubeError> {
@@ -445,7 +445,11 @@ impl MultiStageQueryPlanner {
445445
{
446446
description.clone()
447447
} else {
448-
let get_range_query_description = if time_dimension.get_date_range().is_some() {
448+
let get_range_query_description = if time_dimension
449+
.as_time_dimension()?
450+
.date_range_vec()
451+
.is_some()
452+
{
449453
None
450454
} else {
451455
Some(self.add_time_series_get_range_query(
@@ -462,7 +466,7 @@ impl MultiStageQueryPlanner {
462466
date_range_cte: get_range_query_description.map(|d| d.alias().clone()),
463467
},
464468
))),
465-
time_dimension.member_evaluator(),
469+
time_dimension.clone(),
466470
true,
467471
false,
468472
),
@@ -523,11 +527,12 @@ impl MultiStageQueryPlanner {
523527

524528
fn make_rolling_base_state(
525529
&self,
526-
time_dimension: Rc<BaseTimeDimension>,
530+
time_dimension: Rc<MemberSymbol>,
527531
rolling_window: &RollingWindow,
528532
state: Rc<MultiStageAppliedState>,
529-
) -> Result<(Rc<MultiStageAppliedState>, Rc<BaseTimeDimension>), CubeError> {
530-
let time_dimension_base_name = time_dimension.base_dimension().full_name();
533+
) -> Result<(Rc<MultiStageAppliedState>, Rc<MemberSymbol>), CubeError> {
534+
let time_dimension_symbol = time_dimension.as_time_dimension()?;
535+
let time_dimension_base_name = time_dimension_symbol.base_symbol().full_name();
531536
let mut new_state = state.clone_state();
532537
let trailing_granularity =
533538
GranularityHelper::granularity_from_interval(&rolling_window.trailing);
@@ -537,10 +542,12 @@ impl MultiStageQueryPlanner {
537542
GranularityHelper::min_granularity(&trailing_granularity, &leading_granularity)?;
538543
let result_granularity = GranularityHelper::min_granularity(
539544
&window_granularity,
540-
&time_dimension.resolved_granularity()?,
545+
&time_dimension_symbol.resolved_granularity()?,
541546
)?;
542547

543-
let new_time_dimension = time_dimension.change_granularity(result_granularity.clone())?;
548+
let new_time_dimension_symbol = time_dimension_symbol
549+
.change_granularity(self.query_tools.clone(), result_granularity.clone())?;
550+
let new_time_dimension = MemberSymbol::new_time_dimension(new_time_dimension_symbol);
544551
//We keep only one time_dimension in the leaf query because, even if time_dimension values have different granularity, in the leaf query we need to group by the lowest granularity.
545552
new_state.set_time_dimensions(vec![new_time_dimension.clone()]);
546553

@@ -549,7 +556,7 @@ impl MultiStageQueryPlanner {
549556
.clone()
550557
.into_iter()
551558
.filter(|d| {
552-
d.member_evaluator()
559+
d.clone()
553560
.resolve_reference_chain()
554561
.as_time_dimension()
555562
.is_err()

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multiplied_measures_query_planner.rs

Lines changed: 24 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::planner::sql_evaluator::collectors::{
66
collect_cube_names, collect_join_hints, collect_join_hints_for_measures,
77
collect_sub_query_dimensions_from_members, collect_sub_query_dimensions_from_symbols,
88
};
9+
use crate::planner::sql_evaluator::MemberSymbol;
910
use crate::planner::{
1011
BaseMeasure, BaseMember, BaseMemberHelper, FullKeyAggregateMeasures, QueryProperties,
1112
};
@@ -101,7 +102,7 @@ impl MultipliedMeasuresQueryPlanner {
101102
.iter()
102103
.map(|m| m.measure()),
103104
)
104-
.map(|m| m.member_evaluator().clone())
105+
.map(|m| m.clone())
105106
.collect_vec();
106107
let schema = LogicalSchema::default()
107108
.set_time_dimensions(self.query_properties.time_dimension_symbols())
@@ -132,15 +133,11 @@ impl MultipliedMeasuresQueryPlanner {
132133
fn aggregate_subquery_plan(
133134
&self,
134135
key_cube_name: &String,
135-
measures: &Vec<Rc<BaseMeasure>>,
136+
measures: &Vec<Rc<MemberSymbol>>,
136137
key_join: Rc<dyn JoinDefinition>,
137138
) -> Result<Rc<AggregateMultipliedSubquery>, CubeError> {
138-
let measures_symbols = measures
139-
.iter()
140-
.map(|m| m.member_evaluator().clone())
141-
.collect();
142139
let subquery_dimensions = collect_sub_query_dimensions_from_symbols(
143-
&measures_symbols,
140+
&measures,
144141
&self.join_planner,
145142
&key_join,
146143
self.query_tools.clone(),
@@ -154,19 +151,14 @@ impl MultipliedMeasuresQueryPlanner {
154151
let subquery_dimension_queries =
155152
dimension_subquery_planner.plan_queries(&subquery_dimensions)?;
156153

157-
let primary_keys_dimensions = self
158-
.common_utils
159-
.primary_keys_dimensions(key_cube_name)?
160-
.into_iter()
161-
.map(|d| d.as_base_member())
162-
.collect_vec();
154+
let primary_keys_dimensions = self.common_utils.primary_keys_dimensions(key_cube_name)?;
163155
let keys_subquery =
164156
self.key_query(&primary_keys_dimensions, key_join.clone(), key_cube_name)?;
165157

166158
let schema = LogicalSchema::default()
167159
.set_dimensions(self.query_properties.dimension_symbols())
168160
.set_time_dimensions(self.query_properties.time_dimension_symbols())
169-
.set_measures(measures_symbols)
161+
.set_measures(measures.clone())
170162
.set_multiplied_measures(
171163
self.full_key_aggregate_measures
172164
.rendered_as_multiplied_measures
@@ -200,22 +192,22 @@ impl MultipliedMeasuresQueryPlanner {
200192

201193
fn check_should_build_join_for_measure_select(
202194
&self,
203-
measures: &Vec<Rc<BaseMeasure>>,
195+
measures: &Vec<Rc<MemberSymbol>>,
204196
key_cube_name: &String,
205197
) -> Result<bool, CubeError> {
206198
for measure in measures.iter() {
207199
let member_expression_over_dimensions_cubes =
208-
if let Ok(member_expression) = measure.member_evaluator().as_member_expression() {
200+
if let Ok(member_expression) = measure.as_member_expression() {
209201
member_expression.cube_names_if_dimension_only_expression()?
210202
} else {
211203
None
212204
};
213205
let cubes = if let Some(cubes) = member_expression_over_dimensions_cubes {
214206
cubes
215207
} else {
216-
collect_cube_names(measure.member_evaluator())?
208+
collect_cube_names(&measure)?
217209
};
218-
let join_hints = collect_join_hints(measure.member_evaluator())?;
210+
let join_hints = collect_join_hints(&measure)?;
219211
if cubes.iter().any(|cube| cube != key_cube_name) {
220212
let measures_join = self.query_tools.join_graph().build_join(join_hints)?;
221213
if *measures_join
@@ -235,11 +227,11 @@ impl MultipliedMeasuresQueryPlanner {
235227
fn aggregate_subquery_measure(
236228
&self,
237229
key_join: Rc<dyn JoinDefinition>,
238-
measures: &Vec<Rc<BaseMeasure>>,
239-
primary_keys_dimensions: &Vec<Rc<dyn BaseMember>>,
230+
measures: &Vec<Rc<MemberSymbol>>,
231+
primary_keys_dimensions: &Vec<Rc<MemberSymbol>>,
240232
) -> Result<Rc<MeasureSubquery>, CubeError> {
241233
let subquery_dimensions = collect_sub_query_dimensions_from_members(
242-
&BaseMemberHelper::iter_as_base_member(measures).collect_vec(),
234+
&measures,
243235
&self.join_planner,
244236
&key_join,
245237
self.query_tools.clone(),
@@ -251,24 +243,14 @@ impl MultipliedMeasuresQueryPlanner {
251243
)?;
252244
let subquery_dimension_queries =
253245
dimension_subquery_planner.plan_queries(&subquery_dimensions)?;
254-
let join_hints = collect_join_hints_for_measures(measures)?;
246+
let join_hints = collect_join_hints_for_measures(&measures)?;
255247
let source = self
256248
.join_planner
257249
.make_join_logical_plan_with_join_hints(join_hints, subquery_dimension_queries)?;
258250

259251
let schema = LogicalSchema::default()
260-
.set_dimensions(
261-
primary_keys_dimensions
262-
.iter()
263-
.map(|dim| dim.member_evaluator().clone())
264-
.collect(),
265-
)
266-
.set_measures(
267-
measures
268-
.iter()
269-
.map(|meas| meas.member_evaluator().clone())
270-
.collect(),
271-
)
252+
.set_dimensions(primary_keys_dimensions.clone())
253+
.set_measures(measures.clone())
272254
.into_rc();
273255

274256
let result = MeasureSubquery { schema, source };
@@ -277,16 +259,12 @@ impl MultipliedMeasuresQueryPlanner {
277259

278260
fn regular_measures_subquery(
279261
&self,
280-
measures: &Vec<Rc<BaseMeasure>>,
262+
measures: &Vec<Rc<MemberSymbol>>,
281263
join: Rc<dyn JoinDefinition>,
282264
) -> Result<Rc<Query>, CubeError> {
283-
let measures_symbols = measures
284-
.iter()
285-
.map(|m| m.member_evaluator().clone())
286-
.collect();
287-
let all_symbols =
288-
self.query_properties
289-
.get_member_symbols(true, true, false, true, &measures_symbols);
265+
let all_symbols = self
266+
.query_properties
267+
.get_member_symbols(true, true, false, true, &measures);
290268

291269
let subquery_dimensions = collect_sub_query_dimensions_from_symbols(
292270
&all_symbols,
@@ -310,7 +288,7 @@ impl MultipliedMeasuresQueryPlanner {
310288
let schema = LogicalSchema::default()
311289
.set_dimensions(self.query_properties.dimension_symbols())
312290
.set_time_dimensions(self.query_properties.time_dimension_symbols())
313-
.set_measures(measures_symbols)
291+
.set_measures(measures.clone())
314292
.set_multiplied_measures(
315293
self.full_key_aggregate_measures
316294
.rendered_as_multiplied_measures
@@ -342,18 +320,13 @@ impl MultipliedMeasuresQueryPlanner {
342320

343321
fn key_query(
344322
&self,
345-
dimensions: &Vec<Rc<dyn BaseMember>>,
323+
dimensions: &Vec<Rc<MemberSymbol>>,
346324
key_join: Rc<dyn JoinDefinition>,
347325
key_cube_name: &String,
348326
) -> Result<Rc<KeysSubQuery>, CubeError> {
349-
let dimensions_symbols = dimensions
350-
.iter()
351-
.map(|d| d.member_evaluator().clone())
352-
.collect();
353-
354327
let all_symbols =
355328
self.query_properties
356-
.get_member_symbols(true, true, false, true, &dimensions_symbols);
329+
.get_member_symbols(true, true, false, true, &dimensions);
357330

358331
let subquery_dimensions = collect_sub_query_dimensions_from_symbols(
359332
&all_symbols,
@@ -388,7 +361,7 @@ impl MultipliedMeasuresQueryPlanner {
388361

389362
let keys_query = KeysSubQuery {
390363
schema,
391-
primary_keys_dimensions: dimensions_symbols,
364+
primary_keys_dimensions: dimensions.clone(),
392365
filter: logical_filter,
393366
source,
394367
//dimension_subqueries: subquery_dimension_queries,

rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ impl QueryProperties {
168168
{
169169
time_dimensions
170170
.iter()
171-
.map(|d| {
171+
.map(|d| -> Result<Rc<MemberSymbol>, CubeError> {
172172
let base_symbol =
173173
evaluator_compiler.add_dimension_evaluator(d.dimension.clone())?;
174174
let granularity_obj = GranularityHelper::make_granularity_obj(
@@ -494,8 +494,8 @@ impl QueryProperties {
494494

495495
pub fn compute_join_multi_fact_groups_with_measures(
496496
&self,
497-
measures: &Vec<Rc<BaseMeasure>>,
498-
) -> Result<Vec<(Rc<dyn JoinDefinition>, Vec<Rc<BaseMeasure>>)>, CubeError> {
497+
measures: &Vec<Rc<MemberSymbol>>,
498+
) -> Result<Vec<(Rc<dyn JoinDefinition>, Vec<Rc<MemberSymbol>>)>, CubeError> {
499499
Self::compute_join_multi_fact_groups(
500500
self.query_join_hints.clone(),
501501
self.query_tools.clone(),
@@ -825,7 +825,12 @@ impl QueryProperties {
825825
.rendered_as_multiplied_measures
826826
.insert(item.measure.full_name());
827827
}
828-
if item.multiplied && !item.measure.can_be_used_as_additive_in_multplied() {
828+
if item.multiplied
829+
&& !item
830+
.measure
831+
.as_measure()?
832+
.can_used_as_addictive_in_multplied()
833+
{
829834
result
830835
.multiplied_measures
831836
.push(MultipliedMeasure::new(item.measure.clone(), item.cube_name));

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/collectors/join_hints_collector.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,11 @@ pub fn collect_join_hints(node: &Rc<MemberSymbol>) -> Result<Vec<JoinHintItem>,
8484
}
8585

8686
pub fn collect_join_hints_for_measures(
87-
measures: &Vec<Rc<BaseMeasure>>,
87+
measures: &Vec<Rc<MemberSymbol>>,
8888
) -> Result<Vec<JoinHintItem>, CubeError> {
8989
let mut visitor = JoinHintsCollector::new();
9090
for meas in measures.iter() {
91-
visitor.apply(&meas.member_evaluator(), &())?;
91+
visitor.apply(&meas, &())?;
9292
}
9393
let res = visitor.extract_result();
9494
Ok(res)

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/collectors/sub_query_dimensions.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,20 @@ impl TraversalVisitor for SubQueryDimensionsCollector {
6363
}
6464

6565
pub fn collect_sub_query_dimensions_from_members(
66-
members: &Vec<Rc<dyn BaseMember>>,
66+
members: &Vec<Rc<MemberSymbol>>,
6767
join_planner: &JoinPlanner,
6868
join: &Rc<dyn JoinDefinition>,
6969
query_tools: Rc<QueryTools>,
70-
) -> Result<Vec<Rc<BaseDimension>>, CubeError> {
71-
let symbols = members.iter().map(|m| m.member_evaluator()).collect_vec();
72-
collect_sub_query_dimensions_from_symbols(&symbols, join_planner, join, query_tools)
70+
) -> Result<Vec<Rc<MemberSymbol>>, CubeError> {
71+
collect_sub_query_dimensions_from_symbols(&members, join_planner, join, query_tools)
7372
}
7473

7574
pub fn collect_sub_query_dimensions_from_symbols(
7675
members: &Vec<Rc<MemberSymbol>>,
7776
join_planner: &JoinPlanner,
7877
join: &Rc<dyn JoinDefinition>,
7978
query_tools: Rc<QueryTools>,
80-
) -> Result<Vec<Rc<BaseDimension>>, CubeError> {
79+
) -> Result<Vec<Rc<MemberSymbol>>, CubeError> {
8180
let mut visitor = SubQueryDimensionsCollector::new();
8281
for member in members.iter() {
8382
visitor.apply(&member, &())?;
@@ -88,11 +87,7 @@ pub fn collect_sub_query_dimensions_from_symbols(
8887
visitor.apply(&dep, &())?;
8988
}
9089
}
91-
visitor
92-
.extract_result()
93-
.into_iter()
94-
.map(|s| BaseDimension::try_new_required(s, query_tools.clone()))
95-
.collect::<Result<Vec<_>, CubeError>>()
90+
Ok(visitor.extract_result())
9691
}
9792

9893
pub fn collect_sub_query_dimensions(

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/symbols/time_dimension_symbol.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,32 @@ impl TimeDimensionSymbol {
6868
Ok(res)
6969
}
7070

71+
pub fn change_granularity(
72+
&self,
73+
query_tools: Rc<QueryTools>,
74+
new_granularity: Option<String>,
75+
) -> Result<Rc<Self>, CubeError> {
76+
let evaluator_compiler_cell = query_tools.evaluator_compiler().clone();
77+
let mut evaluator_compiler = evaluator_compiler_cell.borrow_mut();
78+
79+
let new_granularity_obj = GranularityHelper::make_granularity_obj(
80+
query_tools.cube_evaluator().clone(),
81+
&mut evaluator_compiler,
82+
query_tools.timezone(),
83+
&&self.base_symbol.cube_name(),
84+
&self.base_symbol.name(),
85+
new_granularity.clone(),
86+
)?;
87+
let date_range_tuple = self.date_range.clone();
88+
let result = TimeDimensionSymbol::new(
89+
self.base_symbol.clone(),
90+
new_granularity.clone(),
91+
new_granularity_obj.clone(),
92+
date_range_tuple,
93+
);
94+
Ok(result)
95+
}
96+
7197
pub fn full_name(&self) -> String {
7298
self.full_name.clone()
7399
}

0 commit comments

Comments
 (0)