Skip to content

Commit 849591f

Browse files
committed
throw error if named timeshift not found
1 parent e033aaf commit 849591f

File tree

1 file changed

+45
-43
lines changed
  • rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder

1 file changed

+45
-43
lines changed

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

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ use crate::planner::planners::multi_stage::TimeShiftState;
55
use crate::planner::query_properties::OrderByItem;
66
use crate::planner::query_tools::QueryTools;
77
use crate::planner::sql_evaluator::sql_nodes::SqlNodesFactory;
8-
use crate::planner::sql_evaluator::symbols::CalendarDimensionTimeShift;
8+
use crate::planner::sql_evaluator::MemberSymbol;
99
use crate::planner::sql_evaluator::ReferencesBuilder;
10-
use crate::planner::sql_evaluator::{DimensionTimeShift, MemberSymbol};
1110
use crate::planner::sql_templates::PlanSqlTemplates;
1211
use crate::planner::BaseMemberHelper;
1312
use crate::planner::SqlJoinCondition;
1413
use crate::planner::{BaseMember, MemberSymbolRef};
1514
use cubenativeutils::CubeError;
16-
use itertools::{Either, Itertools};
15+
use itertools::Itertools;
1716
use std::collections::HashMap;
1817
use std::collections::HashSet;
1918
use std::rc::Rc;
@@ -31,40 +30,43 @@ struct PhysicalPlanBuilderContext {
3130
}
3231

3332
impl PhysicalPlanBuilderContext {
34-
pub fn make_sql_nodes_factory(&self) -> SqlNodesFactory {
33+
pub fn make_sql_nodes_factory(&self) -> Result<SqlNodesFactory, CubeError> {
3534
let mut factory = SqlNodesFactory::new();
3635

37-
let (time_shifts, calendar_time_shifts): (
38-
HashMap<String, DimensionTimeShift>,
39-
HashMap<String, CalendarDimensionTimeShift>,
40-
) = self
41-
.time_shifts
42-
.dimensions_shifts
43-
.iter()
44-
.partition_map(|(key, shift)| {
45-
if let Ok(dimension) = shift.dimension.as_dimension() {
46-
if let Some(dim_shift_name) = &shift.name {
47-
if let Some((dim_key, cts)) =
48-
dimension.calendar_time_shift_for_named_interval(dim_shift_name)
49-
{
50-
return Either::Right((dim_key.clone(), cts.clone()));
51-
} else if let Some(_calendar_pk) = dimension.time_shift_pk_full_name() {
52-
// TODO: Handle case when named shift is not found
53-
}
54-
} else if let Some(dim_shift_interval) = &shift.interval {
55-
if let Some((dim_key, cts)) =
56-
dimension.calendar_time_shift_for_interval(dim_shift_interval)
57-
{
58-
return Either::Right((dim_key.clone(), cts.clone()));
59-
} else if let Some(calendar_pk) = dimension.time_shift_pk_full_name() {
60-
let mut shift = shift.clone();
61-
shift.interval = Some(dim_shift_interval.inverse());
62-
return Either::Left((calendar_pk, shift.clone()));
63-
}
36+
let mut time_shifts = HashMap::new();
37+
let mut calendar_time_shifts = HashMap::new();
38+
39+
for (key, shift) in self.time_shifts.dimensions_shifts.iter() {
40+
if let Ok(dimension) = shift.dimension.as_dimension() {
41+
if let Some(dim_shift_name) = &shift.name {
42+
if let Some((dim_key, cts)) =
43+
dimension.calendar_time_shift_for_named_interval(dim_shift_name)
44+
{
45+
calendar_time_shifts.insert(dim_key.clone(), cts.clone());
46+
continue;
47+
} else if let Some(_calendar_pk) = dimension.time_shift_pk_full_name() {
48+
return Err(CubeError::internal(format!(
49+
"Time shift with name {} not found for dimension {}",
50+
dim_shift_name,
51+
dimension.full_name()
52+
)));
53+
}
54+
} else if let Some(dim_shift_interval) = &shift.interval {
55+
if let Some((dim_key, cts)) =
56+
dimension.calendar_time_shift_for_interval(dim_shift_interval)
57+
{
58+
calendar_time_shifts.insert(dim_key.clone(), cts.clone());
59+
continue;
60+
} else if let Some(calendar_pk) = dimension.time_shift_pk_full_name() {
61+
let mut shift = shift.clone();
62+
shift.interval = Some(dim_shift_interval.inverse());
63+
time_shifts.insert(calendar_pk, shift.clone());
64+
continue;
6465
}
6566
}
66-
Either::Left((key.clone(), shift.clone()))
67-
});
67+
}
68+
time_shifts.insert(key.clone(), shift.clone());
69+
}
6870

6971
let common_time_shifts = TimeShiftState {
7072
dimensions_shifts: time_shifts,
@@ -75,7 +77,7 @@ impl PhysicalPlanBuilderContext {
7577
factory.set_count_approx_as_state(self.render_measure_as_state);
7678
factory.set_ungrouped_measure(self.render_measure_for_ungrouped);
7779
factory.set_original_sql_pre_aggregations(self.original_sql_pre_aggregations.clone());
78-
factory
80+
Ok(factory)
7981
}
8082
}
8183

@@ -117,7 +119,7 @@ impl PhysicalPlanBuilder {
117119
let from = From::new_from_subselect(source.clone(), ORIGINAL_QUERY.to_string());
118120
let mut select_builder = SelectBuilder::new(from);
119121
select_builder.add_count_all(TOTAL_COUNT.to_string());
120-
let context_factory = context.make_sql_nodes_factory();
122+
let context_factory = context.make_sql_nodes_factory()?;
121123
Ok(Rc::new(select_builder.build(context_factory)))
122124
}
123125

@@ -142,7 +144,7 @@ impl PhysicalPlanBuilder {
142144
let mut render_references = HashMap::new();
143145
let mut measure_references = HashMap::new();
144146
let mut dimensions_references = HashMap::new();
145-
let mut context_factory = context.make_sql_nodes_factory();
147+
let mut context_factory = context.make_sql_nodes_factory()?;
146148
let from = match &logical_plan.source {
147149
SimpleQuerySource::LogicalJoin(join) => self.process_logical_join(
148150
&join,
@@ -400,7 +402,7 @@ impl PhysicalPlanBuilder {
400402
select_builder.set_offset(logical_plan.offset);
401403
select_builder.set_ctes(ctes);
402404

403-
let mut context_factory = context.make_sql_nodes_factory();
405+
let mut context_factory = context.make_sql_nodes_factory()?;
404406
context_factory.set_render_references(render_references);
405407

406408
Ok(Rc::new(select_builder.build(context_factory)))
@@ -735,7 +737,7 @@ impl PhysicalPlanBuilder {
735737
let mut join_builder =
736738
JoinBuilder::new_from_subselect(keys_query.clone(), keys_query_alias.clone());
737739

738-
let mut context_factory = context.make_sql_nodes_factory();
740+
let mut context_factory = context.make_sql_nodes_factory()?;
739741
let primary_keys_dimensions = &aggregate_multiplied_subquery
740742
.keys_subquery
741743
.primary_keys_dimensions;
@@ -873,7 +875,7 @@ impl PhysicalPlanBuilder {
873875
&measure_subquery.dimension_subqueries,
874876
&mut render_references,
875877
)?;
876-
let mut context_factory = context.make_sql_nodes_factory();
878+
let mut context_factory = context.make_sql_nodes_factory()?;
877879
let mut select_builder = SelectBuilder::new(from);
878880

879881
context_factory.set_ungrouped_measure(true);
@@ -936,7 +938,7 @@ impl PhysicalPlanBuilder {
936938

937939
select_builder.set_distinct();
938940
select_builder.set_filter(keys_subquery.filter.all_filters());
939-
let mut context_factory = context.make_sql_nodes_factory();
941+
let mut context_factory = context.make_sql_nodes_factory()?;
940942
context_factory.set_render_references(render_references);
941943
let res = Rc::new(select_builder.build(context_factory));
942944
Ok(res)
@@ -1022,7 +1024,7 @@ impl PhysicalPlanBuilder {
10221024
&mut render_references,
10231025
)?;
10241026
let mut select_builder = SelectBuilder::new(from);
1025-
let mut context_factory = context.make_sql_nodes_factory();
1027+
let mut context_factory = context.make_sql_nodes_factory()?;
10261028
let args = vec![get_date_range
10271029
.time_dimension
10281030
.clone()
@@ -1181,7 +1183,7 @@ impl PhysicalPlanBuilder {
11811183
on,
11821184
);
11831185

1184-
let mut context_factory = context.make_sql_nodes_factory();
1186+
let mut context_factory = context.make_sql_nodes_factory()?;
11851187
context_factory.set_rolling_window(true);
11861188
let from = From::new_from_join(join_builder.build());
11871189
let references_builder = ReferencesBuilder::new(from.clone());
@@ -1320,7 +1322,7 @@ impl PhysicalPlanBuilder {
13201322
);
13211323
}
13221324

1323-
let mut context_factory = context.make_sql_nodes_factory();
1325+
let mut context_factory = context.make_sql_nodes_factory()?;
13241326
let partition_by = measure_calculation
13251327
.partition_by
13261328
.iter()

0 commit comments

Comments
 (0)