diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts b/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts index 7f8869bc4968a..69c7a4ffa2ace 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts +++ b/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts @@ -273,7 +273,7 @@ export class BaseTimeDimension extends BaseFilter { } public resolvedGranularity() { - return this.granularityObj ? this.granularityObj.resolvedGranularity() : this.dateRangeGranularity(); + return this.granularityObj ? this.granularityObj.resolvedGranularity() : null; } public wildcardRange() { diff --git a/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js b/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js index cd2b1c2015f22..c23cfd418fb0b 100644 --- a/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js +++ b/packages/cubejs-schema-compiler/src/adapter/PreAggregations.js @@ -604,6 +604,9 @@ export class PreAggregations { */ const expandTimeDimension = (timeDimension) => { const [dimension, resolvedGranularity] = timeDimension; + if (!resolvedGranularity) { + return [[dimension, '*']]; // Any granularity should fit + } return expandGranularity(dimension, resolvedGranularity) .map((newGranularity) => [dimension, newGranularity]); }; @@ -638,7 +641,13 @@ export class PreAggregations { const timeDimensionsMatch = (timeDimensionsList, doBackAlias) => R.allPass( timeDimensionsList.map( - tds => R.anyPass(tds.map(td => R.contains(td))) + tds => R.anyPass(tds.map(td => { + if (td[1] === '*') { + return R.any(tdtc => tdtc[0] === td[0]); // need to match the dimension at least + } else { + return R.contains(td); + } + })) ) )( doBackAlias ? diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/pre-agg-allow-non-strict.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/pre-agg-allow-non-strict.test.ts index dee82a3d3b875..0a19233ab49cc 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/pre-agg-allow-non-strict.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/pre-agg-allow-non-strict.test.ts @@ -195,6 +195,16 @@ const getQueries = (compiler, joinGraph, cubeEvaluator) => ([ }], timezone: 'America/Los_Angeles', }), + // no granularity + new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { + measures: ['cube.totalQuantity', 'cube.totalProfit'], + dimensions: ['cube.city'], + timeDimensions: [{ + dimension: 'cube.orderDate', + dateRange: ['2020-01-01 00:00:00.000', '2020-03-30 22:50:50.999'], + }], + timezone: 'America/Los_Angeles', + }), ]); describe( @@ -259,6 +269,15 @@ describe( expect(query.indexOf('cube__daily_data')).toEqual(-1); expect(query.indexOf('cube__hourly_data')).toEqual(-1); }); + + it('query with no granularity match MonthlyData', async () => { + await compiler.compile(); + const [,,,,,, request] = getQueries(compiler, joinGraph, cubeEvaluator); + const [query] = request.buildSqlAndParams(); + expect(query.indexOf('cube__monthly_data')).toBeGreaterThanOrEqual(0); + expect(query.indexOf('cube__daily_data')).toEqual(-1); + expect(query.indexOf('cube__hourly_data')).toEqual(-1); + }); }); describe('The `DailyData` pre-aggregation with the `allowNonStrictDateRangeMatch` enabled', () => { @@ -320,6 +339,15 @@ describe( expect(query.indexOf('cube__daily_data')).toBeGreaterThanOrEqual(0); expect(query.indexOf('cube__hourly_data')).toEqual(-1); }); + + it('query with no granularity match MonthlyData', async () => { + await compiler.compile(); + const [,,,,,, request] = getQueries(compiler, joinGraph, cubeEvaluator); + const [query] = request.buildSqlAndParams(); + expect(query.indexOf('cube__monthly_data')).toEqual(-1); + expect(query.indexOf('cube__daily_data')).toBeGreaterThanOrEqual(0); + expect(query.indexOf('cube__hourly_data')).toEqual(-1); + }); }); describe('The `HourlyData` pre-aggregation with the `allowNonStrictDateRangeMatch` enabled', () => { @@ -381,6 +409,15 @@ describe( expect(query.indexOf('cube__daily_data')).toEqual(-1); expect(query.indexOf('cube__hourly_data')).toBeGreaterThanOrEqual(0); }); + + it('query with no granularity match HourlyData', async () => { + await compiler.compile(); + const [,,,,,, request] = getQueries(compiler, joinGraph, cubeEvaluator); + const [query] = request.buildSqlAndParams(); + expect(query.indexOf('cube__monthly_data')).toEqual(-1); + expect(query.indexOf('cube__daily_data')).toEqual(-1); + expect(query.indexOf('cube__hourly_data')).toBeGreaterThanOrEqual(0); + }); }); describe('`MonthlyData` and `DailyData` pre-aggregations with the `allowNonStrictDateRangeMatch` enabled', () => {