@@ -341,15 +341,27 @@ impl DimensionSymbolFactory {
341341 cube_evaluator : Rc < dyn CubeEvaluator > ,
342342 ) -> Result < Self , CubeError > {
343343 let parts: Vec < & str > = full_name. split ( '.' ) . collect ( ) ;
344- let member_short_path = if parts. len ( ) > 2 {
345- format ! ( "{}.{}" , parts[ parts. len( ) - 2 ] , parts[ parts. len( ) - 1 ] )
344+ let mut iter;
345+ let member_short_path;
346+
347+ // try_new might be invoked with next full_name variants:
348+ // 1. "cube.member"
349+ // 2. "cube.member.granularity" might come from multistage things
350+ // 3. "cube.cube.cube...cube.member" might come from pre-agg references (as it include full join paths)
351+ // And we can not distinguish between "cube.member.granularity" and "cube.cube.member" here,
352+ // so we have to try-catch 2 variants of evaluation.
353+ if let Ok ( iter_by_start) =
354+ cube_evaluator. parse_path ( "dimensions" . to_string ( ) , full_name. clone ( ) )
355+ {
356+ member_short_path = full_name. clone ( ) ;
357+ iter = iter_by_start. into_iter ( ) ;
346358 } else {
347- full_name. clone ( )
348- } ;
359+ member_short_path = format ! ( "{}.{}" , parts[ parts. len( ) - 2 ] , parts[ parts. len( ) - 1 ] ) ;
360+ iter = cube_evaluator
361+ . parse_path ( "dimensions" . to_string ( ) , member_short_path. clone ( ) ) ?
362+ . into_iter ( ) ;
363+ }
349364
350- let mut iter = cube_evaluator
351- . parse_path ( "dimensions" . to_string ( ) , member_short_path. clone ( ) ) ?
352- . into_iter ( ) ;
353365 let cube_name = iter. next ( ) . unwrap ( ) ;
354366 let name = iter. next ( ) . unwrap ( ) ;
355367 let granularity = iter. next ( ) ;
0 commit comments