Skip to content

Commit ed4bff7

Browse files
committed
optimize transform() in CubeToMetaTransformer
1 parent 339aea6 commit ed4bff7

File tree

1 file changed

+89
-67
lines changed

1 file changed

+89
-67
lines changed

packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js

Lines changed: 89 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ export class CubeToMetaTransformer {
3939
* @protected
4040
*/
4141
transform(cube) {
42-
const cubeTitle = cube.title || this.titleize(cube.name);
42+
const cubeName = cube.name;
43+
const cubeTitle = cube.title || this.titleize(cubeName);
4344

4445
const isCubeVisible = this.isVisible(cube, true);
4546

@@ -52,7 +53,7 @@ export class CubeToMetaTransformer {
5253
if (member.type === 'folder') {
5354
return processFolder(member, [...path, folder.name], flatMembers);
5455
}
55-
const memberName = `${cube.name}.${member.name}`;
56+
const memberName = `${cubeName}.${member.name}`;
5657
flatMembers.push(memberName);
5758

5859
return memberName;
@@ -82,64 +83,75 @@ export class CubeToMetaTransformer {
8283

8384
return {
8485
config: {
85-
name: cube.name,
86+
name: cubeName,
8687
type: cube.isView ? 'view' : 'cube',
8788
title: cubeTitle,
8889
isVisible: isCubeVisible,
8990
public: isCubeVisible,
9091
description: cube.description,
91-
connectedComponent: this.joinGraph.connectedComponents()[cube.name],
92+
connectedComponent: this.joinGraph.connectedComponents()[cubeName],
9293
meta: cube.meta,
93-
measures: Object.entries(cube.measures || {}).map((nameToMetric) => ({
94-
...this.measureConfig(cube.name, cubeTitle, nameToMetric),
95-
isVisible: isCubeVisible ? this.isVisible(nameToMetric[1], true) : false,
96-
public: isCubeVisible ? this.isVisible(nameToMetric[1], true) : false,
97-
})),
98-
dimensions: Object.entries(cube.dimensions || {}).map((nameToDimension) => ({
99-
name: `${cube.name}.${nameToDimension[0]}`,
100-
title: this.title(cubeTitle, nameToDimension),
101-
type: this.dimensionDataType(nameToDimension[1].type),
102-
description: nameToDimension[1].description,
103-
shortTitle: this.title(cubeTitle, nameToDimension, true),
104-
suggestFilterValues:
105-
nameToDimension[1].suggestFilterValues == null
106-
? true
107-
: nameToDimension[1].suggestFilterValues,
108-
format: nameToDimension[1].format,
109-
meta: nameToDimension[1].meta,
110-
isVisible: isCubeVisible
111-
? this.isVisible(nameToDimension[1], !nameToDimension[1].primaryKey)
112-
: false,
113-
public: isCubeVisible
114-
? this.isVisible(nameToDimension[1], !nameToDimension[1].primaryKey)
115-
: false,
116-
primaryKey: !!nameToDimension[1].primaryKey,
117-
aliasMember: nameToDimension[1].aliasMember,
118-
granularities:
119-
nameToDimension[1].granularities
120-
? Object.entries(nameToDimension[1].granularities).map((g) => ({
121-
name: g[0],
122-
title: this.title(cubeTitle, g, true),
123-
interval: g[1].interval,
124-
offset: g[1].offset,
125-
origin: g[1].origin,
126-
}))
127-
: undefined,
128-
})),
129-
segments: Object.entries(cube.segments || {}).map((nameToSegment) => ({
130-
name: `${cube.name}.${nameToSegment[0]}`,
131-
title: this.title(cubeTitle, nameToSegment),
132-
shortTitle: this.title(cubeTitle, nameToSegment, true),
133-
description: nameToSegment[1].description,
134-
meta: nameToSegment[1].meta,
135-
isVisible: isCubeVisible ? this.isVisible(nameToSegment[1], true) : false,
136-
public: isCubeVisible ? this.isVisible(nameToSegment[1], true) : false,
137-
})),
94+
measures: Object.entries(cube.measures || {}).map((nameToMetric) => {
95+
const metricDef = nameToMetric[1];
96+
const measureVisibility = isCubeVisible ? this.isVisible(metricDef, true) : false;
97+
return {
98+
...this.measureConfig(cubeName, cubeTitle, nameToMetric),
99+
isVisible: measureVisibility,
100+
public: measureVisibility,
101+
};
102+
}),
103+
dimensions: Object.entries(cube.dimensions || {}).map((nameToDimension) => {
104+
const [dimensionName, dimDef] = nameToDimension;
105+
const dimensionVisibility = isCubeVisible
106+
? this.isVisible(dimDef, !dimDef.primaryKey)
107+
: false;
108+
const granularitiesObj = dimDef.granularities;
109+
110+
return {
111+
name: `${cubeName}.${dimensionName}`,
112+
title: this.title(cubeTitle, nameToDimension),
113+
type: this.dimensionDataType(dimDef.type),
114+
description: dimDef.description,
115+
shortTitle: this.title(cubeTitle, nameToDimension, true),
116+
suggestFilterValues:
117+
dimDef.suggestFilterValues == null
118+
? true
119+
: dimDef.suggestFilterValues,
120+
format: dimDef.format,
121+
meta: dimDef.meta,
122+
isVisible: dimensionVisibility,
123+
public: dimensionVisibility,
124+
primaryKey: !!dimDef.primaryKey,
125+
aliasMember: dimDef.aliasMember,
126+
granularities:
127+
granularitiesObj
128+
? Object.entries(granularitiesObj).map(([gName, gDef]) => ({
129+
name: gName,
130+
title: this.title(cubeTitle, [gName, gDef], true),
131+
interval: gDef.interval,
132+
offset: gDef.offset,
133+
origin: gDef.origin,
134+
}))
135+
: undefined,
136+
};
137+
}),
138+
segments: Object.entries(cube.segments || {}).map((nameToSegment) => {
139+
const [segmentName, segmentDef] = nameToSegment;
140+
const segmentVisibility = isCubeVisible ? this.isVisible(segmentDef, true) : false;
141+
return {
142+
name: `${cubeName}.${segmentName}`,
143+
title: this.title(cubeTitle, nameToSegment),
144+
shortTitle: this.title(cubeTitle, nameToSegment, true),
145+
description: segmentDef.description,
146+
meta: segmentDef.meta,
147+
isVisible: segmentVisibility,
148+
public: segmentVisibility,
149+
};
150+
}),
138151
hierarchies: (cube.evaluatedHierarchies || []).map((it) => ({
139152
...it,
140-
aliasMember: it.aliasMember,
141153
public: it.public ?? true,
142-
name: `${cube.name}.${it.name}`,
154+
name: `${cubeName}.${it.name}`,
143155
})),
144156
folders: flatFolders,
145157
nestedFolders,
@@ -192,39 +204,49 @@ export class CubeToMetaTransformer {
192204
}
193205

194206
measureConfig(cubeName, cubeTitle, nameToMetric) {
195-
const name = `${cubeName}.${nameToMetric[0]}`;
207+
const [metricName, metricDef] = nameToMetric;
208+
const name = `${cubeName}.${metricName}`;
209+
196210
// Support both old 'drillMemberReferences' and new 'drillMembers' keys
197-
const drillMembers = nameToMetric[1].drillMembers || nameToMetric[1].drillMemberReferences;
211+
const drillMembers = metricDef.drillMembers || metricDef.drillMemberReferences;
198212

199213
const drillMembersArray = (drillMembers && this.cubeEvaluator.evaluateReferences(
200214
cubeName, drillMembers, { originalSorting: true }
201215
)) || [];
202216

203-
const type = CubeSymbols.toMemberDataType(nameToMetric[1].type);
217+
const type = CubeSymbols.toMemberDataType(metricDef.type);
218+
const isCumulative = metricDef.cumulative || BaseMeasure.isCumulative(metricDef);
219+
220+
const drillMembersGrouped = { measures: [], dimensions: [] };
221+
for (const member of drillMembersArray) {
222+
if (this.cubeEvaluator.isMeasure(member)) {
223+
drillMembersGrouped.measures.push(member);
224+
} else if (this.cubeEvaluator.isDimension(member)) {
225+
drillMembersGrouped.dimensions.push(member);
226+
}
227+
}
204228

205229
return {
206230
name,
207231
title: this.title(cubeTitle, nameToMetric),
208-
description: nameToMetric[1].description,
232+
description: metricDef.description,
209233
shortTitle: this.title(cubeTitle, nameToMetric, true),
210-
format: nameToMetric[1].format,
211-
cumulativeTotal: nameToMetric[1].cumulative || BaseMeasure.isCumulative(nameToMetric[1]),
212-
cumulative: nameToMetric[1].cumulative || BaseMeasure.isCumulative(nameToMetric[1]),
234+
format: metricDef.format,
235+
cumulativeTotal: isCumulative,
236+
cumulative: isCumulative,
213237
type,
214-
aggType: nameToMetric[1].aggType || nameToMetric[1].type,
238+
aggType: metricDef.aggType || metricDef.type,
215239
drillMembers: drillMembersArray,
216-
drillMembersGrouped: {
217-
measures: drillMembersArray.filter((member) => this.cubeEvaluator.isMeasure(member)),
218-
dimensions: drillMembersArray.filter((member) => this.cubeEvaluator.isDimension(member)),
219-
},
220-
aliasMember: nameToMetric[1].aliasMember,
221-
meta: nameToMetric[1].meta
240+
drillMembersGrouped,
241+
aliasMember: metricDef.aliasMember,
242+
meta: metricDef.meta
222243
};
223244
}
224245

225246
title(cubeTitle, nameToDef, short) {
226-
// eslint-disable-next-line prefer-template
227-
return `${short ? '' : cubeTitle + ' '}${nameToDef[1].title || this.titleize(nameToDef[0])}`;
247+
const prefix = short ? '' : `${cubeTitle} `;
248+
const suffix = nameToDef[1].title || this.titleize(nameToDef[0]);
249+
return `${prefix}${suffix}`;
228250
}
229251

230252
titleize(name) {

0 commit comments

Comments
 (0)