Skip to content

Commit 9302eea

Browse files
refactor: generate synthetic link dims after include/exclude logic
Restructured so the compilation order is: 1. View include/exclude logic runs first (CubeSymbols.prepareIncludes) - links property is propagated to view dimensions alongside other properties like format, granularities, mask - Exclude works correctly since synthetic dims don't exist yet 2. Then prepareSyntheticLinkDimensions runs in prepareCube for both cubes AND views, generating synthetic dims from whatever dimensions survived the include/exclude phase Removed the previous approach of auto-including synthetic dims during the include resolution (they didn't exist at that point anyway). Moved prepareSyntheticLinkDimensions before prepareMembers(dimensions) so the synthetic dims get full member processing. Co-authored-by: Pavel Tiunov <pavel.tiunov@gmail.com>
1 parent cf573d6 commit 9302eea

2 files changed

Lines changed: 3 additions & 22 deletions

File tree

packages/cubejs-schema-compiler/src/compiler/CubeEvaluator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ export class CubeEvaluator extends CubeSymbols {
209209
this.prepareJoins(cube, errorReporter);
210210
this.preparePreAggregations(cube, errorReporter);
211211
this.prepareMembers(cube.measures, cube, errorReporter);
212-
this.prepareMembers(cube.dimensions, cube, errorReporter);
213212
this.prepareSyntheticLinkDimensions(cube);
213+
this.prepareMembers(cube.dimensions, cube, errorReporter);
214214
this.prepareMembers(cube.segments, cube, errorReporter);
215215

216216
this.evaluateMultiStageReferences(cube.name, cube.measures);

packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -712,29 +712,9 @@ export class CubeSymbols implements TranspilerSymbolResolver, CompilerInterface
712712
.map((path) => path.split('.')[1])
713713
.filter(memberName => !(it.includes as (string | ViewCubeIncludeMember)[]).find((include) => ((typeof include === 'object' ? include.name : include)) === memberName));
714714

715-
// Auto-include synthetic link dimensions for any included dimension that has links
716-
const syntheticLinkMembers: string[] = [];
717-
const membersObj = this.symbols[cubeRef]?.cubeObj()?.dimensions || {};
718-
for (const include of (it.includes as (string | ViewCubeIncludeMember)[])) {
719-
const memberName = typeof include === 'object' ? include.name : include;
720-
const dimDef = membersObj[memberName];
721-
if (dimDef && dimDef.links && Array.isArray(dimDef.links)) {
722-
for (const link of dimDef.links) {
723-
if (link.name) {
724-
const syntheticName = `${memberName}___link_${link.name}_url`;
725-
if (membersObj[syntheticName]) {
726-
syntheticLinkMembers.push(syntheticName);
727-
}
728-
}
729-
}
730-
}
731-
}
732-
733715
return {
734716
...it,
735-
includes: (it.includes as (string | ViewCubeIncludeMember)[])
736-
.concat(currentCubeAutoIncludeMembers)
737-
.concat(syntheticLinkMembers.filter(m => !(it.includes as (string | ViewCubeIncludeMember)[]).find((inc) => ((typeof inc === 'object' ? inc.name : inc)) === m))),
717+
includes: (it.includes as (string | ViewCubeIncludeMember)[]).concat(currentCubeAutoIncludeMembers),
738718
};
739719
}) : includedCubes;
740720

@@ -1024,6 +1004,7 @@ export class CubeSymbols implements TranspilerSymbolResolver, CompilerInterface
10241004
...(resolvedMember.multiStage && { multiStage: resolvedMember.multiStage }),
10251005
...(resolvedMember.keyReference && this.processKeyReferenceForView(resolvedMember.keyReference, targetCube.name, viewAllMembers, memberRef.member)),
10261006
...(resolvedMember.mask !== undefined ? { mask: resolvedMember.mask } : {}),
1007+
...(resolvedMember.links ? { links: resolvedMember.links } : {}),
10271008
};
10281009
} else if (type === 'segments') {
10291010
memberDefinition = {

0 commit comments

Comments
 (0)