@@ -390,15 +390,20 @@ export class PreAggregations {
390
390
}
391
391
392
392
public static transformQueryToCanUseForm ( query : BaseQuery ) : TransformedQuery {
393
- const flattenDimensionMembers = this . flattenDimensionMembers ( query ) ;
394
- const sortedDimensions = this . squashDimensions ( flattenDimensionMembers ) ;
395
393
const allBackAliasMembers = query . allBackAliasMembers ( ) ;
394
+ const resolveFullMemberPath = query . resolveFullMemberPathFn ( ) ;
395
+ const flattenDimensionMembers = this . flattenDimensionMembers ( query ) ;
396
+ const sortedDimensions = this . squashDimensions ( flattenDimensionMembers ) . map ( resolveFullMemberPath ) ;
396
397
const measures : ( BaseMeasure | BaseFilter | BaseGroupFilter ) [ ] = [ ...query . measures , ...query . measureFilters ] ;
397
- const measurePaths = R . uniq ( this . flattenMembers ( measures ) . filter ( ( m ) : m is BaseMeasure => m instanceof BaseMeasure ) . map ( m => m . expressionPath ( ) ) ) ;
398
+ const measurePaths = ( R . uniq (
399
+ this . flattenMembers ( measures )
400
+ . filter ( ( m ) : m is BaseMeasure => m instanceof BaseMeasure )
401
+ . map ( m => m . expressionPath ( ) )
402
+ ) ) . map ( resolveFullMemberPath ) ;
398
403
const collectLeafMeasures = query . collectLeafMeasures . bind ( query ) ;
399
404
const dimensionsList = query . dimensions . map ( dim => dim . expressionPath ( ) ) ;
400
405
const segmentsList = query . segments . map ( s => s . expressionPath ( ) ) ;
401
- const ownedDimensions = PreAggregations . ownedMembers ( query , flattenDimensionMembers ) ;
406
+ const ownedDimensions = PreAggregations . ownedMembers ( query , flattenDimensionMembers ) . map ( resolveFullMemberPath ) ;
402
407
const ownedTimeDimensions = query . timeDimensions . map ( td => {
403
408
const owned = PreAggregations . ownedMembers ( query , [ td ] ) ;
404
409
let { dimension } = td ;
@@ -444,7 +449,8 @@ export class PreAggregations {
444
449
return leafMeasures ;
445
450
} ) ,
446
451
R . unnest ,
447
- R . uniq
452
+ R . uniq ,
453
+ R . map ( resolveFullMemberPath ) ,
448
454
) ( measures ) ;
449
455
450
456
function allValuesEq1 ( map ) {
@@ -458,8 +464,10 @@ export class PreAggregations {
458
464
459
465
const sortedTimeDimensions = PreAggregations . sortTimeDimensionsWithRollupGranularity ( query . timeDimensions ) ;
460
466
const timeDimensions = PreAggregations . timeDimensionsAsIs ( query . timeDimensions ) ;
461
- const ownedTimeDimensionsWithRollupGranularity = PreAggregations . sortTimeDimensionsWithRollupGranularity ( ownedTimeDimensions ) ;
462
- const ownedTimeDimensionsAsIs = PreAggregations . timeDimensionsAsIs ( ownedTimeDimensions ) ;
467
+ const ownedTimeDimensionsWithRollupGranularity = PreAggregations . sortTimeDimensionsWithRollupGranularity ( ownedTimeDimensions )
468
+ . map ( ( [ d , g ] ) => [ resolveFullMemberPath ( d ) , g ] ) ;
469
+ const ownedTimeDimensionsAsIs = PreAggregations . timeDimensionsAsIs ( ownedTimeDimensions )
470
+ . map ( ( [ d , g ] ) => [ resolveFullMemberPath ( d ) , g ] ) ;
463
471
464
472
const hasNoTimeDimensionsWithoutGranularity = ! query . timeDimensions . filter ( d => ! d . granularity ) . length ;
465
473
@@ -577,31 +585,6 @@ export class PreAggregations {
577
585
* for specified query, or its value for `refs` if specified.
578
586
*/
579
587
public static canUsePreAggregationForTransformedQueryFn ( transformedQuery : TransformedQuery , refs : PreAggregationReferences | null = null ) : CanUsePreAggregationFn {
580
- function trimmedReferences ( references : PreAggregationReferences ) : PreAggregationReferences {
581
- const timeDimensionsTrimmed = references
582
- . timeDimensions
583
- . map ( td => ( {
584
- ...td ,
585
- dimension : CubeSymbols . joinHintFromPath ( td . dimension ) . path ,
586
- } ) ) ;
587
- const measuresTrimmed = references
588
- . measures
589
- . map ( m => CubeSymbols . joinHintFromPath ( m ) . path ) ;
590
- const dimensionsTrimmed = references
591
- . dimensions
592
- . map ( d => CubeSymbols . joinHintFromPath ( d ) . path ) ;
593
- const multipliedMeasuresTrimmed = references
594
- . multipliedMeasures ?. map ( m => CubeSymbols . joinHintFromPath ( m ) . path ) || [ ] ;
595
-
596
- return {
597
- ...references ,
598
- dimensions : dimensionsTrimmed ,
599
- measures : measuresTrimmed ,
600
- timeDimensions : timeDimensionsTrimmed ,
601
- multipliedMeasures : multipliedMeasuresTrimmed ,
602
- } ;
603
- }
604
-
605
588
/**
606
589
* Returns an array of 2-elements arrays with the dimension and granularity
607
590
* sorted by the concatenated dimension + granularity key.
@@ -638,14 +621,12 @@ export class PreAggregations {
638
621
* Determine whether pre-aggregation can be used or not.
639
622
*/
640
623
const canUsePreAggregationNotAdditive : CanUsePreAggregationFn = ( references : PreAggregationReferences ) : boolean => {
641
- const referencesTrimmed = trimmedReferences ( references ) ;
642
-
643
- const refTimeDimensions = backAlias ( sortTimeDimensions ( referencesTrimmed . timeDimensions ) ) ;
624
+ const refTimeDimensions = backAlias ( sortTimeDimensions ( references . timeDimensions ) ) ;
644
625
const qryTimeDimensions = references . allowNonStrictDateRangeMatch
645
626
? transformedQuery . timeDimensions
646
627
: transformedQuery . sortedTimeDimensions ;
647
- const backAliasMeasures = backAlias ( referencesTrimmed . measures ) ;
648
- const backAliasDimensions = backAlias ( referencesTrimmed . dimensions ) ;
628
+ const backAliasMeasures = backAlias ( references . measures ) ;
629
+ const backAliasDimensions = backAlias ( references . dimensions ) ;
649
630
return ( (
650
631
transformedQuery . hasNoTimeDimensionsWithoutGranularity
651
632
) && (
@@ -657,7 +638,7 @@ export class PreAggregations {
657
638
R . equals ( transformedQuery . timeDimensions , refTimeDimensions )
658
639
) && (
659
640
filterDimensionsSingleValueEqual &&
660
- referencesTrimmed . dimensions . length === filterDimensionsSingleValueEqual . size &&
641
+ references . dimensions . length === filterDimensionsSingleValueEqual . size &&
661
642
R . all ( d => filterDimensionsSingleValueEqual . has ( d ) , backAliasDimensions ) ||
662
643
transformedQuery . allFiltersWithinSelectedDimensions &&
663
644
R . equals ( backAliasDimensions , transformedQuery . sortedDimensions )
@@ -705,7 +686,8 @@ export class PreAggregations {
705
686
if ( ! resolvedGranularity ) {
706
687
return [ [ dimension , '*' ] ] ; // Any granularity should fit
707
688
}
708
- return expandGranularity ( dimension , resolvedGranularity )
689
+ const trimmedDim = dimension . split ( '.' ) . slice ( - 2 ) . join ( '.' ) ;
690
+ return expandGranularity ( trimmedDim , resolvedGranularity )
709
691
. map ( ( newGranularity ) => [ dimension , newGranularity ] ) ;
710
692
} ;
711
693
@@ -722,30 +704,36 @@ export class PreAggregations {
722
704
? transformedQuery . ownedTimeDimensionsAsIs . map ( expandTimeDimension )
723
705
: transformedQuery . ownedTimeDimensionsWithRollupGranularity . map ( expandTimeDimension ) ;
724
706
725
- const referencesTrimmed = trimmedReferences ( references ) ;
726
-
727
707
// Even if there are no multiplied measures in the query (because no multiplier dimensions are requested)
728
708
// but the same measures are multiplied in the pre-aggregation, we can't use pre-aggregation
729
709
// for such queries.
730
- if ( referencesTrimmed . multipliedMeasures ) {
731
- const backAliasMultipliedMeasures = backAlias ( referencesTrimmed . multipliedMeasures ) ;
710
+ if ( references . multipliedMeasures ) {
711
+ const backAliasMultipliedMeasures = backAlias ( references . multipliedMeasures ) ;
732
712
733
- if ( transformedQuery . leafMeasures . some ( m => referencesTrimmed . multipliedMeasures ?. includes ( m ) ) ||
713
+ if ( transformedQuery . leafMeasures . some ( m => references . multipliedMeasures ?. includes ( m ) ) ||
734
714
transformedQuery . measures . some ( m => backAliasMultipliedMeasures . includes ( m ) )
735
715
) {
736
716
return false ;
737
717
}
738
718
}
739
719
720
+ // In 'rollupJoin' / 'rollupLambda' pre-aggregations fullName members will be empty, because there are
721
+ // no connections in the joinTree between cubes from different datasources
722
+ const dimsToMatch = references . fullNameDimensions . length > 0 ? references . fullNameDimensions : references . dimensions ;
723
+
740
724
const dimensionsMatch = ( dimensions , doBackAlias ) => R . all (
741
725
d => (
742
726
doBackAlias ?
743
- backAlias ( referencesTrimmed . dimensions ) :
744
- ( referencesTrimmed . dimensions )
727
+ backAlias ( dimsToMatch ) :
728
+ ( dimsToMatch )
745
729
) . indexOf ( d ) !== - 1 ,
746
730
dimensions
747
731
) ;
748
732
733
+ // In 'rollupJoin' / 'rollupLambda' pre-aggregations fullName members will be empty, because there are
734
+ // no connections in the joinTree between cubes from different datasources
735
+ const timeDimsToMatch = references . fullNameTimeDimensions . length > 0 ? references . fullNameTimeDimensions : references . timeDimensions ;
736
+
749
737
const timeDimensionsMatch = ( timeDimensionsList , doBackAlias ) => R . allPass (
750
738
timeDimensionsList . map (
751
739
tds => R . anyPass ( tds . map ( ( td : [ string , string ] ) => {
@@ -758,15 +746,15 @@ export class PreAggregations {
758
746
)
759
747
) (
760
748
doBackAlias ?
761
- backAlias ( sortTimeDimensions ( referencesTrimmed . timeDimensions ) ) :
762
- ( sortTimeDimensions ( referencesTrimmed . timeDimensions ) )
749
+ backAlias ( sortTimeDimensions ( timeDimsToMatch ) ) :
750
+ ( sortTimeDimensions ( timeDimsToMatch ) )
763
751
) ;
764
752
765
753
if ( transformedQuery . ungrouped ) {
766
754
const allReferenceCubes = R . pipe ( R . map ( ( name : string ) => name ?. split ( '.' ) [ 0 ] ) , R . uniq , R . sortBy ( R . identity ) ) ( [
767
- ...referencesTrimmed . measures ,
768
- ...referencesTrimmed . dimensions ,
769
- ...referencesTrimmed . timeDimensions . map ( td => td . dimension ) ,
755
+ ...references . measures . map ( m => CubeSymbols . joinHintFromPath ( m ) . path ) ,
756
+ ...references . dimensions . map ( d => CubeSymbols . joinHintFromPath ( d ) . path ) ,
757
+ ...references . timeDimensions . map ( td => CubeSymbols . joinHintFromPath ( td . dimension ) . path ) ,
770
758
] ) ;
771
759
if (
772
760
! R . equals ( transformedQuery . sortedAllCubeNames , allReferenceCubes ) ||
@@ -778,12 +766,12 @@ export class PreAggregations {
778
766
}
779
767
}
780
768
781
- const backAliasMeasures = backAlias ( referencesTrimmed . measures ) ;
769
+ const backAliasMeasures = backAlias ( references . measures ) ;
782
770
return ( (
783
771
windowGranularityMatches ( references )
784
772
) && (
785
773
R . all (
786
- ( m : string ) => referencesTrimmed . measures . indexOf ( m ) !== - 1 ,
774
+ ( m : string ) => references . measures . indexOf ( m ) !== - 1 ,
787
775
transformedQuery . leafMeasures ,
788
776
) || R . all (
789
777
m => backAliasMeasures . indexOf ( m ) !== - 1 ,
@@ -1036,22 +1024,6 @@ export class PreAggregations {
1036
1024
) ;
1037
1025
}
1038
1026
1039
- private doesQueryAndPreAggJoinTreeMatch ( references : PreAggregationReferences ) : boolean {
1040
- const { query } = this ;
1041
- const preAggTree = references . joinTree || { joins : [ ] } ;
1042
- const preAggEdges = new Set ( preAggTree . joins . map ( ( e : JoinEdge ) => `${ e . from } ->${ e . to } ` ) ) ;
1043
- const queryTree = query . join ;
1044
-
1045
- for ( const edge of queryTree . joins ) {
1046
- const key = `${ edge . from } ->${ edge . to } ` ;
1047
- if ( ! preAggEdges . has ( key ) ) {
1048
- return false ;
1049
- }
1050
- }
1051
-
1052
- return true ;
1053
- }
1054
-
1055
1027
private evaluatedPreAggregationObj (
1056
1028
cube : string ,
1057
1029
preAggregationName : string ,
@@ -1063,8 +1035,7 @@ export class PreAggregations {
1063
1035
preAggregationName,
1064
1036
preAggregation,
1065
1037
cube,
1066
- // There are no connections in the joinTree between cubes from different datasources for 'rollupJoin' pre-aggs
1067
- canUsePreAggregation : canUsePreAggregation ( references ) && ( preAggregation . type === 'rollupJoin' || this . doesQueryAndPreAggJoinTreeMatch ( references ) ) ,
1038
+ canUsePreAggregation : canUsePreAggregation ( references ) ,
1068
1039
references,
1069
1040
preAggregationId : `${ cube } .${ preAggregationName } `
1070
1041
} ;
@@ -1304,7 +1275,16 @@ export class PreAggregations {
1304
1275
const preAggQuery = this . query . preAggregationQueryForSqlEvaluation ( cube , aggregation , { inPreAggEvaluation : true } ) ;
1305
1276
const aggregateMeasures = preAggQuery ?. fullKeyQueryAggregateMeasures ( { hasMultipliedForPreAggregation : true } ) ;
1306
1277
references . multipliedMeasures = aggregateMeasures ?. multipliedMeasures ?. map ( m => m . measure ) ;
1307
- references . joinTree = preAggQuery ?. join ;
1278
+ if ( preAggQuery ) {
1279
+ references . joinTree = preAggQuery . join ;
1280
+ const root = references . joinTree ?. root || '' ;
1281
+ references . fullNameMeasures = references . measures . map ( m => ( m . startsWith ( root ) ? m : `${ root } .${ m } ` ) ) ;
1282
+ references . fullNameDimensions = references . dimensions . map ( d => ( d . startsWith ( root ) ? d : `${ root } .${ d } ` ) ) ;
1283
+ references . fullNameTimeDimensions = references . timeDimensions . map ( d => ( {
1284
+ dimension : ( d . dimension . startsWith ( root ) ? d . dimension : `${ root } .${ d . dimension } ` ) ,
1285
+ granularity : d . granularity ,
1286
+ } ) ) ;
1287
+ }
1308
1288
}
1309
1289
if ( aggregation . type === 'rollupLambda' ) {
1310
1290
if ( references . rollups . length > 0 ) {
0 commit comments