@@ -5,15 +5,14 @@ use crate::planner::planners::multi_stage::TimeShiftState;
55use crate :: planner:: query_properties:: OrderByItem ;
66use crate :: planner:: query_tools:: QueryTools ;
77use crate :: planner:: sql_evaluator:: sql_nodes:: SqlNodesFactory ;
8- use crate :: planner:: sql_evaluator:: symbols :: CalendarDimensionTimeShift ;
8+ use crate :: planner:: sql_evaluator:: MemberSymbol ;
99use crate :: planner:: sql_evaluator:: ReferencesBuilder ;
10- use crate :: planner:: sql_evaluator:: { DimensionTimeShift , MemberSymbol } ;
1110use crate :: planner:: sql_templates:: PlanSqlTemplates ;
1211use crate :: planner:: BaseMemberHelper ;
1312use crate :: planner:: SqlJoinCondition ;
1413use crate :: planner:: { BaseMember , MemberSymbolRef } ;
1514use cubenativeutils:: CubeError ;
16- use itertools:: { Either , Itertools } ;
15+ use itertools:: Itertools ;
1716use std:: collections:: HashMap ;
1817use std:: collections:: HashSet ;
1918use std:: rc:: Rc ;
@@ -31,40 +30,43 @@ struct PhysicalPlanBuilderContext {
3130}
3231
3332impl 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