Skip to content

Commit d8908ff

Browse files
committed
fix drill members inheritance (cases of non-owned members)
1 parent 3e4de52 commit d8908ff

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

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

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,15 @@ type MemberSets = {
192192
allMembers: Set<string>;
193193
};
194194

195+
type ViewResolvedMember = {
196+
member: string;
197+
name: string;
198+
};
199+
200+
type ViewExcludedMember = {
201+
member: string;
202+
};
203+
195204
const FunctionRegex = /function\s+\w+\(([A-Za-z0-9_,]*)|\(([\s\S]*?)\)\s*=>|\(?(\w+)\)?\s*=>/;
196205
export const CONTEXT_SYMBOLS = {
197206
SECURITY_CONTEXT: 'securityContext',
@@ -578,8 +587,10 @@ export class CubeSymbols implements TranspilerSymbolResolver {
578587

579588
const joinMap: string[][] = [];
580589

590+
const viewAllMembers: ViewResolvedMember[] = [];
591+
581592
for (const type of types) {
582-
let cubeIncludes: any[] = [];
593+
let cubeIncludes: ViewResolvedMember[] = [];
583594

584595
// If the hierarchy is included all members from it should be included as well
585596
// Extend `includes` with members from hierarchies that should be auto-included
@@ -610,6 +621,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
610621
}) : includedCubes;
611622

612623
cubeIncludes = this.membersFromCubes(cube, cubes, type, errorReporter, splitViews, memberSets) || [];
624+
viewAllMembers.push(...cubeIncludes);
613625

614626
if (type === 'hierarchies') {
615627
for (const member of cubeIncludes) {
@@ -627,7 +639,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
627639
}
628640
}
629641

630-
const includeMembers = this.generateIncludeMembers(cubeIncludes, type, cube);
642+
const includeMembers = this.generateIncludeMembers(cubeIncludes, type, cube, viewAllMembers);
631643
this.applyIncludeMembers(includeMembers, cube, type, errorReporter);
632644

633645
const existing = cube.includedMembers ?? [];
@@ -677,8 +689,8 @@ export class CubeSymbols implements TranspilerSymbolResolver {
677689
errorReporter: ErrorReporter,
678690
splitViews: SplitViews,
679691
memberSets: MemberSets
680-
) {
681-
const result: any[] = [];
692+
): ViewResolvedMember[] {
693+
const result: ViewResolvedMember[] = [];
682694
const seen = new Set<string>();
683695

684696
for (const cubeInclude of cubes) {
@@ -776,7 +788,8 @@ export class CubeSymbols implements TranspilerSymbolResolver {
776788
splitViewDef = splitViews[viewName];
777789
}
778790

779-
const includeMembers = this.generateIncludeMembers(finalIncludes, type, splitViewDef);
791+
const viewAllMembers: ViewResolvedMember[] = [];
792+
const includeMembers = this.generateIncludeMembers(finalIncludes, type, splitViewDef, viewAllMembers);
780793
this.applyIncludeMembers(includeMembers, splitViewDef, type, errorReporter);
781794
} else {
782795
for (const member of finalIncludes) {
@@ -792,7 +805,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
792805
return result;
793806
}
794807

795-
protected diffByMember(includes: any[], excludes: any[]) {
808+
protected diffByMember(includes: ViewResolvedMember[], excludes: ViewExcludedMember[]) {
796809
const excludesMap = new Map();
797810

798811
for (const exclude of excludes) {
@@ -806,15 +819,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
806819
return this.symbols[cubeName]?.cubeObj()?.[type]?.[memberName];
807820
}
808821

809-
protected generateIncludeMembers(members: any[], type: string, targetCube: CubeDefinitionExtended) {
810-
const availableDimMembers = new Set<string>();
811-
812-
if (type === 'measures') {
813-
Object.keys(targetCube.dimensions || {}).forEach(dimName => {
814-
availableDimMembers.add(`${targetCube.name}.${dimName}`);
815-
});
816-
}
817-
822+
protected generateIncludeMembers(members: any[], type: string, targetCube: CubeDefinitionExtended, viewAllMembers: ViewResolvedMember[]) {
818823
return members.map(memberRef => {
819824
const path = memberRef.member.split('.');
820825
const resolvedMember = this.getResolvedMember(type, path[path.length - 2], path[path.length - 1]);
@@ -836,15 +841,16 @@ export class CubeSymbols implements TranspilerSymbolResolver {
836841

837842
const drillMembersArray = (Array.isArray(evaluatedDrillMembers)
838843
? evaluatedDrillMembers
839-
: [evaluatedDrillMembers]).map(member => {
840-
const memberParts = member.split('.');
841-
if (memberParts[0] === sourceCubeName) {
842-
return `${targetCube.name}.${memberParts[1]}`;
844+
: [evaluatedDrillMembers]);
845+
846+
const filteredDrillMembers = drillMembersArray.flatMap(member => {
847+
const found = viewAllMembers.find(v => v.member.endsWith(member));
848+
if (!found) {
849+
return [];
843850
}
844-
return member; // Keep as-is if not from source cube
845-
});
846851

847-
const filteredDrillMembers = drillMembersArray.filter(member => availableDimMembers.has(member));
852+
return [`${targetCube.name}.${found.name}`];
853+
});
848854

849855
processedDrillMembers = () => filteredDrillMembers;
850856
}

0 commit comments

Comments
 (0)