Skip to content

Commit c994d26

Browse files
committed
add test for loop
1 parent 7316c2c commit c994d26

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
@@ -4152,7 +4152,104 @@ cubes:
41524152
- name: amount_sum
41534153
sql: amount
41544154
type: sum
4155-
`);
4155+
4156+
# Join loop for testing transitive joins
4157+
- name: alpha_facts
4158+
sql: |
4159+
(
4160+
SELECT DATE '2023-01-01' AS reporting_date, 1 AS a_id, 10 AS b_id, 100 AS amount
4161+
UNION ALL
4162+
SELECT DATE '2023-01-02' AS reporting_date, 2 AS a_id, 20 AS b_id, 150 AS amount
4163+
)
4164+
joins:
4165+
- name: beta_dims
4166+
relationship: many_to_one
4167+
sql: "{CUBE}.a_id = {beta_dims.a_id}"
4168+
- name: gamma_dims
4169+
relationship: many_to_one
4170+
sql: "{CUBE}.b_id = {gamma_dims.b_id}"
4171+
- name: delta_bridge
4172+
relationship: many_to_one
4173+
sql: "{beta_dims.a_name} = {delta_bridge.a_name} AND {gamma_dims.b_name} = {delta_bridge.b_name}"
4174+
dimensions:
4175+
- name: reporting_date
4176+
sql: reporting_date
4177+
type: time
4178+
primary_key: true
4179+
- name: a_id
4180+
sql: a_id
4181+
type: number
4182+
primary_key: true
4183+
- name: b_id
4184+
sql: b_id
4185+
type: number
4186+
primary_key: true
4187+
- name: channel
4188+
sql: "{delta_bridge.channel}"
4189+
type: string
4190+
measures:
4191+
- name: amount_sum
4192+
sql: amount
4193+
type: sum
4194+
4195+
- name: beta_dims
4196+
sql: |
4197+
(
4198+
SELECT 1 AS a_id, 'Alpha1' AS a_name
4199+
UNION ALL
4200+
SELECT 2 AS a_id, 'Alpha2' AS a_name
4201+
)
4202+
dimensions:
4203+
- name: a_id
4204+
sql: a_id
4205+
type: number
4206+
primary_key: true
4207+
- name: a_name
4208+
sql: a_name
4209+
type: string
4210+
4211+
- name: gamma_dims
4212+
sql: |
4213+
(
4214+
SELECT 10 AS b_id, 'Beta1' AS b_name
4215+
UNION ALL
4216+
SELECT 20 AS b_id, 'Beta2' AS b_name
4217+
)
4218+
dimensions:
4219+
- name: b_id
4220+
sql: b_id
4221+
type: number
4222+
primary_key: true
4223+
- name: b_name
4224+
sql: b_name
4225+
type: string
4226+
4227+
- name: delta_bridge
4228+
sql: |
4229+
(
4230+
SELECT 'Alpha1' AS a_name, 'Beta1' AS b_name, 'Organic' AS channel
4231+
UNION ALL
4232+
SELECT 'Alpha1' AS a_name, 'Beta2' AS b_name, 'Paid' AS channel
4233+
UNION ALL
4234+
SELECT 'Alpha2' AS a_name, 'Beta1' AS b_name, 'Referral' AS channel
4235+
)
4236+
joins:
4237+
- name: gamma_dims
4238+
relationship: many_to_one
4239+
sql: "{CUBE}.b_name = {gamma_dims.b_name}"
4240+
dimensions:
4241+
- name: a_name
4242+
sql: a_name
4243+
type: string
4244+
primary_key: true
4245+
- name: b_name
4246+
sql: "{gamma_dims.b_name}"
4247+
type: string
4248+
primary_key: true
4249+
- name: channel
4250+
sql: channel
4251+
type: string
4252+
`);
41564253

41574254
it('querying cube dimension that require transitive joins', async () => {
41584255
await compiler.compile();
@@ -4194,5 +4291,29 @@ cubes:
41944291
},
41954292
]);
41964293
});
4294+
4295+
it('querying cube with transitive joins with loop', async () => {
4296+
await compiler.compile();
4297+
4298+
try {
4299+
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {
4300+
measures: [],
4301+
dimensions: [
4302+
'alpha_facts.reporting_date',
4303+
'delta_bridge.b_name',
4304+
'alpha_facts.channel'
4305+
],
4306+
order: [{
4307+
id: 'alpha_facts.reporting_date'
4308+
}],
4309+
timezone: 'America/Los_Angeles'
4310+
});
4311+
4312+
await dbRunner.testQuery(query.buildSqlAndParams());
4313+
throw new Error('Should have thrown an error');
4314+
} catch (err: any) {
4315+
expect(err.message).toContain('Can not construct joins for the query, potential loop detected');
4316+
}
4317+
});
41974318
});
41984319
});

0 commit comments

Comments
 (0)