From b73a914fa8c97f2d9310ec495ac7123d5e7c5a9b Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 23 Nov 2023 21:32:47 +0100 Subject: [PATCH] fix(schema-compiler): Partitioned pre-aggregates queried through views always union all partitions, fix #6623 --- .../src/adapter/PreAggregations.js | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js b/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js index 7e45aafd141bb..9a265c29c8101 100644 --- a/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js +++ b/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js @@ -63,6 +63,7 @@ export class PreAggregations { if (foundPreAggregation.preAggregation.type === 'rollupLambda') { preAggregations = foundPreAggregation.referencedPreAggregations; } + return preAggregations.map(preAggregation => { if (this.canPartitionsBeUsed(preAggregation)) { const { dimension, partitionDimension } = this.partitionDimension(preAggregation); @@ -151,17 +152,37 @@ export class PreAggregations { const queryForSqlEvaluation = this.query.preAggregationQueryForSqlEvaluation(cube, preAggregation); const partitionInvalidateKeyQueries = queryForSqlEvaluation.partitionInvalidateKeyQueries && queryForSqlEvaluation.partitionInvalidateKeyQueries(cube, preAggregation); - const matchedTimeDimension = - preAggregation.partitionGranularity && - !this.hasCumulativeMeasures && - this.query.timeDimensions.find( - td => td.dimension === foundPreAggregation.references.timeDimensions[0].dimension && td.dateRange - ); - const filters = preAggregation.partitionGranularity && this.query.filters.filter( - td => td.dimension === foundPreAggregation.references.timeDimensions[0].dimension && - td.isDateOperator() && - td.camelizeOperator === 'inDateRange' // TODO support all date operators - ); + const matchedTimeDimension = preAggregation.partitionGranularity && !this.hasCumulativeMeasures && + this.query.timeDimensions.find(td => { + if (td.dimension === foundPreAggregation.references.timeDimensions[0].dimension && td.dateRange) { + return true; + } + + const parent = this.query.cubeEvaluator.byPathAnyType(td.expressionPath()); + if (parent?.aliasMember === foundPreAggregation.references.timeDimensions[0].dimension && td.dateRange) { + return true; + } + + return false; + }); + + const filters = preAggregation.partitionGranularity && this.query.filters.filter(td => { + // TODO support all date operators + if (td.isDateOperator() && td.camelizeOperator === 'inDateRange') { + if (td.dimension === foundPreAggregation.references.timeDimensions[0].dimension) { + return true; + } + + const parent = this.query.cubeEvaluator.byPathAnyType(td.expressionPath()); + if (parent?.aliasMember === foundPreAggregation.references.timeDimensions[0].dimension && td.dateRange) { + return true; + } + + return false; + } + + return false; + }); const uniqueKeyColumnsDefault = () => null; const uniqueKeyColumns = ({ @@ -557,7 +578,7 @@ export class PreAggregations { R.all(m => backAliasMeasures.indexOf(m) !== -1, transformedQuery.leafMeasures) )); }; - + /** * Wrap granularity string into an array. * @param {string} granularity @@ -565,7 +586,7 @@ export class PreAggregations { */ const expandGranularity = (granularity) => ( transformedQuery.granularityHierarchies[granularity] || - [granularity] + [granularity] ); /** @@ -666,7 +687,7 @@ export class PreAggregations { transformedQuery.leafMeasureAdditive && !transformedQuery.hasMultipliedMeasures ? (r) => canUsePreAggregationLeafMeasureAdditive(r) || - canUsePreAggregationNotAdditive(r) + canUsePreAggregationNotAdditive(r) : canUsePreAggregationNotAdditive; if (refs) {