@@ -60,6 +60,9 @@ export class PreAggregations {
60
60
if ( foundPreAggregation . preAggregation . type === 'rollupJoin' ) {
61
61
preAggregations = foundPreAggregation . preAggregationsToJoin ;
62
62
}
63
+ if ( foundPreAggregation . preAggregation . type === 'rollupLambda' ) {
64
+ preAggregations = foundPreAggregation . referencedPreAggregations ;
65
+ }
63
66
return preAggregations . map ( preAggregation => {
64
67
if ( this . canPartitionsBeUsed ( preAggregation ) ) {
65
68
const { dimension, partitionDimension } = this . partitionDimension ( preAggregation ) ;
@@ -679,33 +682,8 @@ export class PreAggregations {
679
682
R . toPairs ,
680
683
// eslint-disable-next-line no-unused-vars
681
684
// eslint-disable-next-line @typescript-eslint/no-unused-vars
682
- R . filter ( ( [ k , a ] ) => a . type === 'rollup' || a . type === 'rollupJoin' ) ,
683
- R . map ( ( [ preAggregationName , preAggregation ] ) => {
684
- const preAggObj = this . evaluatedPreAggregationObj (
685
- cube , preAggregationName , preAggregation , canUsePreAggregation
686
- ) ;
687
- if ( preAggregation . type === 'rollupJoin' ) {
688
- // TODO evaluation optimizations. Should be cached or moved to compile time.
689
- const preAggregationsToJoin = preAggObj . references . rollups . map (
690
- name => {
691
- const [ joinCube , joinPreAggregationName ] = this . query . cubeEvaluator . parsePath ( 'preAggregations' , name ) ;
692
- return this . evaluatedPreAggregationObj (
693
- joinCube ,
694
- joinPreAggregationName ,
695
- this . query . cubeEvaluator . byPath ( 'preAggregations' , name ) ,
696
- canUsePreAggregation
697
- ) ;
698
- }
699
- ) ;
700
- return {
701
- ...preAggObj ,
702
- preAggregationsToJoin,
703
- rollupJoin : this . buildRollupJoin ( preAggObj , preAggregationsToJoin )
704
- } ;
705
- } else {
706
- return preAggObj ;
707
- }
708
- } )
685
+ R . filter ( ( [ k , a ] ) => a . type === 'rollup' || a . type === 'rollupJoin' || a . type === 'rollupLambda' ) ,
686
+ R . map ( ( [ preAggregationName , preAggregation ] ) => this . evaluatedPreAggregationObj ( cube , preAggregationName , preAggregation , canUsePreAggregation ) )
709
687
) ( preAggregations ) ;
710
688
}
711
689
@@ -789,13 +767,85 @@ export class PreAggregations {
789
767
790
768
evaluatedPreAggregationObj ( cube , preAggregationName , preAggregation , canUsePreAggregation ) {
791
769
const references = this . evaluateAllReferences ( cube , preAggregation ) ;
792
- return {
770
+ const preAggObj = {
793
771
preAggregationName,
794
772
preAggregation,
795
773
cube,
796
774
canUsePreAggregation : canUsePreAggregation ( references ) ,
797
775
references
798
776
} ;
777
+
778
+ if ( preAggregation . type === 'rollupJoin' ) {
779
+ // TODO evaluation optimizations. Should be cached or moved to compile time.
780
+ const preAggregationsToJoin = preAggObj . references . rollups . map (
781
+ name => {
782
+ const [ joinCube , joinPreAggregationName ] = this . query . cubeEvaluator . parsePath ( 'preAggregations' , name ) ;
783
+ return this . evaluatedPreAggregationObj (
784
+ joinCube ,
785
+ joinPreAggregationName ,
786
+ this . query . cubeEvaluator . byPath ( 'preAggregations' , name ) ,
787
+ canUsePreAggregation
788
+ ) ;
789
+ }
790
+ ) ;
791
+ return {
792
+ ...preAggObj ,
793
+ preAggregationsToJoin,
794
+ rollupJoin : this . buildRollupJoin ( preAggObj , preAggregationsToJoin )
795
+ } ;
796
+ } else if ( preAggregation . type === 'rollupLambda' ) {
797
+ // TODO evaluation optimizations. Should be cached or moved to compile time.
798
+ const referencedPreAggregations = preAggObj . references . rollups . map (
799
+ name => {
800
+ const [ referencedCube , referencedPreAggregation ] = this . query . cubeEvaluator . parsePath ( 'preAggregations' , name ) ;
801
+ return this . evaluatedPreAggregationObj (
802
+ referencedCube ,
803
+ referencedPreAggregation ,
804
+ this . query . cubeEvaluator . byPath ( 'preAggregations' , name ) ,
805
+ canUsePreAggregation
806
+ ) ;
807
+ }
808
+ ) ;
809
+ if ( referencedPreAggregations . length === 0 ) {
810
+ throw new UserError ( `rollupLambda '${ cube } .${ preAggregationName } ' should reference at least on rollup` ) ;
811
+ }
812
+ if ( referencedPreAggregations . length > 1 ) {
813
+ throw new UserError ( `rollupLambda '${ cube } .${ preAggregationName } ' references multiple rollups. This feature is currently in early access preview. Please get in touch with us to get access to it: https://cube.dev/contact.` ) ;
814
+ }
815
+ referencedPreAggregations [ referencedPreAggregations . length - 1 ] = {
816
+ ...referencedPreAggregations [ referencedPreAggregations . length - 1 ] ,
817
+ preAggregation : {
818
+ ...referencedPreAggregations [ referencedPreAggregations . length - 1 ] . preAggregation ,
819
+ unionWithSourceData : preAggObj . preAggregation . unionWithSourceData ,
820
+ }
821
+ } ;
822
+ referencedPreAggregations . forEach ( referencedPreAggregation => {
823
+ PreAggregations . memberNameMismatchValidation ( preAggObj , referencedPreAggregation , 'measures' ) ;
824
+ PreAggregations . memberNameMismatchValidation ( preAggObj , referencedPreAggregation , 'dimensions' ) ;
825
+ PreAggregations . memberNameMismatchValidation ( preAggObj , referencedPreAggregation , 'timeDimensions' ) ;
826
+ } ) ;
827
+ return {
828
+ ...preAggObj ,
829
+ referencedPreAggregations,
830
+ } ;
831
+ } else {
832
+ return preAggObj ;
833
+ }
834
+ }
835
+
836
+ static memberNameMismatchValidation ( preAggA , preAggB , memberType ) {
837
+ const preAggAMemberNames = PreAggregations . memberShortNames ( preAggA . references [ memberType ] , memberType === 'timeDimensions' ) ;
838
+ const preAggBMemberNames = PreAggregations . memberShortNames ( preAggB . references [ memberType ] , memberType === 'timeDimensions' ) ;
839
+ if ( ! R . equals (
840
+ preAggAMemberNames ,
841
+ preAggBMemberNames
842
+ ) ) {
843
+ throw new UserError ( `Names for ${ memberType } doesn't match between '${ preAggA . cube } .${ preAggA . preAggregationName } ' and '${ preAggB . cube } .${ preAggB . preAggregationName } ': ${ JSON . stringify ( preAggAMemberNames ) } != ${ JSON . stringify ( preAggBMemberNames ) } ` ) ;
844
+ }
845
+ }
846
+
847
+ static memberShortNames ( memberArray , isTimeDimension ) {
848
+ return memberArray . map ( member => ( isTimeDimension ? member . dimension . split ( '.' ) [ 1 ] : member . split ( '.' ) [ 1 ] ) ) ;
799
849
}
800
850
801
851
rollupMatchResultDescriptions ( ) {
@@ -906,7 +956,23 @@ export class PreAggregations {
906
956
}
907
957
908
958
evaluateAllReferences ( cube , aggregation ) {
909
- return this . query . cubeEvaluator . evaluatePreAggregationReferences ( cube , aggregation ) ;
959
+ const references = this . query . cubeEvaluator . evaluatePreAggregationReferences ( cube , aggregation ) ;
960
+ if ( aggregation . type === 'rollupLambda' ) {
961
+ if ( references . rollups . length > 0 ) {
962
+ const [ firstLambdaCube ] = this . query . cubeEvaluator . parsePath ( 'preAggregations' , references . rollups [ 0 ] ) ;
963
+ const firstLambdaPreAggregation = this . query . cubeEvaluator . byPath ( 'preAggregations' , references . rollups [ 0 ] ) ;
964
+ const firstLambdaReferences = this . query . cubeEvaluator . evaluatePreAggregationReferences ( firstLambdaCube , firstLambdaPreAggregation ) ;
965
+
966
+ if ( references . measures . length === 0 &&
967
+ references . dimensions . length === 0 &&
968
+ references . timeDimensions . length === 0 ) {
969
+ return { ...firstLambdaReferences , rollups : references . rollups } ;
970
+ } else {
971
+ return references ;
972
+ }
973
+ }
974
+ }
975
+ return references ;
910
976
}
911
977
912
978
originalSqlPreAggregationTable ( preAggregationDescription ) {
@@ -953,6 +1019,11 @@ export class PreAggregations {
953
1019
} )
954
1020
)
955
1021
] ;
1022
+ } else if ( preAggregationForQuery . preAggregation . type === 'rollupLambda' ) {
1023
+ const lambdaPreAggregations = preAggregationForQuery . referencedPreAggregations ;
1024
+
1025
+ // TODO support lambda union of rollups
1026
+ toJoin = [ sqlAndAlias ( lambdaPreAggregations [ 0 ] ) ] ;
956
1027
} else {
957
1028
toJoin = [ sqlAndAlias ( preAggregationForQuery ) ] ;
958
1029
}
0 commit comments