From 481ae12baf77ec6c3276aabffdf12f825ca6ade1 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Fri, 23 May 2025 14:02:57 +0300 Subject: [PATCH 1/4] typings and linter fixes --- .../cubejs-schema-compiler/src/adapter/BaseFilter.ts | 4 ++-- .../src/adapter/BaseTimeDimension.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts b/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts index 71a59d3ae4f08..f656b3249affd 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts +++ b/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts @@ -389,7 +389,7 @@ export class BaseFilter extends BaseDimension { return this.query.afterOrOnDateFilter(column, after); } - public formatFromDate(date: string) { + public formatFromDate(date: string): string { if (date) { if (this.query.timestampPrecision() === 3) { if (date.match(dateTimeLocalMsRegex)) { @@ -425,7 +425,7 @@ export class BaseFilter extends BaseDimension { return this.query.inDbTimeZone(this.formatFromDate(date)); } - public formatToDate(date: string) { + public formatToDate(date: string): string { if (date) { if (this.query.timestampPrecision() === 3) { if (date.match(dateTimeLocalMsRegex)) { diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts b/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts index 827396f4197c0..e0e1b1c000446 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts +++ b/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts @@ -13,7 +13,7 @@ import { DimensionDefinition, SegmentDefinition } from '../compiler/CubeEvaluato import { Granularity } from './Granularity'; export class BaseTimeDimension extends BaseFilter { - public readonly dateRange: any; + public readonly dateRange: [string, string]; public readonly granularityObj: Granularity | undefined; @@ -74,7 +74,7 @@ export class BaseTimeDimension extends BaseFilter { const actualGranularity = granularity || this.granularityObj?.granularity || 'day'; const fullName = `${this.dimension}.${actualGranularity}`; - if (this.query.options.memberToAlias && this.query.options.memberToAlias[fullName]) { + if (this.query.options.memberToAlias?.[fullName]) { return this.query.options.memberToAlias[fullName]; } @@ -110,7 +110,7 @@ export class BaseTimeDimension extends BaseFilter { granularity: granularityName }) : this.granularityObj; - if ((context.renderedReference || {})[path]) { + if (context.renderedReference?.[path]) { return context.renderedReference[path]; } @@ -158,7 +158,7 @@ export class BaseTimeDimension extends BaseFilter { return super.filterParams(); } - protected dateFromFormattedValue: any | null = null; + protected dateFromFormattedValue: string | null = null; public dateFromFormatted() { if (!this.dateFromFormattedValue) { @@ -192,7 +192,7 @@ export class BaseTimeDimension extends BaseFilter { return this.query.dateTimeCast(this.query.paramAllocator.allocateParam(this.dateRange ? this.dateFromFormatted() : BUILD_RANGE_START_LOCAL)); } - protected dateToFormattedValue: any | null = null; + protected dateToFormattedValue: string | null = null; public dateToFormatted() { if (!this.dateToFormattedValue) { From 8e108bf0344a40c0896a6773010485f56841aa88 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Fri, 23 May 2025 14:04:24 +0300 Subject: [PATCH 2/4] fix(schema-compiler): exclude time dimension w/o granularities from select list in base queries --- .../src/adapter/BaseTimeDimension.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts b/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts index e0e1b1c000446..0cdf2557f1515 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts +++ b/packages/cubejs-schema-compiler/src/adapter/BaseTimeDimension.ts @@ -44,8 +44,7 @@ export class BaseTimeDimension extends BaseFilter { } public selectColumns() { - const context = this.query.safeEvaluateSymbolContext(); - if (!context.granularityOverride && !this.granularityObj) { + if (!this.granularityObj) { return null; } @@ -53,8 +52,7 @@ export class BaseTimeDimension extends BaseFilter { } public hasNoRemapping() { - const context = this.query.safeEvaluateSymbolContext(); - if (!context.granularityOverride && !this.granularityObj) { + if (!this.granularityObj) { return false; } @@ -62,8 +60,7 @@ export class BaseTimeDimension extends BaseFilter { } public aliasName() { - const context = this.query.safeEvaluateSymbolContext(); - if (!context.granularityOverride && !this.granularityObj) { + if (!this.granularityObj) { return null; } From a2a4e3eb939c9b5024df2dfc4af42337ba4dbf6b Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Fri, 23 May 2025 16:32:09 +0300 Subject: [PATCH 3/4] some tests refactoring --- .../integration/postgres/multi-stage.test.ts | 64 +++++++++---------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/multi-stage.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/multi-stage.test.ts index 0b0107f127068..517ceab8df228 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/multi-stage.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/multi-stage.test.ts @@ -1,7 +1,6 @@ import { getEnv, } from '@cubejs-backend/shared'; -import { PostgresQuery } from '../../../src/adapter/PostgresQuery'; import { prepareYamlCompiler } from '../../unit/PrepareCompiler'; import { dbRunner } from './PostgresDBRunner'; @@ -189,38 +188,37 @@ views: `); - async function runQueryTest(q, expectedResult) { - if (!getEnv('nativeSqlPlanner')) { - return; - } - await compiler.compile(); - const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, q); - - console.log(query.buildSqlAndParams()); - - const res = await dbRunner.testQuery(query.buildSqlAndParams()); - console.log(JSON.stringify(res)); - - expect(res).toEqual( - expectedResult - ); - } - - it('multi stage over sub query', async () => runQueryTest({ - measures: ['orders.revenue', 'orders.revenue_1_y_ago', 'orders.cagr_1_y'], - timeDimensions: [ - { - dimension: 'orders.date', - granularity: 'year' - } - ], - timezone: 'UTC' - }, [ - - { orders__date_year: '2023-01-01T00:00:00.000Z', + if (getEnv('nativeSqlPlanner')) { + it('multi stage over sub query', async () => dbRunner.runQueryTest({ + measures: ['orders.revenue', 'orders.revenue_1_y_ago', 'orders.cagr_1_y'], + timeDimensions: [ + { + dimension: 'orders.date', + granularity: 'year' + } + ], + timezone: 'UTC' + }, [{ + orders__date_year: '2023-01-01T00:00:00.000Z', orders__revenue: '15', orders__revenue_1_y_ago: '5', - orders__cagr_1_y: '2.0000000000000000' }, - { orders__date_year: '2024-01-01T00:00:00.000Z', orders__revenue: '30', orders__revenue_1_y_ago: '15', orders__cagr_1_y: '1.0000000000000000' }, - { orders__date_year: '2025-01-01T00:00:00.000Z', orders__revenue: '5', orders__revenue_1_y_ago: '30', orders__cagr_1_y: '-0.83333333333333333333' }])); + orders__cagr_1_y: '2.0000000000000000' + }, + { + orders__date_year: '2024-01-01T00:00:00.000Z', + orders__revenue: '30', + orders__revenue_1_y_ago: '15', + orders__cagr_1_y: '1.0000000000000000' + }, + { + orders__date_year: '2025-01-01T00:00:00.000Z', + orders__revenue: '5', + orders__revenue_1_y_ago: '30', + orders__cagr_1_y: '-0.83333333333333333333' + }], + { joinGraph, cubeEvaluator, compiler })); + } else { + // This test is working only in tesseract + test.skip('multi stage over sub query', () => { expect(1).toBe(1); }); + } }); From c886fcb1488ddef2b66bd3b52d3091e76be7e238 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Fri, 23 May 2025 16:36:28 +0300 Subject: [PATCH 4/4] add tests --- .../postgres/sql-generation.test.ts | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts index 326b294ca0a93..0a70b0b94817b 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts @@ -1192,6 +1192,66 @@ SELECT 1 AS revenue, cast('2024-01-01' AS timestamp) as time UNION ALL } ])); + it('rolling window with same td with and without granularity', async () => runQueryTest({ + measures: [ + 'visitors.countRollingWeekToDate' + ], + timeDimensions: [ + { + dimension: 'visitors.created_at', + granularity: 'day', + dateRange: ['2017-01-01', '2017-01-10'] + }, + { + dimension: 'visitors.created_at', + dateRange: ['2017-01-01', '2017-01-10'] + } + ], + order: [{ + id: 'visitors.created_at' + }], + timezone: 'America/Los_Angeles' + }, [{ + visitors__count_rolling_week_to_date: null, + visitors__created_at_day: '2017-01-01T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: '1', + visitors__created_at_day: '2017-01-02T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: '1', + visitors__created_at_day: '2017-01-03T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: '2', + visitors__created_at_day: '2017-01-04T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: '3', + visitors__created_at_day: '2017-01-05T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: '5', + visitors__created_at_day: '2017-01-06T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: '5', + visitors__created_at_day: '2017-01-07T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: '5', + visitors__created_at_day: '2017-01-08T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: null, + visitors__created_at_day: '2017-01-09T00:00:00.000Z', + }, + { + visitors__count_rolling_week_to_date: null, + visitors__created_at_day: '2017-01-10T00:00:00.000Z', + }])); + it('two rolling windows with two time dimension granularities', async () => runQueryTest({ measures: [ 'visitors.countRollingUnbounded',