From 208e23d5f18dafc4d5e61ffdf963acf152dbaa82 Mon Sep 17 00:00:00 2001 From: Usman Yasin Date: Thu, 12 Jun 2025 17:30:48 +0200 Subject: [PATCH 1/3] fix: Suggested fix for the issue with Generated SQL tab in playground --- packages/cubejs-client-core/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cubejs-client-core/src/index.ts b/packages/cubejs-client-core/src/index.ts index c2f32bb9cd063..b14540e445e23 100644 --- a/packages/cubejs-client-core/src/index.ts +++ b/packages/cubejs-client-core/src/index.ts @@ -627,7 +627,7 @@ class CubeApi { query, signal: options?.signal }), - (response: any) => (Array.isArray(response) ? response.map((body) => new SqlQuery(body)) : new SqlQuery(response)), + (response: any) => (Array.isArray(response) ? response.map((body) => new SqlQuery(body.sql)) : new SqlQuery(response.sql)), options, callback ); From 76a5b71da81ce5552587036b8f352cdb467b7e40 Mon Sep 17 00:00:00 2001 From: Usman Yasin Date: Fri, 13 Jun 2025 01:36:10 +0200 Subject: [PATCH 2/3] fix: Revised fixed to keep the same semantics --- packages/cubejs-client-core/src/SqlQuery.ts | 8 +++++--- packages/cubejs-client-core/src/index.ts | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/cubejs-client-core/src/SqlQuery.ts b/packages/cubejs-client-core/src/SqlQuery.ts index 2c450d311ca8c..82ed81ba009cb 100644 --- a/packages/cubejs-client-core/src/SqlQuery.ts +++ b/packages/cubejs-client-core/src/SqlQuery.ts @@ -10,15 +10,17 @@ export type SqlData = { rollupMatchResults: any[]; }; +type SqlQueryWrapper = { sql: SqlData }; + export default class SqlQuery { - private readonly sqlQuery: SqlData; + private readonly sqlQuery: SqlQueryWrapper; - public constructor(sqlQuery: SqlData) { + public constructor(sqlQuery: SqlQueryWrapper) { this.sqlQuery = sqlQuery; } public rawQuery(): SqlData { - return this.sqlQuery; + return this.sqlQuery.sql; } public sql(): string { diff --git a/packages/cubejs-client-core/src/index.ts b/packages/cubejs-client-core/src/index.ts index b14540e445e23..c2f32bb9cd063 100644 --- a/packages/cubejs-client-core/src/index.ts +++ b/packages/cubejs-client-core/src/index.ts @@ -627,7 +627,7 @@ class CubeApi { query, signal: options?.signal }), - (response: any) => (Array.isArray(response) ? response.map((body) => new SqlQuery(body.sql)) : new SqlQuery(response.sql)), + (response: any) => (Array.isArray(response) ? response.map((body) => new SqlQuery(body)) : new SqlQuery(response)), options, callback ); From feb9393c2082b2a0458a1166a7413d9c0c9a68b2 Mon Sep 17 00:00:00 2001 From: Usman Yasin Date: Sun, 15 Jun 2025 00:47:09 +0200 Subject: [PATCH 3/3] fix: correct SqlQuery types and add unit tests --- packages/cubejs-client-core/src/SqlQuery.ts | 6 +-- .../cubejs-client-core/test/SqlQuery.test.ts | 53 +++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 packages/cubejs-client-core/test/SqlQuery.test.ts diff --git a/packages/cubejs-client-core/src/SqlQuery.ts b/packages/cubejs-client-core/src/SqlQuery.ts index 82ed81ba009cb..fc63ea67dace9 100644 --- a/packages/cubejs-client-core/src/SqlQuery.ts +++ b/packages/cubejs-client-core/src/SqlQuery.ts @@ -1,16 +1,16 @@ -export type SqlQueryTuple = [string, any[], any]; +export type SqlQueryTuple = [string, any[], any?]; export type SqlData = { aliasNameToMember: Record; cacheKeyQueries: SqlQueryTuple[]; - dataSource: boolean; + dataSource: string; external: boolean; sql: SqlQueryTuple; preAggregations: any[]; rollupMatchResults: any[]; }; -type SqlQueryWrapper = { sql: SqlData }; +export type SqlQueryWrapper = { sql: SqlData }; export default class SqlQuery { private readonly sqlQuery: SqlQueryWrapper; diff --git a/packages/cubejs-client-core/test/SqlQuery.test.ts b/packages/cubejs-client-core/test/SqlQuery.test.ts new file mode 100644 index 0000000000000..306004fff7248 --- /dev/null +++ b/packages/cubejs-client-core/test/SqlQuery.test.ts @@ -0,0 +1,53 @@ +/** + * @license Apache-2.0 + * @copyright Cube Dev, Inc. + * @fileoverview SqlQuery class unit tests. + */ + +/* globals describe,it,expect */ + +import SqlQuery, { SqlQueryTuple, SqlData, SqlQueryWrapper } from '../src/SqlQuery'; + +describe('SqlQuery', () => { + const mockCacheKeyQueriesTuple: SqlQueryTuple = [ + 'SELECT FLOOR((-25200 + EXTRACT(EPOCH FROM NOW())) / 600) as refresh_key', + [], + { + external: false, + renewalThreshold: 60 + } + ]; + + const mockSqlTuple: SqlQueryTuple = [ + 'SELECT count(*) "base_orders__count" FROM base_orders WHERE base_orders.continent = ?', + ['Europe'], + ]; + + const mockSqlData: SqlData = { + aliasNameToMember: { base_orders__count: 'base_orders.count' }, + cacheKeyQueries: [mockCacheKeyQueriesTuple], + dataSource: 'default', + external: false, + sql: mockSqlTuple, + preAggregations: [], + rollupMatchResults: [], + }; + + const mockWrapper: SqlQueryWrapper = { + sql: mockSqlData, + }; + + it('should construct without error', () => { + expect(() => new SqlQuery(mockWrapper)).not.toThrow(); + }); + + it('rawQuery should return the original SqlData', () => { + const query = new SqlQuery(mockWrapper); + expect(query.rawQuery()).toEqual(mockSqlData); + }); + + it('sql should return the first element (SQL string) from the sql tuple', () => { + const query = new SqlQuery(mockWrapper); + expect(query.sql()).toBe('SELECT count(*) "base_orders__count" FROM base_orders WHERE base_orders.continent = ?'); + }); +});