Skip to content

Commit baa5d00

Browse files
committed
fix DimensionSymbolFactory try_new for short/long paths
1 parent d1f4662 commit baa5d00

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)