Skip to content

Commit f6dbfe2

Browse files
chore(schema-compiler)!: Drop support for top-level includes/excludes in views (#9401)
* chore(schema-compiler)!: Drop support for top-level includes/excludes in views * fix view tests * Update DEPRECATION --------- Co-authored-by: Igor Lukanin <igor@cube.dev>
1 parent 55c5a95 commit f6dbfe2

File tree

5 files changed

+20
-77
lines changed

5 files changed

+20
-77
lines changed

DEPRECATION.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ features:
5858
| Removed | [Using Redis for in-memory cache and queue](#using-redis-for-in-memory-cache-and-queue) | v0.32.0 | v0.36.0 |
5959
| Deprecated | [`SECURITY_CONTEXT`](#security_context) | v0.33.0 | |
6060
| Deprecated | [`running_total` measure type](#running_total-measure-type) | v0.33.39 | |
61-
| Deprecated | [Top-level `includes` parameter in views](#top-level-includes-parameter-in-views) | v0.34.34 | |
61+
| Removed | [Top-level `includes` parameter in views](#top-level-includes-parameter-in-views) | v0.34.34 | v1.3.0 |
6262
| Removed | [Node.js 16](#nodejs-16) | v0.35.0 | v0.36.0 |
6363
| Removed | [MySQL-based SQL API](#mysql-based-sql-api) | v0.35.0 | v0.35.0 |
6464
| Removed | [`initApp` hook](#initapp-hook) | v0.35.0 | v0.35.0 |
@@ -350,9 +350,9 @@ to calculate running totals instead.
350350
351351
### Top-level `includes` parameter in views
352352
353-
**Deprecated in Release: v0.34.34**
353+
**Removed in Release: v1.3.0**
354354
355-
The top-level `includes` parameter is now deprecated. Please always use the
355+
The top-level `includes` parameter is now removed. Please always use the
356356
`includes` parameter within [`cubes` and `join_path`
357357
parameters](https://cube.dev/docs/reference/data-model/view#cubes) so you can
358358
explicitly control the join path.

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

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ export class CubeSymbols {
282282
}
283283

284284
protected prepareIncludes(cube: CubeDefinition, errorReporter: ErrorReporter, splitViews: SplitViews) {
285-
if (!cube.includes && !cube.cubes) {
285+
if (!cube.cubes) {
286286
return;
287287
}
288288

@@ -324,18 +324,8 @@ export class CubeSymbols {
324324
cubeIncludes = this.membersFromCubes(cube, cubes, type, errorReporter, splitViews, memberSets) || [];
325325
}
326326

327-
// This is the deprecated approach
328-
const includes = cube.includes && this.membersFromIncludeExclude(cube.includes, cube.name, type) || [];
329-
const excludes = cube.excludes && this.membersFromIncludeExclude(cube.excludes, cube.name, type) || [];
330-
331-
// cube includes will take precedence in case of member clash
332-
const finalIncludes = this.diffByMember(
333-
this.diffByMember(includes, cubeIncludes).concat(cubeIncludes),
334-
excludes
335-
);
336-
337327
if (type === 'hierarchies') {
338-
for (const member of finalIncludes) {
328+
for (const member of cubeIncludes) {
339329
const path = member.member.split('.');
340330
const cubeName = path[path.length - 2];
341331
const hierarchyName = path[path.length - 1];
@@ -350,10 +340,10 @@ export class CubeSymbols {
350340
}
351341
}
352342

353-
const includeMembers = this.generateIncludeMembers(finalIncludes, cube.name, type);
343+
const includeMembers = this.generateIncludeMembers(cubeIncludes, cube.name, type);
354344
this.applyIncludeMembers(includeMembers, cube, type, errorReporter);
355345

356-
cube.includedMembers = [...(cube.includedMembers || []), ...Array.from(new Set(finalIncludes.map((it: any) => {
346+
cube.includedMembers = [...(cube.includedMembers || []), ...Array.from(new Set(cubeIncludes.map((it: any) => {
357347
const split = it.member.split('.');
358348
const memberPath = this.pathFromArray([split[split.length - 2], split[split.length - 1]]);
359349
return {
@@ -465,22 +455,6 @@ export class CubeSymbols {
465455
return includes.filter(include => !excludesMap.has(include.member));
466456
}
467457

468-
protected membersFromIncludeExclude(referencesFn: (...args: Array<unknown>) => Array<ToString>, cubeName: string, type: string) {
469-
const references = this.evaluateReferences(cubeName, referencesFn);
470-
return R.unnest(references.map((ref: string) => {
471-
const path = ref.split('.');
472-
if (path.length === 1) {
473-
const membersObj = this.symbols[path[0]]?.cubeObj()?.[type] || {};
474-
return Object.keys(membersObj).map(memberName => ({ member: `${ref}.${memberName}` }));
475-
} else if (path.length === 2) {
476-
const resolvedMember = this.getResolvedMember(type, path[0], path[1]);
477-
return resolvedMember ? [{ member: ref }] : undefined;
478-
} else {
479-
throw new Error(`Unexpected path length ${path.length} for ${ref}`);
480-
}
481-
})).filter(Boolean);
482-
}
483-
484458
protected getResolvedMember(type: string, cubeName: string, memberName: string) {
485459
return this.symbols[cubeName]?.cubeObj()?.[type]?.[memberName];
486460
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -779,8 +779,6 @@ const cubeSchema = inherit(baseSchema, {
779779

780780
const viewSchema = inherit(baseSchema, {
781781
isView: Joi.boolean().strict(),
782-
includes: Joi.func(),
783-
excludes: Joi.func(),
784782
cubes: Joi.array().items(
785783
Joi.object().keys({
786784
joinPath: Joi.func().required(),

packages/cubejs-schema-compiler/test/integration/postgres/cube-views.test.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,19 @@ cube(\`ProductCategories\`, {
200200
});
201201
202202
view(\`OrdersView\`, {
203-
includes: [Orders],
204-
excludes: [Orders.createdAt],
203+
cubes: [{
204+
join_path: Orders,
205+
includes: '*',
206+
excludes: ['createdAt']
207+
}, {
208+
join_path: Orders.Products,
209+
includes: '*',
210+
prefix: true
211+
}, {
212+
join_path: Orders.Products.ProductCategories,
213+
includes: '*',
214+
prefix: true
215+
}],
205216
206217
measures: {
207218
productCategoryCount: {
@@ -233,10 +244,6 @@ view(\`OrdersView\`, {
233244
}
234245
});
235246
236-
view(\`OrdersView2\`, {
237-
includes: [Orders.count],
238-
});
239-
240247
view(\`OrdersView3\`, {
241248
cubes: [{
242249
join_path: Orders,

packages/cubejs-schema-compiler/test/unit/views.test.ts

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -391,42 +391,6 @@ describe('Views YAML', () => {
391391
});
392392
});
393393

394-
it('includes * (legacy)', async () => {
395-
const { cubeEvaluator } = await schemaCompile([{
396-
name: 'simple_view',
397-
includes: [
398-
'CubeA.id',
399-
// conflict
400-
// 'CubeB.id',
401-
'CubeB.other_id',
402-
]
403-
}]);
404-
405-
expect(cubeEvaluator.getCubeDefinition('simple_view').dimensions).toEqual({
406-
id: dimensionFixtureForCube('CubeA.id'),
407-
other_id: dimensionFixtureForCube('CubeB.other_id'),
408-
});
409-
});
410-
411-
it('includes * (legacy) + exclude b.id', async () => {
412-
const { cubeEvaluator } = await schemaCompile([{
413-
name: 'simple_view',
414-
includes: [
415-
'CubeA.id',
416-
'CubeB.id',
417-
'CubeB.other_id',
418-
],
419-
excludes: [
420-
'CubeB.id'
421-
]
422-
}]);
423-
424-
expect(cubeEvaluator.getCubeDefinition('simple_view').dimensions).toEqual({
425-
id: dimensionFixtureForCube('CubeA.id'),
426-
other_id: dimensionFixtureForCube('CubeB.other_id'),
427-
});
428-
});
429-
430394
it('throws error for unresolved members', async () => {
431395
const { compiler } = prepareYamlCompiler(`
432396
cubes:

0 commit comments

Comments
 (0)