Skip to content

Commit d644d45

Browse files
committed
feat(schema-compiler): Support overriding title, description, meta, and format on view members
1 parent c5d7475 commit d644d45

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,9 @@ export class CubeEvaluator extends CubeSymbols {
257257
}
258258

259259
private prepareHierarchies(cube: any, errorReporter: ErrorReporter): void {
260-
if (Object.keys(cube.hierarchies).length) {
260+
// Hierarchies from views are not fully populated at this moment and are processed later,
261+
// so we should not pollute the cube hierarchies definition here.
262+
if (!cube.isView && Object.keys(cube.hierarchies).length) {
261263
cube.evaluatedHierarchies = Object.entries(cube.hierarchies).map(([name, hierarchy]) => ({
262264
name,
263265
...(typeof hierarchy === 'object' ? hierarchy : {}),
@@ -306,6 +308,8 @@ export class CubeEvaluator extends CubeSymbols {
306308
throw new UserError(`Hierarchy '${it.name}' not found in cube '${cubeName}'`);
307309
}
308310
return {
311+
// Title might be overridden in the view
312+
title: cube.hierarchies?.[it.name]?.override?.title || it.title,
309313
...it,
310314
name,
311315
levels

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

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -275,13 +275,14 @@ export class CubeSymbols {
275275
this.prepareIncludes(cube, errorReporter, splitViews);
276276
}
277277

278-
return Object.assign(
279-
{ cubeName: () => cube.name, cubeObj: () => cube },
280-
cube.measures || {},
281-
cube.dimensions || {},
282-
cube.segments || {},
283-
cube.preAggregations || {}
284-
);
278+
return {
279+
cubeName: () => cube.name,
280+
cubeObj: () => cube,
281+
...cube.measures || {},
282+
...cube.dimensions || {},
283+
...cube.segments || {},
284+
...cube.preAggregations || {}
285+
};
285286
}
286287

287288
private camelCaseTypes(obj: Object) {
@@ -425,7 +426,7 @@ export class CubeSymbols {
425426
for (const [memberName, memberDefinition] of includeMembers) {
426427
if (cube[type]?.[memberName]) {
427428
errorReporter.error(`Included member '${memberName}' conflicts with existing member of '${cube.name}'. Please consider excluding this member or assigning it an alias.`);
428-
} else if (type !== 'hierarchies') {
429+
} else {
429430
cube[type][memberName] = memberDefinition;
430431
}
431432
}
@@ -461,6 +462,14 @@ export class CubeSymbols {
461462
const resolvedMember = this.getResolvedMember(type, cubeReference, includedMemberName) ? {
462463
member: `${fullPath}.${includedMemberName}`,
463464
name,
465+
...(include.title || include.description || include.format || include.meta) ? {
466+
override: {
467+
title: include.title,
468+
description: include.description,
469+
format: include.format,
470+
meta: include.meta,
471+
}
472+
} : {}
464473
} : undefined;
465474

466475
if (resolvedMember) {
@@ -537,10 +546,10 @@ export class CubeSymbols {
537546
sql,
538547
type: CubeSymbols.toMemberDataType(resolvedMember.type),
539548
aggType: resolvedMember.type,
540-
meta: resolvedMember.meta,
541-
title: resolvedMember.title,
542-
description: resolvedMember.description,
543-
format: resolvedMember.format,
549+
meta: memberRef.override?.meta || resolvedMember.meta,
550+
title: memberRef.override?.title || resolvedMember.title,
551+
description: memberRef.override?.description || resolvedMember.description,
552+
format: memberRef.override?.format || resolvedMember.format,
544553
...(resolvedMember.multiStage && { multiStage: resolvedMember.multiStage }),
545554
...(resolvedMember.timeShift && { timeShift: resolvedMember.timeShift }),
546555
...(resolvedMember.orderBy && { orderBy: resolvedMember.orderBy }),
@@ -549,24 +558,24 @@ export class CubeSymbols {
549558
memberDefinition = {
550559
sql,
551560
type: resolvedMember.type,
552-
meta: resolvedMember.meta,
553-
title: resolvedMember.title,
554-
description: resolvedMember.description,
555-
format: resolvedMember.format,
561+
meta: memberRef.override?.meta || resolvedMember.meta,
562+
title: memberRef.override?.title || resolvedMember.title,
563+
description: memberRef.override?.description || resolvedMember.description,
564+
format: memberRef.override?.format || resolvedMember.format,
556565
...(resolvedMember.granularities ? { granularities: resolvedMember.granularities } : {}),
557566
...(resolvedMember.multiStage && { multiStage: resolvedMember.multiStage }),
558567
};
559568
} else if (type === 'segments') {
560569
memberDefinition = {
561570
sql,
562-
meta: resolvedMember.meta,
563-
title: resolvedMember.title,
564-
description: resolvedMember.description,
571+
meta: memberRef.override?.meta || resolvedMember.meta,
572+
description: memberRef.override?.description || resolvedMember.description,
573+
title: memberRef.override?.title || resolvedMember.title,
565574
aliases: resolvedMember.aliases,
566575
};
567576
} else if (type === 'hierarchies') {
568577
memberDefinition = {
569-
title: resolvedMember.title,
578+
title: memberRef.override?.title || resolvedMember.title,
570579
levels: resolvedMember.levels,
571580
};
572581
} else {

0 commit comments

Comments
 (0)