@@ -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