Skip to content

Commit c76bbef

Browse files
authored
fix: join_path for JS schemas and * includes with prefix (#6555)
* fix: join_path for JS schemas and * includes with preif * fix: whitespace * fix: whitespace * fix: whitespace
1 parent 40d1e36 commit c76bbef

File tree

4 files changed

+108
-8
lines changed

4 files changed

+108
-8
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,17 @@ export class CubeEvaluator extends CubeSymbols {
198198
const cubeReference = split[split.length - 1];
199199
const cubeName = cubeInclude.alias || cubeReference;
200200
let includes;
201+
const fullMemberName = (memberName) => (cubeInclude.prefix ? `${cubeName}_${memberName}` : memberName);
201202
if (cubeInclude.includes === '*') {
202203
const membersObj = this.symbols[cubeReference]?.cubeObj()?.[type] || {};
203-
includes = Object.keys(membersObj).map(memberName => ({ member: `${fullPath}.${memberName}` }));
204+
includes = Object.keys(membersObj).map(memberName => ({ member: `${fullPath}.${memberName}`, name: fullMemberName(memberName) }));
204205
} else {
205206
includes = cubeInclude.includes.map(include => {
206207
const member = include.alias || include;
207208
if (member.indexOf('.') !== -1) {
208209
errorReporter.error(`Paths aren't allowed in cube includes but '${member}' provided as include member`);
209210
}
210-
let name = include.alias || member;
211-
name = cubeInclude.prefix ? `${cubeName}_${name}` : name;
211+
const name = fullMemberName(include.alias || member);
212212
if (include.name) {
213213
const resolvedMember = this.symbols[cubeReference]?.cubeObj()?.[type]?.[include.name];
214214
return resolvedMember ? {

packages/cubejs-schema-compiler/src/compiler/transpilers/CubePropContextTranspiler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const transpiledFieldsPatterns: Array<RegExp> = [
1717
/^contextMembers$/,
1818
/^includes$/,
1919
/^excludes$/,
20-
/^cubes\.[0-9]+\.joinPath$/,
20+
/^cubes\.[0-9]+\.(joinPath|join_path)$/,
2121
];
2222

2323
export const transpiledFields: Set<String> = new Set<String>();
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import { PostgresQuery } from '../../../src/adapter/PostgresQuery';
2+
// import { prepareYamlCompiler } from '../../unit/PrepareCompiler';
3+
import { prepareCompiler } from '../../unit/PrepareCompiler';
4+
import { dbRunner } from './PostgresDBRunner';
5+
6+
// TODO: move into utils
7+
async function runQueryTest(prepareCompilerResult, { cubeQuery, expectedResult }) {
8+
await prepareCompilerResult.compiler.compile();
9+
const query = new PostgresQuery(prepareCompilerResult, cubeQuery);
10+
11+
console.log(query.buildSqlAndParams());
12+
13+
const res = await dbRunner.testQuery(query.buildSqlAndParams());
14+
console.log(JSON.stringify(res));
15+
16+
expect(res).toEqual(
17+
expectedResult
18+
);
19+
}
20+
21+
describe('Views in YAML', () => {
22+
jest.setTimeout(200000);
23+
});
24+
25+
describe('Views in JS', () => {
26+
jest.setTimeout(200000);
27+
28+
const prepareCompilerResult = prepareCompiler(`
29+
cube(\`orders\`, {
30+
sql: \`SELECT 1 as id, 1 as customer_id, '2022-01-01' as timestamp\`,
31+
32+
joins: {
33+
customers: {
34+
relationship: \`many_to_one\`,
35+
sql: \`\${CUBE}.customer_id = \${customers}.id\`
36+
}
37+
},
38+
39+
dimensions: {
40+
id: {
41+
sql: \`id\`,
42+
type: \`number\`,
43+
primary_key: true,
44+
public: true
45+
},
46+
47+
time: {
48+
sql: \`timestamp\`,
49+
type: \`time\`
50+
}
51+
},
52+
53+
measures: {
54+
count: {
55+
type: \`count\`
56+
}
57+
}
58+
});
59+
60+
cube(\`customers\`, {
61+
sql: \`SELECT 1 as id, 'Foo' as name\`,
62+
63+
dimensions: {
64+
id: {
65+
sql: \`id\`,
66+
type: \`number\`,
67+
primary_key: true,
68+
public: true
69+
},
70+
71+
name: {
72+
sql: \`name\`,
73+
type: \`string\`
74+
}
75+
}
76+
});
77+
78+
view(\`ecommerce\`, {
79+
cubes: [
80+
{
81+
join_path: orders,
82+
prefix: true,
83+
includes: \`*\`
84+
},
85+
{
86+
join_path: orders.customers,
87+
prefix: true,
88+
includes: [\`name\`]
89+
}
90+
]
91+
});
92+
93+
`);
94+
95+
it('join_path', async () => runQueryTest(prepareCompilerResult, {
96+
cubeQuery: {
97+
measures: ['ecommerce.orders_count'],
98+
dimensions: ['ecommerce.customers_name']
99+
},
100+
expectedResult: [
101+
{ ecommerce__customers_name: 'Foo', ecommerce__orders_count: '1' }
102+
]
103+
}));
104+
});

packages/cubejs-schema-compiler/test/integration/postgres/yaml-compiler.test.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -375,12 +375,8 @@ views:
375375
preAggregationsSchema: ''
376376
});
377377

378-
console.log(query.buildSqlAndParams());
379-
380378
const res = await dbRunner.evaluateQueryWithPreAggregations(query);
381379

382-
console.log(JSON.stringify(res));
383-
384380
expect(res).toEqual(
385381
[{
386382
orders_view__orders_count: '1',

0 commit comments

Comments
 (0)