Skip to content

Commit 4cd96e6

Browse files
committed
add test for loop
1 parent bb08799 commit 4cd96e6

File tree

1 file changed

+122
-1
lines changed

1 file changed

+122
-1
lines changed

packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4188,7 +4188,104 @@ cubes:
41884188
- name: amount_sum
41894189
sql: amount
41904190
type: sum
4191-
`);
4191+
4192+
# Join loop for testing transitive joins
4193+
- name: alpha_facts
4194+
sql: |
4195+
(
4196+
SELECT DATE '2023-01-01' AS reporting_date, 1 AS a_id, 10 AS b_id, 100 AS amount
4197+
UNION ALL
4198+
SELECT DATE '2023-01-02' AS reporting_date, 2 AS a_id, 20 AS b_id, 150 AS amount
4199+
)
4200+
joins:
4201+
- name: beta_dims
4202+
relationship: many_to_one
4203+
sql: "{CUBE}.a_id = {beta_dims.a_id}"
4204+
- name: gamma_dims
4205+
relationship: many_to_one
4206+
sql: "{CUBE}.b_id = {gamma_dims.b_id}"
4207+
- name: delta_bridge
4208+
relationship: many_to_one
4209+
sql: "{beta_dims.a_name} = {delta_bridge.a_name} AND {gamma_dims.b_name} = {delta_bridge.b_name}"
4210+
dimensions:
4211+
- name: reporting_date
4212+
sql: reporting_date
4213+
type: time
4214+
primary_key: true
4215+
- name: a_id
4216+
sql: a_id
4217+
type: number
4218+
primary_key: true
4219+
- name: b_id
4220+
sql: b_id
4221+
type: number
4222+
primary_key: true
4223+
- name: channel
4224+
sql: "{delta_bridge.channel}"
4225+
type: string
4226+
measures:
4227+
- name: amount_sum
4228+
sql: amount
4229+
type: sum
4230+
4231+
- name: beta_dims
4232+
sql: |
4233+
(
4234+
SELECT 1 AS a_id, 'Alpha1' AS a_name
4235+
UNION ALL
4236+
SELECT 2 AS a_id, 'Alpha2' AS a_name
4237+
)
4238+
dimensions:
4239+
- name: a_id
4240+
sql: a_id
4241+
type: number
4242+
primary_key: true
4243+
- name: a_name
4244+
sql: a_name
4245+
type: string
4246+
4247+
- name: gamma_dims
4248+
sql: |
4249+
(
4250+
SELECT 10 AS b_id, 'Beta1' AS b_name
4251+
UNION ALL
4252+
SELECT 20 AS b_id, 'Beta2' AS b_name
4253+
)
4254+
dimensions:
4255+
- name: b_id
4256+
sql: b_id
4257+
type: number
4258+
primary_key: true
4259+
- name: b_name
4260+
sql: b_name
4261+
type: string
4262+
4263+
- name: delta_bridge
4264+
sql: |
4265+
(
4266+
SELECT 'Alpha1' AS a_name, 'Beta1' AS b_name, 'Organic' AS channel
4267+
UNION ALL
4268+
SELECT 'Alpha1' AS a_name, 'Beta2' AS b_name, 'Paid' AS channel
4269+
UNION ALL
4270+
SELECT 'Alpha2' AS a_name, 'Beta1' AS b_name, 'Referral' AS channel
4271+
)
4272+
joins:
4273+
- name: gamma_dims
4274+
relationship: many_to_one
4275+
sql: "{CUBE}.b_name = {gamma_dims.b_name}"
4276+
dimensions:
4277+
- name: a_name
4278+
sql: a_name
4279+
type: string
4280+
primary_key: true
4281+
- name: b_name
4282+
sql: "{gamma_dims.b_name}"
4283+
type: string
4284+
primary_key: true
4285+
- name: channel
4286+
sql: channel
4287+
type: string
4288+
`);
41924289

41934290
it('querying cube dimension that require transitive joins', async () => {
41944291
await compiler.compile();
@@ -4230,5 +4327,29 @@ cubes:
42304327
},
42314328
]);
42324329
});
4330+
4331+
it('querying cube with transitive joins with loop', async () => {
4332+
await compiler.compile();
4333+
4334+
try {
4335+
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {
4336+
measures: [],
4337+
dimensions: [
4338+
'alpha_facts.reporting_date',
4339+
'delta_bridge.b_name',
4340+
'alpha_facts.channel'
4341+
],
4342+
order: [{
4343+
id: 'alpha_facts.reporting_date'
4344+
}],
4345+
timezone: 'America/Los_Angeles'
4346+
});
4347+
4348+
await dbRunner.testQuery(query.buildSqlAndParams());
4349+
throw new Error('Should have thrown an error');
4350+
} catch (err: any) {
4351+
expect(err.message).toContain('Can not construct joins for the query, potential loop detected');
4352+
}
4353+
});
42334354
});
42344355
});

0 commit comments

Comments
 (0)