From ca51a465e9f9c8ed3e818d122ea9cd6f88718b07 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Thu, 24 Apr 2025 20:36:14 +0200 Subject: [PATCH] [DEBUG] pre-aggregation with custom granularities --- .../src/adapter/PreAggregations.js | 29 +++++++++++++--- .../postgres/custom-granularities.test.ts | 34 +++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js b/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js index 60f0a459e8f25..458104fcdbe65 100644 --- a/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js +++ b/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js @@ -403,6 +403,11 @@ export class PreAggregations { filterDimensionsSingleValueEqual = allValuesEq1(filterDimensionsSingleValueEqual) ? new Set(filterDimensionsSingleValueEqual?.keys()) : null; + + console.log('transformQueryToCanUseForm query.timeDimensions', query.timeDimensions); + console.log('transformQueryToCanUseForm ownedTimeDimensions', ownedTimeDimensions); + console.log('transformQueryToCanUseForm timeDimensions', timeDimensions); + return { sortedDimensions, sortedTimeDimensions, @@ -575,12 +580,20 @@ export class PreAggregations { // TODO remove this in favor of matching with join path const referencesTrimmed = trimmedReferences(references); + console.log('canUsePreAggregationNotAdditive transformedQuery.timeDimensions', transformedQuery.timeDimensions); + + const refTimeDimensions = backAlias(sortTimeDimensions(referencesTrimmed.timeDimensions)); const qryTimeDimensions = references.allowNonStrictDateRangeMatch ? transformedQuery.timeDimensions : transformedQuery.sortedTimeDimensions; const backAliasMeasures = backAlias(referencesTrimmed.measures); const backAliasDimensions = backAlias(referencesTrimmed.dimensions); + + console.log('canUsePreAggregationNotAdditive qryTimeDimensions', qryTimeDimensions); + console.log('canUsePreAggregationNotAdditive refTimeDimensions', refTimeDimensions); + console.log('canUsePreAggregationNotAdditive TD equals', R.equals(qryTimeDimensions, refTimeDimensions)); + return (( transformedQuery.hasNoTimeDimensionsWithoutGranularity ) && ( @@ -609,10 +622,18 @@ export class PreAggregations { * @param {string} granularity Granularity * @returns {Array} */ - const expandGranularity = (dimension, granularity) => ( - transformedQuery.granularityHierarchies[`${dimension}.${granularity}`] || - [granularity] - ); + const expandGranularity = (dimension, granularity) => { + console.log("expandGranularity dimension", dimension); + console.log("expandGranularity granularity", granularity); + console.log("expandGranularity granularityHierarchies", transformedQuery.granularityHierarchies[ + `${dimension}.${granularity}` + ]); + return ( + transformedQuery.granularityHierarchies[ + `${dimension}.${granularity}` + ] || [granularity] + ); + }; /** * Determine whether time dimensions match to the window granularity or not. diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/custom-granularities.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/custom-granularities.test.ts index 000d8482df0d2..9ce8adb3ff5d6 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/custom-granularities.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/custom-granularities.test.ts @@ -81,6 +81,11 @@ describe('Custom Granularities', () => { type: count rolling_window: trailing: unbounded + pre_aggregations: + - name: half_year_preagg + timeDimension: createdAt + granularity: half_year +# granularity: quarter views: - name: orders_view @@ -984,4 +989,33 @@ describe('Custom Granularities', () => { ], { joinGraph, cubeEvaluator, compiler } )); + + it('pre-aggregation with custom granularity should match its own references', async () => { + await compiler.compile(); + + const preAggregationId = 'orders.half_year_preagg'; + const preAggregations = cubeEvaluator.preAggregations({}); + console.log('preAggregations', preAggregations); + + const preAggregation = preAggregations + .find(p => p.id === preAggregationId); + if (preAggregation === undefined) { + throw expect(preAggregation).toBeDefined(); + } + + console.log('references', preAggregation.references); + + const query = dbRunner.newTestQuery({ joinGraph, cubeEvaluator, compiler }, { + ...preAggregation.references, + preAggregationId: preAggregation.id, + }); + + const preAggregationsDescription: any = query.preAggregations?.preAggregationsDescription(); + const preAggregationFromQuery = preAggregationsDescription.find(p => p.preAggregationId === preAggregation.id); + if (preAggregationFromQuery === undefined) { + throw expect(preAggregationFromQuery).toBeDefined(); + } + + expect(preAggregationFromQuery.preAggregationId).toBe(preAggregationId); + }); });