From e143b70d68b18ad7d982f4596cbdd7912acdab18 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Tue, 6 May 2025 19:47:36 +0300 Subject: [PATCH 1/2] fix(schema-compiler): Fix filtering by time measure --- .../cubejs-schema-compiler/src/adapter/BaseFilter.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts b/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts index 639eeb5f368a7..5b532076b6467 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts +++ b/packages/cubejs-schema-compiler/src/adapter/BaseFilter.ts @@ -90,6 +90,17 @@ export class BaseFilter extends BaseDimension { } } + /** + * BaseFilter inherits from BaseDimension while Filter may be measure-based !! + */ + public override dateFieldType() { + if (this.measure) { + return this.measureDefinition().type; // There is no fieldType in measure, but it seems that it's enough + } else { + return this.dimensionDefinition().fieldType; + } + } + public cube() { return this.query.cubeEvaluator.cubeFromPath(this.measure || this.dimension); } From 8069c965f9edb6589670a7d0a275945150dda287 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Tue, 6 May 2025 20:03:48 +0300 Subject: [PATCH 2/2] tests --- .../postgres/sql-generation.test.ts | 43 +++++++++++++++++++ 1 file changed, 43 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 76f159e5b8856..fbae49c4ec865 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 @@ -231,6 +231,10 @@ describe('SQL Generation', () => { sql: \`\${revenue}\`, type: 'sum', group_by: [id] + }, + min_created_at: { + type: 'time', + sql: 'MIN(created_at)' } }, @@ -1560,6 +1564,45 @@ SELECT 1 AS revenue, cast('2024-01-01' AS timestamp) as time UNION ALL }); }); + it('having filter (time measure)', async () => { + await compiler.compile(); + + const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { + measures: [ + 'visitors.min_created_at' + ], + dimensions: [ + 'visitors.source' + ], + timeDimensions: [], + timezone: 'America/Los_Angeles', + filters: [{ + dimension: 'visitors.min_created_at', + operator: 'inDateRange', + values: ['2017-01-01', '2018-01-01'] + }], + order: [{ + id: 'visitors.source' + }] + }); + + console.log(query.buildSqlAndParams()); + + return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { + console.log(JSON.stringify(res)); + expect(res).toEqual([ + { + visitors__min_created_at: '2017-01-06T00:00:00.000Z', + visitors__source: 'google', + }, + { + visitors__min_created_at: '2017-01-03T00:00:00.000Z', + visitors__source: 'some', + }, + ]); + }); + }); + it('having filter without measure', async () => { await compiler.compile();