@@ -271,6 +271,18 @@ describe('SQL Generation', () => {
271
271
type: 'sum',
272
272
group_by: []
273
273
},
274
+ visitors_revenue_per_source: {
275
+ multi_stage: true,
276
+ sql: \`\${revenue}\`,
277
+ type: 'sum',
278
+ group_by: [visitors.source]
279
+ },
280
+ visitors_revenue_without_date: {
281
+ multi_stage: true,
282
+ sql: \`\${revenue}\`,
283
+ type: 'sum',
284
+ reduce_by: [visitors.created_at]
285
+ },
274
286
percentage_of_total: {
275
287
multi_stage: true,
276
288
sql: \`(100 * \${revenue} / NULLIF(\${visitors_revenue_total}, 0))::int\`,
@@ -887,7 +899,6 @@ SELECT 1 AS revenue, cast('2024-01-01' AS timestamp) as time UNION ALL
887
899
async function runQueryTest ( q , expectedResult ) {
888
900
await compiler . compile ( ) ;
889
901
const query = new PostgresQuery ( { joinGraph, cubeEvaluator, compiler } , q ) ;
890
-
891
902
const res = await dbRunner . testQuery ( query . buildSqlAndParams ( ) ) ;
892
903
console . log ( JSON . stringify ( res ) ) ;
893
904
@@ -3759,6 +3770,186 @@ SELECT 1 AS revenue, cast('2024-01-01' AS timestamp) as time UNION ALL
3759
3770
} ]
3760
3771
) ) ;
3761
3772
3773
+ it ( 'multi stage sum with group by' , async ( ) => runQueryTest (
3774
+ {
3775
+ measures : [ 'visitors.visitors_revenue_per_source' , 'visitors.revenue' ] ,
3776
+ dimensions : [ 'visitors.source' , 'visitors.created_at' ] ,
3777
+ order : [ {
3778
+ id : 'visitors.source'
3779
+ } , {
3780
+ id : 'visitors.created_at'
3781
+ } ] ,
3782
+ } ,
3783
+ [ {
3784
+ visitors__source : 'google' ,
3785
+ visitors__created_at : '2017-01-06T00:00:00.000Z' ,
3786
+ visitors__visitors_revenue_per_source : '300' ,
3787
+ visitors__revenue : '300'
3788
+ } ,
3789
+ {
3790
+ visitors__source : 'some' ,
3791
+ visitors__created_at : '2017-01-03T00:00:00.000Z' ,
3792
+ visitors__visitors_revenue_per_source : '300' ,
3793
+ visitors__revenue : '100'
3794
+ } ,
3795
+ {
3796
+ visitors__source : 'some' ,
3797
+ visitors__created_at : '2017-01-05T00:00:00.000Z' ,
3798
+ visitors__visitors_revenue_per_source : '300' ,
3799
+ visitors__revenue : '200'
3800
+ } ,
3801
+ {
3802
+ visitors__source : null ,
3803
+ visitors__created_at : '2016-09-07T00:00:00.000Z' ,
3804
+ visitors__visitors_revenue_per_source : '1400' ,
3805
+ visitors__revenue : '500'
3806
+ } ,
3807
+ {
3808
+ visitors__source : null ,
3809
+ visitors__created_at : '2017-01-07T00:00:00.000Z' ,
3810
+ visitors__visitors_revenue_per_source : '1400' ,
3811
+ visitors__revenue : '900'
3812
+ } ]
3813
+ ) ) ;
3814
+
3815
+ if ( getEnv ( 'nativeSqlPlanner' ) ) {
3816
+ it ( 'multi stage sum with group by over view' , async ( ) => runQueryTest (
3817
+ {
3818
+ measures : [ 'visitors_multi_stage.visitors_revenue_per_source' , 'visitors_multi_stage.revenue' ] ,
3819
+ dimensions : [ 'visitors_multi_stage.source' , 'visitors_multi_stage.created_at' ] ,
3820
+ order : [ {
3821
+ id : 'visitors_multi_stage.source'
3822
+ } , {
3823
+ id : 'visitors_multi_stage.created_at'
3824
+ } ] ,
3825
+ } ,
3826
+ [ {
3827
+ visitors_multi_stage__source : 'google' ,
3828
+ visitors_multi_stage__created_at : '2017-01-06T00:00:00.000Z' ,
3829
+ visitors_multi_stage__visitors_revenue_per_source : '300' ,
3830
+ visitors_multi_stage__revenue : '300'
3831
+ } ,
3832
+ {
3833
+ visitors_multi_stage__source : 'some' ,
3834
+ visitors_multi_stage__created_at : '2017-01-03T00:00:00.000Z' ,
3835
+ visitors_multi_stage__visitors_revenue_per_source : '300' ,
3836
+ visitors_multi_stage__revenue : '100'
3837
+ } ,
3838
+ {
3839
+ visitors_multi_stage__source : 'some' ,
3840
+ visitors_multi_stage__created_at : '2017-01-05T00:00:00.000Z' ,
3841
+ visitors_multi_stage__visitors_revenue_per_source : '300' ,
3842
+ visitors_multi_stage__revenue : '200'
3843
+ } ,
3844
+ {
3845
+ visitors_multi_stage__source : null ,
3846
+ visitors_multi_stage__created_at : '2016-09-07T00:00:00.000Z' ,
3847
+ visitors_multi_stage__visitors_revenue_per_source : '1400' ,
3848
+ visitors_multi_stage__revenue : '500'
3849
+ } ,
3850
+ {
3851
+ visitors_multi_stage__source : null ,
3852
+ visitors_multi_stage__created_at : '2017-01-07T00:00:00.000Z' ,
3853
+ visitors_multi_stage__visitors_revenue_per_source : '1400' ,
3854
+ visitors_multi_stage__revenue : '900'
3855
+ } ]
3856
+ ) ) ;
3857
+ } else {
3858
+ it . skip ( 'multi stage sum with reduce by over view' , async ( ) => {
3859
+ // Works only in Tesseract
3860
+ } ) ;
3861
+ }
3862
+
3863
+ it ( 'multi stage sum with reduce by' , async ( ) => runQueryTest (
3864
+ {
3865
+ measures : [ 'visitors.visitors_revenue_without_date' , 'visitors.revenue' ] ,
3866
+ dimensions : [ 'visitors.source' , 'visitors.created_at' ] ,
3867
+ order : [ {
3868
+ id : 'visitors.source'
3869
+ } , {
3870
+ id : 'visitors.created_at'
3871
+ } ] ,
3872
+ } ,
3873
+ [ {
3874
+ visitors__source : 'google' ,
3875
+ visitors__created_at : '2017-01-06T00:00:00.000Z' ,
3876
+ visitors__visitors_revenue_without_date : '300' ,
3877
+ visitors__revenue : '300'
3878
+ } ,
3879
+ {
3880
+ visitors__source : 'some' ,
3881
+ visitors__created_at : '2017-01-03T00:00:00.000Z' ,
3882
+ visitors__visitors_revenue_without_date : '300' ,
3883
+ visitors__revenue : '100'
3884
+ } ,
3885
+ {
3886
+ visitors__source : 'some' ,
3887
+ visitors__created_at : '2017-01-05T00:00:00.000Z' ,
3888
+ visitors__visitors_revenue_without_date : '300' ,
3889
+ visitors__revenue : '200'
3890
+ } ,
3891
+ {
3892
+ visitors__source : null ,
3893
+ visitors__created_at : '2016-09-07T00:00:00.000Z' ,
3894
+ visitors__visitors_revenue_without_date : '1400' ,
3895
+ visitors__revenue : '500'
3896
+ } ,
3897
+ {
3898
+ visitors__source : null ,
3899
+ visitors__created_at : '2017-01-07T00:00:00.000Z' ,
3900
+ visitors__visitors_revenue_without_date : '1400' ,
3901
+ visitors__revenue : '900'
3902
+ } ]
3903
+ ) ) ;
3904
+
3905
+ if ( getEnv ( 'nativeSqlPlanner' ) ) {
3906
+ it ( 'multi stage sum with reduce by over view' , async ( ) => runQueryTest (
3907
+ {
3908
+ measures : [ 'visitors_multi_stage.visitors_revenue_without_date' , 'visitors_multi_stage.revenue' ] ,
3909
+ dimensions : [ 'visitors_multi_stage.source' , 'visitors_multi_stage.created_at' ] ,
3910
+ order : [ {
3911
+ id : 'visitors_multi_stage.source'
3912
+ } , {
3913
+ id : 'visitors_multi_stage.created_at'
3914
+ } ] ,
3915
+ } ,
3916
+ [ {
3917
+ visitors_multi_stage__source : 'google' ,
3918
+ visitors_multi_stage__created_at : '2017-01-06T00:00:00.000Z' ,
3919
+ visitors_multi_stage__visitors_revenue_without_date : '300' ,
3920
+ visitors_multi_stage__revenue : '300'
3921
+ } ,
3922
+ {
3923
+ visitors_multi_stage__source : 'some' ,
3924
+ visitors_multi_stage__created_at : '2017-01-03T00:00:00.000Z' ,
3925
+ visitors_multi_stage__visitors_revenue_without_date : '300' ,
3926
+ visitors_multi_stage__revenue : '100'
3927
+ } ,
3928
+ {
3929
+ visitors_multi_stage__source : 'some' ,
3930
+ visitors_multi_stage__created_at : '2017-01-05T00:00:00.000Z' ,
3931
+ visitors_multi_stage__visitors_revenue_without_date : '300' ,
3932
+ visitors_multi_stage__revenue : '200'
3933
+ } ,
3934
+ {
3935
+ visitors_multi_stage__source : null ,
3936
+ visitors_multi_stage__created_at : '2016-09-07T00:00:00.000Z' ,
3937
+ visitors_multi_stage__visitors_revenue_without_date : '1400' ,
3938
+ visitors_multi_stage__revenue : '500'
3939
+ } ,
3940
+ {
3941
+ visitors_multi_stage__source : null ,
3942
+ visitors_multi_stage__created_at : '2017-01-07T00:00:00.000Z' ,
3943
+ visitors_multi_stage__visitors_revenue_without_date : '1400' ,
3944
+ visitors_multi_stage__revenue : '900'
3945
+ } ]
3946
+ ) ) ;
3947
+ } else {
3948
+ it . skip ( 'multi stage sum with reduce by over view' , async ( ) => {
3949
+ // Works only in Tesseract
3950
+ } ) ;
3951
+ }
3952
+
3762
3953
it ( 'multiplied sum and count no dimensions through view' , async ( ) => runQueryTest (
3763
3954
{
3764
3955
measures : [ 'visitors_visitors_checkins_view.revenue' , 'visitors_visitors_checkins_view.visitor_checkins_count' ] ,
0 commit comments