Skip to content

Commit ac24da2

Browse files
committed
implement sortMembersByJoinTree()
1 parent 1554e7a commit ac24da2

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

packages/cubejs-schema-compiler/src/adapter/PreAggregations.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)