File tree Expand file tree Collapse file tree 6 files changed +67
-16
lines changed
rust/cubesqlplanner/cubesqlplanner/src Expand file tree Collapse file tree 6 files changed +67
-16
lines changed Original file line number Diff line number Diff line change @@ -14,6 +14,8 @@ pub struct CubeDefinitionStatic {
1414 pub name : String ,
1515 #[ serde( rename = "sqlAlias" ) ]
1616 pub sql_alias : Option < String > ,
17+ #[ serde( rename = "isView" ) ]
18+ pub is_view : Option < bool > ,
1719}
1820
1921#[ nativebridge:: native_bridge( CubeDefinitionStatic ) ]
Original file line number Diff line number Diff line change @@ -171,6 +171,7 @@ impl MultiStageQueryPlanner {
171171 state : Rc < MultiStageAppliedState > ,
172172 descriptions : & mut Vec < Rc < MultiStageQueryDescription > > ,
173173 ) -> Result < Rc < MultiStageQueryDescription > , CubeError > {
174+ let member = member. resolve_reference_chain ( ) ;
174175 let member_name = member. full_name ( ) ;
175176 if let Some ( exists) = descriptions
176177 . iter ( )
@@ -187,7 +188,7 @@ impl MultiStageQueryPlanner {
187188 return Ok ( rolling_window_query) ;
188189 }
189190
190- let childs = member_childs ( & member) ?;
191+ let childs = member_childs ( & member, true ) ?;
191192 let has_multi_stage_members = has_multi_stage_members ( & member, false ) ?;
192193 let description = if childs. is_empty ( ) || !has_multi_stage_members {
193194 if has_multi_stage_members {
Original file line number Diff line number Diff line change 11use crate :: planner:: sql_evaluator:: { MemberSymbol , TraversalVisitor } ;
22use cubenativeutils:: CubeError ;
3+ use itertools:: Itertools ;
34use std:: rc:: Rc ;
45
56pub struct MemberChildsCollector {
@@ -56,8 +57,19 @@ impl TraversalVisitor for MemberChildsCollector {
5657 }
5758}
5859
59- pub fn member_childs ( node : & Rc < MemberSymbol > ) -> Result < Vec < Rc < MemberSymbol > > , CubeError > {
60+ pub fn member_childs (
61+ node : & Rc < MemberSymbol > ,
62+ resolve_references : bool ,
63+ ) -> Result < Vec < Rc < MemberSymbol > > , CubeError > {
6064 let mut visitor = MemberChildsCollector :: new ( ) ;
6165 visitor. apply ( node, & MemberChildsCollectorState :: new ( true ) ) ?;
62- Ok ( visitor. extract_result ( ) )
66+ let res = visitor. extract_result ( ) ;
67+ let res = if resolve_references {
68+ res. iter ( )
69+ . map ( |child| child. clone ( ) . resolve_reference_chain ( ) )
70+ . collect_vec ( )
71+ } else {
72+ res
73+ } ;
74+ Ok ( res)
6375}
Original file line number Diff line number Diff line change @@ -492,18 +492,22 @@ impl SymbolFactory for MeasureSymbolFactory {
492492 && !definition. static_data ( ) . multi_stage . unwrap_or ( false ) ;
493493 let owned_by_cube = definition. static_data ( ) . owned_by_cube . unwrap_or ( true ) ;
494494 let is_multi_stage = definition. static_data ( ) . multi_stage . unwrap_or ( false ) ;
495-
496- let is_reference = !owned_by_cube
497- && is_sql_is_direct_ref
498- && is_calculated
499- && !is_multi_stage
500- && measure_filters. is_empty ( )
501- && measure_drill_filters. is_empty ( )
502- && time_shifts. is_empty ( )
503- && measure_order_by. is_empty ( )
504- && reduce_by. is_none ( )
505- && add_group_by. is_none ( )
506- && group_by. is_none ( ) ;
495+ let cube = cube_evaluator. cube_from_path ( cube_name. clone ( ) ) ?;
496+
497+ let is_view = cube. static_data ( ) . is_view . unwrap_or ( false ) ;
498+
499+ let is_reference = is_view
500+ || ( !owned_by_cube
501+ && is_sql_is_direct_ref
502+ && is_calculated
503+ && !is_multi_stage
504+ && measure_filters. is_empty ( )
505+ && measure_drill_filters. is_empty ( )
506+ && time_shifts. is_empty ( )
507+ && measure_order_by. is_empty ( )
508+ && reduce_by. is_none ( )
509+ && add_group_by. is_none ( )
510+ && group_by. is_none ( ) ) ;
507511
508512 Ok ( MemberSymbol :: new_measure ( MeasureSymbol :: new (
509513 cube_name,
Original file line number Diff line number Diff line change @@ -136,6 +136,22 @@ impl MemberSymbol {
136136 }
137137 }
138138
139+ pub fn reference_member ( & self ) -> Option < Rc < MemberSymbol > > {
140+ let deps = self . get_dependencies ( ) ;
141+ if deps. is_empty ( ) || !self . is_reference ( ) {
142+ return None ;
143+ }
144+ deps. first ( ) . cloned ( )
145+ }
146+
147+ pub fn resolve_reference_chain ( self : Rc < Self > ) -> Rc < MemberSymbol > {
148+ let mut current = self ;
149+ while let Some ( reference) = current. reference_member ( ) {
150+ current = reference;
151+ }
152+ current
153+ }
154+
139155 pub fn owned_by_cube ( & self ) -> bool {
140156 match self {
141157 Self :: Dimension ( d) => d. owned_by_cube ( ) ,
Original file line number Diff line number Diff line change @@ -13,7 +13,7 @@ pub struct PlanSqlTemplates {
1313 base_tools : Rc < dyn BaseTools > ,
1414}
1515pub const UNDERSCORE_UPPER_BOUND : Boundary = Boundary {
16- name : "LowerUpper " ,
16+ name : "UnderscoreUpper " ,
1717 condition : |s, _| {
1818 s. get ( 0 ) == Some ( & "_" )
1919 && s. get ( 1 )
@@ -25,6 +25,21 @@ pub const UNDERSCORE_UPPER_BOUND: Boundary = Boundary {
2525 len : 0 ,
2626} ;
2727
28+ fn grapheme_is_uppercase ( c : & & str ) -> bool {
29+ c. to_uppercase ( ) != c. to_lowercase ( ) && * c == c. to_uppercase ( )
30+ }
31+
32+ pub const UPPER_UPPER_BOUND : Boundary = Boundary {
33+ name : "UpperUpper" ,
34+ condition : |s, _| {
35+ s. get ( 0 ) . map ( grapheme_is_uppercase) == Some ( true )
36+ && s. get ( 1 ) . map ( grapheme_is_uppercase) == Some ( true )
37+ } ,
38+ arg : None ,
39+ start : 1 ,
40+ len : 0 ,
41+ } ;
42+
2843impl PlanSqlTemplates {
2944 pub fn new ( render : Rc < dyn SqlTemplatesRender > , base_tools : Rc < dyn BaseTools > ) -> Self {
3045 Self { render, base_tools }
@@ -34,6 +49,7 @@ impl PlanSqlTemplates {
3449 let res = name
3550 . with_boundaries ( & [
3651 UNDERSCORE_UPPER_BOUND ,
52+ UPPER_UPPER_BOUND ,
3753 Boundary :: LOWER_UPPER ,
3854 Boundary :: DIGIT_UPPER ,
3955 Boundary :: ACRONYM ,
You can’t perform that action at this time.
0 commit comments