@@ -669,7 +669,10 @@ export class PreAggregations {
669669 references . dimensions . length === filterDimensionsSingleValueEqual . size &&
670670 R . all ( d => filterDimensionsSingleValueEqual . has ( d ) , backAliasDimensions ) ||
671671 transformedQuery . allFiltersWithinSelectedDimensions &&
672- R . equals ( backAliasDimensions , transformedQuery . sortedDimensions )
672+ // references.dimensions might be reordered because of joinTree join order,
673+ // so we need to compare without order here.
674+ backAliasDimensions . length === transformedQuery . sortedDimensions . length &&
675+ R . equals ( new Set ( backAliasDimensions ) , new Set ( transformedQuery . sortedDimensions ) )
673676 ) && (
674677 R . all ( m => backAliasMeasures . includes ( m ) , transformedQuery . measures ) ||
675678 // TODO do we need backAlias here?
@@ -1398,6 +1401,32 @@ export class PreAggregations {
13981401 for ( const j of references . joinTree . joins ) {
13991402 joinsMap [ j . to ] = j . from ;
14001403 }
1404+
1405+ // As full-path references may be passed to query options,
1406+ // it is important to sort them based on join tree order,
1407+ // because full-path names work as explicit join hints,
1408+ // and JoinGraph will take them as granted in the order of
1409+ // occurrence. But that might be incorrect for transitive-join cases.
1410+ const sortMembersByJoinTree = ( members : string [ ] ) => {
1411+ const joinOrder : Record < string , number > = { } ;
1412+ joinOrder [ references . joinTree ! . root ] = 0 ;
1413+ for ( const join of references . joinTree ! . joins ) {
1414+ const index = references . joinTree ! . joins . indexOf ( join ) ;
1415+ joinOrder [ join . to ] = index + 1 ;
1416+ }
1417+
1418+ members . sort ( ( a , b ) => {
1419+ const cubeA = a . split ( '.' ) [ 0 ] ;
1420+ const cubeB = b . split ( '.' ) [ 0 ] ;
1421+ const orderA = joinOrder [ cubeA ] ?? Infinity ;
1422+ const orderB = joinOrder [ cubeB ] ?? Infinity ;
1423+
1424+ return orderA - orderB ;
1425+ } ) ;
1426+ } ;
1427+
1428+ sortMembersByJoinTree ( references . dimensions ) ;
1429+ sortMembersByJoinTree ( references . measures ) ;
14011430 }
14021431
14031432 references . dimensions = this . buildMembersFullName ( references . dimensions , joinsMap ) ;
0 commit comments