From ca314a0a3ba1dd48a0f10e68c5d5ed69571ffa00 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Mon, 3 Mar 2025 19:38:42 +0200 Subject: [PATCH 1/2] fix(schema-compiler): Fix ORDER BY clause generation for queries with td with filters --- .../cubejs-schema-compiler/src/adapter/BaseQuery.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index 41cdbf3020517..6c53412570bd1 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -2191,9 +2191,13 @@ export class BaseQuery { let index; - index = this.dimensionsForSelect().findIndex( - d => equalIgnoreCase(d.dimension, id) || equalIgnoreCase(d.expressionName, id) - ); + index = this.dimensionsForSelect() + // Not all time dimensions are used in select list, some are just filters, + // but they exist in this.timeDimensions, so need to filter them out + .filter(d => d.selectColumns()) + .findIndex( + d => equalIgnoreCase(d.dimension, id) || equalIgnoreCase(d.expressionName, id) + ); if (index > -1) { return index + 1; From 442d55cea9294e76dac764b32f689e09fec8e120 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Mon, 3 Mar 2025 19:38:50 +0200 Subject: [PATCH 2/2] add tests --- .../test/unit/base-query.test.ts | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/packages/cubejs-schema-compiler/test/unit/base-query.test.ts b/packages/cubejs-schema-compiler/test/unit/base-query.test.ts index 6a4752d600765..b1c2c27ccb0a5 100644 --- a/packages/cubejs-schema-compiler/test/unit/base-query.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/base-query.test.ts @@ -5,6 +5,7 @@ import { createCubeSchema, createCubeSchemaWithCustomGranularities, createCubeSchemaYaml, + createECommerceSchema, createJoinedCubesSchema, createSchemaYaml, createSchemaYamlForGroupFilterParamsTests @@ -360,6 +361,62 @@ describe('SQL Generation', () => { const expectedParams = ['type_value', 'not_type_value', '3']; expect(queryAndParams[1]).toEqual(expectedParams); }); + + it('Simple query - order by for query with filtered timeDimension', async () => { + const compilersLocal = prepareYamlCompiler( + createSchemaYaml(createECommerceSchema()) + ); + + await compilersLocal.compiler.compile(); + + let query = new PostgresQuery(compilersLocal, { + measures: [ + 'orders.count' + ], + timeDimensions: [ + { + dimension: 'orders.updated_at', + granularity: 'week' + }, + { + dimension: 'orders.created_at', + dateRange: [ + '2016-01-01', + '2018-01-01' + ] + }, + ], + order: [{ id: 'orders.updated_at', desc: false }], + }); + + let queryAndParams = query.buildSqlAndParams(); + expect(queryAndParams[0].includes('ORDER BY 1')).toBeTruthy(); + + // The order of time dimensions should have no effect on the `ORDER BY` clause + + query = new PostgresQuery(compilersLocal, { + measures: [ + 'orders.count' + ], + timeDimensions: [ + { + dimension: 'orders.created_at', + dateRange: [ + '2016-01-01', + '2018-01-01' + ] + }, + { + dimension: 'orders.updated_at', + granularity: 'week' + } + ], + order: [{ id: 'orders.updated_at', desc: false }], + }); + + queryAndParams = query.buildSqlAndParams(); + expect(queryAndParams[0].includes('ORDER BY 1')).toBeTruthy(); + }); }); describe('Custom granularities', () => {