Skip to content

Commit 837c4c2

Browse files
committed
fix drill members inheritance (cases of non-owned members)
1 parent ca9d3b7 commit 837c4c2

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
@@ -185,6 +185,15 @@ type MemberSets = {
185185
allMembers: Set<string>;
186186
};
187187

188+
type ViewResolvedMember = {
189+
member: string;
190+
name: string;
191+
};
192+
193+
type ViewExcludedMember = {
194+
member: string;
195+
};
196+
188197
const FunctionRegex = /function\s+\w+\(([A-Za-z0-9_,]*)|\(([\s\S]*?)\)\s*=>|\(?(\w+)\)?\s*=>/;
189198
export const CONTEXT_SYMBOLS = {
190199
SECURITY_CONTEXT: 'securityContext',
@@ -569,8 +578,10 @@ export class CubeSymbols implements TranspilerSymbolResolver {
569578
// because drillMembers processing for views in generateIncludeMembers() relies on this
570579
const types = ['hierarchies', 'dimensions', 'measures', 'segments'];
571580

581+
const viewAllMembers: ViewResolvedMember[] = [];
582+
572583
for (const type of types) {
573-
let cubeIncludes: any[] = [];
584+
let cubeIncludes: ViewResolvedMember[] = [];
574585

575586
// If the hierarchy is included all members from it should be included as well
576587
// Extend `includes` with members from hierarchies that should be auto-included
@@ -596,6 +607,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
596607
}) : includedCubes;
597608

598609
cubeIncludes = this.membersFromCubes(cube, cubes, type, errorReporter, splitViews, memberSets) || [];
610+
viewAllMembers.push(...cubeIncludes);
599611

600612
if (type === 'hierarchies') {
601613
for (const member of cubeIncludes) {
@@ -613,7 +625,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
613625
}
614626
}
615627

616-
const includeMembers = this.generateIncludeMembers(cubeIncludes, type, cube);
628+
const includeMembers = this.generateIncludeMembers(cubeIncludes, type, cube, viewAllMembers);
617629
this.applyIncludeMembers(includeMembers, cube, type, errorReporter);
618630

619631
const existing = cube.includedMembers ?? [];
@@ -665,8 +677,8 @@ export class CubeSymbols implements TranspilerSymbolResolver {
665677
errorReporter: ErrorReporter,
666678
splitViews: SplitViews,
667679
memberSets: MemberSets
668-
) {
669-
const result: any[] = [];
680+
): ViewResolvedMember[] {
681+
const result: ViewResolvedMember[] = [];
670682
const seen = new Set<string>();
671683

672684
for (const cubeInclude of cubes) {
@@ -764,7 +776,8 @@ export class CubeSymbols implements TranspilerSymbolResolver {
764776
splitViewDef = splitViews[viewName];
765777
}
766778

767-
const includeMembers = this.generateIncludeMembers(finalIncludes, type, splitViewDef);
779+
const viewAllMembers: ViewResolvedMember[] = [];
780+
const includeMembers = this.generateIncludeMembers(finalIncludes, type, splitViewDef, viewAllMembers);
768781
this.applyIncludeMembers(includeMembers, splitViewDef, type, errorReporter);
769782
} else {
770783
for (const member of finalIncludes) {
@@ -780,7 +793,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
780793
return result;
781794
}
782795

783-
protected diffByMember(includes: any[], excludes: any[]) {
796+
protected diffByMember(includes: ViewResolvedMember[], excludes: ViewExcludedMember[]) {
784797
const excludesMap = new Map();
785798

786799
for (const exclude of excludes) {
@@ -794,15 +807,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
794807
return this.symbols[cubeName]?.cubeObj()?.[type]?.[memberName];
795808
}
796809

797-
protected generateIncludeMembers(members: any[], type: string, targetCube: CubeDefinitionExtended) {
798-
const availableDimMembers = new Set<string>();
799-
800-
if (type === 'measures') {
801-
Object.keys(targetCube.dimensions || {}).forEach(dimName => {
802-
availableDimMembers.add(`${targetCube.name}.${dimName}`);
803-
});
804-
}
805-
810+
protected generateIncludeMembers(members: any[], type: string, targetCube: CubeDefinitionExtended, viewAllMembers: ViewResolvedMember[]) {
806811
return members.map(memberRef => {
807812
const path = memberRef.member.split('.');
808813
const resolvedMember = this.getResolvedMember(type, path[path.length - 2], path[path.length - 1]);
@@ -824,15 +829,16 @@ export class CubeSymbols implements TranspilerSymbolResolver {
824829

825830
const drillMembersArray = (Array.isArray(evaluatedDrillMembers)
826831
? evaluatedDrillMembers
827-
: [evaluatedDrillMembers]).map(member => {
828-
const memberParts = member.split('.');
829-
if (memberParts[0] === sourceCubeName) {
830-
return `${targetCube.name}.${memberParts[1]}`;
832+
: [evaluatedDrillMembers]);
833+
834+
const filteredDrillMembers = drillMembersArray.flatMap(member => {
835+
const found = viewAllMembers.find(v => v.member.endsWith(member));
836+
if (!found) {
837+
return [];
831838
}
832-
return member; // Keep as-is if not from source cube
833-
});
834839

835-
const filteredDrillMembers = drillMembersArray.filter(member => availableDimMembers.has(member));
840+
return [`${targetCube.name}.${found.name}`];
841+
});
836842

837843
processedDrillMembers = () => filteredDrillMembers;
838844
}

0 commit comments

Comments
 (0)