@@ -789,6 +789,142 @@ describe('PreAggregations', () => {
789789 }
790790 });
791791
792+ cube('cube_a', {
793+ sql: \`SELECT 1 as id, 'dim_a' as dim_a\`,
794+
795+ joins: {
796+ cube_b: {
797+ relationship: 'many_to_one',
798+ sql: \`\${CUBE.dim_a} = \${cube_b.dim_a}\`
799+ },
800+ cube_c: {
801+ relationship: 'many_to_one',
802+ sql: \`\${CUBE.dim_a} = \${cube_c.dim_a}\`
803+ }
804+ },
805+
806+ dimensions: {
807+ id: {
808+ sql: 'id',
809+ type: 'string',
810+ primary_key: true
811+ },
812+
813+ dim_a: {
814+ sql: 'dim_a',
815+ type: 'string'
816+ },
817+
818+ dim_b: {
819+ sql: 'dim_b',
820+ type: 'string'
821+ },
822+ },
823+
824+ pre_aggregations: {
825+ aaa_rollup: {
826+ dimensions: [
827+ dim_a
828+ ]
829+ },
830+ rollupJoinAB: {
831+ type: 'rollupJoin',
832+ dimensions: [
833+ dim_a,
834+ cube_b.dim_b,
835+ cube_c.dim_c
836+ ],
837+ rollups: [
838+ aaa_rollup,
839+ cube_b.bbb_rollup
840+ ]
841+ }
842+ }
843+ });
844+
845+ cube('cube_b', {
846+ sql: \`SELECT 2 as id, 'dim_a' as dim_a, 'dim_b' as dim_b\`,
847+
848+ joins: {
849+ cube_c: {
850+ relationship: 'many_to_one',
851+ sql: \`\${CUBE.dim_b} = \${cube_c.dim_b}\`
852+ }
853+ },
854+
855+ dimensions: {
856+ id: {
857+ sql: 'id',
858+ type: 'string',
859+ primary_key: true
860+ },
861+
862+ dim_a: {
863+ sql: 'dim_a',
864+ type: 'string'
865+ },
866+
867+ dim_b: {
868+ sql: 'dim_b',
869+ type: 'string'
870+ },
871+ },
872+
873+ pre_aggregations: {
874+ bbb_rollup: {
875+ dimensions: [
876+ dim_a,
877+ dim_b,
878+ cube_c.dim_c
879+ ]
880+ }
881+ }
882+ });
883+
884+ cube('cube_c', {
885+ sql: \`SELECT 3 as id, 'dim_a' as dim_a, 'dim_b' as dim_b, 'dim_c' as dim_c\`,
886+
887+ dimensions: {
888+ id: {
889+ sql: 'id',
890+ type: 'string',
891+ primary_key: true
892+ },
893+
894+ dim_a: {
895+ sql: 'dim_a',
896+ type: 'string'
897+ },
898+
899+ dim_b: {
900+ sql: 'dim_b',
901+ type: 'string'
902+ },
903+
904+ dim_c: {
905+ sql: 'dim_c',
906+ type: 'string'
907+ },
908+ }
909+ });
910+
911+ view('view_abc', {
912+ cubes: [
913+ {
914+ join_path: cube_a,
915+ includes: ['dim_a']
916+ },
917+ {
918+ join_path: cube_a.cube_b,
919+ includes: ['dim_b']
920+ },
921+ {
922+ join_path: cube_a.cube_b.cube_c,
923+ includes: ['dim_c']
924+ }
925+ ]
926+ });
927+
792928 ` ) ;
793929
794930 it ( 'simple pre-aggregation' , async ( ) => {
@@ -3030,4 +3166,65 @@ describe('PreAggregations', () => {
30303166 ) ;
30313167 } ) ;
30323168 } ) ;
3169+
3170+ it ( 'rollupJoin pre-aggregation with nested joins via view (A->B->C)' , async ( ) => {
3171+ await compiler . compile ( ) ;
3172+
3173+ const query = new PostgresQuery ( { joinGraph, cubeEvaluator, compiler } , {
3174+ dimensions : [ 'view_abc.dim_a' , 'view_abc.dim_b' , 'view_abc.dim_c' ] ,
3175+ timezone : 'America/Los_Angeles' ,
3176+ preAggregationsSchema : ''
3177+ } ) ;
3178+
3179+ const queryAndParams = query . buildSqlAndParams ( ) ;
3180+ console . log ( queryAndParams ) ;
3181+ const preAggregationsDescription : any = query . preAggregations ?. preAggregationsDescription ( ) ;
3182+ console . log ( preAggregationsDescription ) ;
3183+ expect ( preAggregationsDescription . length ) . toBe ( 2 ) ;
3184+ const aaa = preAggregationsDescription . find ( p => p . preAggregationId === 'cube_a.aaa_rollup' ) ;
3185+ const bbb = preAggregationsDescription . find ( p => p . preAggregationId === 'cube_b.bbb_rollup' ) ;
3186+ expect ( aaa ) . toBeDefined ( ) ;
3187+ expect ( bbb ) . toBeDefined ( ) ;
3188+
3189+ expect ( query . preAggregations ?. preAggregationForQuery ?. canUsePreAggregation ) . toEqual ( true ) ;
3190+ expect ( query . preAggregations ?. preAggregationForQuery ?. preAggregationName ) . toEqual ( 'rollupJoinAB' ) ;
3191+
3192+ return dbRunner . evaluateQueryWithPreAggregations ( query ) . then ( res => {
3193+ expect ( res ) . toEqual (
3194+ [ {
3195+ view_abc__dim_a : 'dim_a' ,
3196+ view_abc__dim_b : 'dim_b' ,
3197+ view_abc__dim_c : 'dim_c' ,
3198+ } ]
3199+ ) ;
3200+ } ) ;
3201+ } ) ;
3202+
3203+ it ( 'rollupJoin pre-aggregation with nested joins via cube (A->B->C)' , async ( ) => {
3204+ await compiler . compile ( ) ;
3205+
3206+ const query = new PostgresQuery ( { joinGraph, cubeEvaluator, compiler } , {
3207+ dimensions : [ 'cube_a.dim_a' , 'cube_b.dim_b' , 'cube_c.dim_c' ] ,
3208+ timezone : 'America/Los_Angeles' ,
3209+ preAggregationsSchema : ''
3210+ } ) ;
3211+
3212+ const queryAndParams = query . buildSqlAndParams ( ) ;
3213+ console . log ( queryAndParams ) ;
3214+ const preAggregationsDescription : any = query . preAggregations ?. preAggregationsDescription ( ) ;
3215+ console . log ( preAggregationsDescription ) ;
3216+ expect ( preAggregationsDescription . length ) . toBe ( 0 ) ;
3217+
3218+ expect ( query . preAggregations ?. preAggregationForQuery ) . toBeUndefined ( ) ;
3219+
3220+ return dbRunner . evaluateQueryWithPreAggregations ( query ) . then ( res => {
3221+ expect ( res ) . toEqual (
3222+ [ {
3223+ cube_a__dim_a : 'dim_a' ,
3224+ cube_b__dim_b : 'dim_b' ,
3225+ cube_c__dim_c : 'dim_c' ,
3226+ } ]
3227+ ) ;
3228+ } ) ;
3229+ } ) ;
30333230} ) ;
0 commit comments