Skip to content

Commit 737caab

Browse files
authored
feat: Expose aliasMember for hierarchy in View (#9636)
1 parent 5d5f7da commit 737caab

File tree

6 files changed

+21
-1
lines changed

6 files changed

+21
-1
lines changed

packages/cubejs-api-gateway/openspec.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ components:
182182
properties:
183183
name:
184184
type: "string"
185+
aliasMember:
186+
description: "When hierarchy is defined in Cube, it keeps the original path: Cube.hierarchy"
187+
type: "string"
185188
title:
186189
type: "string"
187190
levels:

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ export class CubeEvaluator extends CubeSymbols {
308308
if (cube.isView && (cube.includedMembers || []).length) {
309309
const includedMemberPaths: string[] = R.uniq(cube.includedMembers.map(it => it.memberPath));
310310
const includedCubeNames: string[] = R.uniq(includedMemberPaths.map(it => it.split('.')[0]));
311+
311312
// Path to name (which can be prefixed or aliased) map for hierarchy
312313
const hierarchyPathToName = cube.includedMembers.filter(it => it.type === 'hierarchies').reduce((acc, it) => ({
313314
...acc,
@@ -336,14 +337,18 @@ export class CubeEvaluator extends CubeSymbols {
336337
})
337338
.filter(Boolean);
338339

339-
const name = hierarchyPathToName[[cubeName, it.name].join('.')];
340+
const aliasMember = [cubeName, it.name].join('.');
341+
342+
const name = hierarchyPathToName[aliasMember];
340343
if (!name) {
341344
throw new UserError(`Hierarchy '${it.name}' not found in cube '${cubeName}'`);
342345
}
346+
343347
return {
344348
// Title might be overridden in the view
345349
title: cube.hierarchies?.[it.name]?.override?.title || it.title,
346350
...it,
351+
aliasMember,
347352
name,
348353
levels
349354
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export class CubeToMetaTransformer {
109109
)(cube.segments || {}),
110110
hierarchies: (cube.evaluatedHierarchies || []).map((it) => ({
111111
...it,
112+
aliasMember: it.aliasMember,
112113
public: it.public ?? true,
113114
name: `${cube.name}.${it.name}`,
114115
})),

packages/cubejs-schema-compiler/test/unit/__snapshots__/schema.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,7 @@ Object {
14461446
},
14471447
"evaluatedHierarchies": Array [
14481448
Object {
1449+
"aliasMember": "orders.hello",
14491450
"levels": Array [
14501451
"orders_view.my_beloved_status",
14511452
],

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ describe('Cube hierarchies', () => {
2323
name: 'orders_users_view.orders_hierarchy',
2424
title: 'Hello Hierarchy',
2525
public: true,
26+
aliasMember: 'orders.orders_hierarchy',
2627
levels: [
2728
'orders_users_view.status',
2829
'orders_users_view.number',
@@ -32,6 +33,7 @@ describe('Cube hierarchies', () => {
3233
{
3334
name: 'orders_users_view.some_other_hierarchy',
3435
public: true,
36+
aliasMember: 'orders.some_other_hierarchy',
3537
title: 'Some other hierarchy',
3638
levels: ['orders_users_view.state', 'orders_users_view.user_city']
3739
}
@@ -54,6 +56,7 @@ describe('Cube hierarchies', () => {
5456

5557
const prefixedHierarchy = allHierarchyView.config.hierarchies.find((it) => it.name === 'all_hierarchy_view.users_users_hierarchy');
5658
expect(prefixedHierarchy).toBeTruthy();
59+
expect(prefixedHierarchy?.aliasMember).toEqual('users.users_hierarchy');
5760
expect(prefixedHierarchy?.levels).toEqual(['all_hierarchy_view.users_age', 'all_hierarchy_view.users_city']);
5861
});
5962

@@ -146,12 +149,14 @@ describe('Cube hierarchies', () => {
146149

147150
expect(testView?.config.hierarchies).toEqual([
148151
{
152+
aliasMember: 'orders.base_orders_hierarchy',
149153
name: 'test_view.base_orders_hierarchy',
150154
title: 'Hello Hierarchy',
151155
levels: ['test_view.status', 'test_view.number'],
152156
public: true
153157
},
154158
{
159+
aliasMember: 'orders.orders_hierarchy',
155160
name: 'test_view.orders_hierarchy',
156161
levels: ['test_view.state', 'test_view.city'],
157162
public: true
@@ -174,6 +179,7 @@ describe('Cube hierarchies', () => {
174179

175180
expect(ordersCube.config.hierarchies).toEqual([
176181
{
182+
aliasMember: undefined,
177183
name: 'orders.hello',
178184
title: 'World',
179185
levels: ['orders.status'],

rust/cubesql/cubeclient/src/models/v1_cube_meta_hierarchy.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
pub struct V1CubeMetaHierarchy {
1313
#[serde(rename = "name")]
1414
pub name: String,
15+
/// When hierarchy is defined in Cube, it keeps the original path: Cube.hierarchy
16+
#[serde(rename = "aliasMember", skip_serializing_if = "Option::is_none")]
17+
pub alias_member: Option<String>,
1518
#[serde(rename = "title", skip_serializing_if = "Option::is_none")]
1619
pub title: Option<String>,
1720
#[serde(rename = "levels")]
@@ -22,6 +25,7 @@ impl V1CubeMetaHierarchy {
2225
pub fn new(name: String, levels: Vec<String>) -> V1CubeMetaHierarchy {
2326
V1CubeMetaHierarchy {
2427
name,
28+
alias_member: None,
2529
title: None,
2630
levels,
2731
}

0 commit comments

Comments
 (0)