Skip to content

Commit efcb585

Browse files
committed
fixes
1 parent 9863d9a commit efcb585

File tree

6 files changed

+63
-77
lines changed

6 files changed

+63
-77
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,17 @@ export class CubeEvaluator extends CubeSymbols {
242242
const filteredHierarchies = hierarchies
243243
.filter(it => includedHierarchyNames.includes(it.name))
244244
.map(it => {
245-
const levels = it.levels.filter(level => includedMemberPaths.includes(level));
245+
const levels = it.levels.filter(level => {
246+
const member = cube.includedMembers.find(m => m.memberPath === level);
247+
if (member && member.type !== 'dimensions') {
248+
const memberName = level.split('.')[1] || level;
249+
errorReporter.error(`Only dimensions can be part of a hierarchy. Please remove the '${memberName}' member from the '${it.name}' hierarchy.`);
250+
} else if (member) {
251+
return includedMemberPaths.includes(level);
252+
}
253+
254+
return null;
255+
}).filter(Boolean);
246256

247257
return {
248258
...it,

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,6 @@ export class CubeSymbols {
324324
errorReporter.error(`Paths aren't allowed in cube excludes but '${exclude}' provided as exclude member`);
325325
}
326326

327-
// const resolvedMember = this.symbols[cubeReference]?.cubeObj()?.[type]?.[exclude];
328327
const resolvedMember = this.getResolvedMember(type, cubeReference, exclude);
329328
return resolvedMember ? {
330329
member: `${fullPath}.${exclude}`

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ export class CubeToMetaTransformer {
108108
)(cube.segments || {}),
109109
hierarchies: (cube.hierarchies || []).map((it) => ({
110110
...it,
111+
public: it.public ?? true,
111112
name: `${cube.name}.${it.name}`,
112113
})),
113114
folders: (cube.folders || []).map((it) => ({
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
cubes:
2+
- name: orders
3+
sql: SELECT * FROM orders
4+
measures:
5+
- name: count
6+
sql: id
7+
type: count
8+
dimensions:
9+
- name: id
10+
sql: id
11+
type: number
12+
primary_key: true
13+
14+
- name: status
15+
sql: status
16+
type: string
17+
18+
- name: city
19+
sql: city
20+
type: string
21+
hierarchies:
22+
- name: correct_hierarchy
23+
levels:
24+
- status
25+
- city
26+
- name: orders_hierarchy
27+
levels:
28+
- "{CUBE}.status"
29+
- count
30+
31+
views:
32+
- name: test_view
33+
cubes:
34+
- join_path: orders
35+
includes: "*"

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

Lines changed: 11 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import path from 'path';
44
import { prepareYamlCompiler } from './PrepareCompiler';
55

66
describe('Cube hierarchies', () => {
7-
it('hierarchies defined on a view only', async () => {
7+
it('base cases', async () => {
88
const modelContent = fs.readFileSync(
99
path.join(process.cwd(), '/test/unit/fixtures/hierarchies2.yml'),
1010
'utf8'
@@ -21,13 +21,15 @@ describe('Cube hierarchies', () => {
2121
expect(ordersView.config.hierarchies).toEqual([
2222
{
2323
name: 'orders_users_view.orders_hierarchy',
24+
public: true,
2425
levels: [
2526
'orders_users_view.status',
2627
'orders_users_view.number'
2728
],
2829
},
2930
{
3031
name: 'orders_users_view.some_other_hierarchy',
32+
public: true,
3133
title: 'Some other hierarchy',
3234
levels: ['orders_users_view.state']
3335
}
@@ -48,80 +50,14 @@ describe('Cube hierarchies', () => {
4850
);
4951
expect(allHierarchyView.config.hierarchies.length).toBe(3);
5052
});
51-
// const { compiler, metaTransformer } = prepareYamlCompiler(`
52-
// views:
53-
// - name: orders_view
54-
// cubes:
55-
// - join_path: orders
56-
// prefix: true
57-
// includes: "*"
58-
// - join_path: users
59-
// prefix: false
60-
// includes:
61-
// - count
62-
// - name: gender
63-
// alias: hello_world
64-
// hierarchies:
65-
// - name: hello
66-
// levels:
67-
// - users.count
68-
// - users.gender
69-
// - orders.count
70-
// - orders.status
71-
// cubes:
72-
// - name: orders
73-
// sql: SELECT * FROM orders
74-
// measures:
75-
// - name: count
76-
// type: count
77-
// dimensions:
78-
// - name: id
79-
// sql: id
80-
// type: number
81-
// primary_key: true
8253

83-
// - name: status
84-
// sql: status
85-
// type: string
86-
87-
// - name: users
88-
// sql: SELECT * FROM users
89-
// measures:
90-
// - name: count
91-
// type: count
92-
// dimensions:
93-
// - name: id
94-
// sql: id
95-
// type: number
96-
// primary_key: true
97-
98-
// - name: gender
99-
// sql: gender
100-
// type: string
101-
102-
// - name: city
103-
// sql: city
104-
// type: string
105-
106-
// - name: status
107-
// sql: status
108-
// type: string
109-
// `);
110-
111-
// await compiler.compile();
112-
113-
// const ordersView = metaTransformer.cubes.find(it => it.config.name === 'orders_view');
54+
it(('hierarchy with measure'), async () => {
55+
const modelContent = fs.readFileSync(
56+
path.join(process.cwd(), '/test/unit/fixtures/hierarchy-with-measure.yml'),
57+
'utf8'
58+
);
59+
const { compiler } = prepareYamlCompiler(modelContent);
11460

115-
// expect(ordersView.config.hierarchies).toEqual([
116-
// {
117-
// name: 'hello',
118-
// levels: [
119-
// 'orders_view.count',
120-
// 'orders_view.hello_world',
121-
// 'orders_view.orders_count',
122-
// 'orders_view.orders_status'
123-
// ]
124-
// },
125-
// ]);
126-
// });
61+
await expect(compiler.compile()).rejects.toThrow('Only dimensions can be part of a hierarchy. Please remove the \'count\' member from the \'orders_hierarchy\' hierarchy.');
62+
});
12763
});

packages/cubejs-server-core/src/core/CompilerApi.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,10 @@ export class CompilerApi {
463463
for (const segment of cube.config.segments) {
464464
isMemberVisibleInContext[segment.name] = computeMemberVisibility(segment);
465465
}
466+
467+
for (const hierarchy of cube.config.hierarchies) {
468+
isMemberVisibleInContext[hierarchy.name] = computeMemberVisibility(hierarchy);
469+
}
466470
}
467471
}
468472

@@ -485,6 +489,7 @@ export class CompilerApi {
485489
measures: cube.config.measures?.map(visibilityPatcherForCube(cube)),
486490
dimensions: cube.config.dimensions?.map(visibilityPatcherForCube(cube)),
487491
segments: cube.config.segments?.map(visibilityPatcherForCube(cube)),
492+
hierarchies: cube.config.hierarchies?.map(visibilityPatcherForCube(cube)),
488493
},
489494
}));
490495
}

0 commit comments

Comments
 (0)