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