Skip to content

Commit 0dc8320

Browse files
authored
fix(schema-compiler): Fix doubled calls to convertTz() for compound time dimensions with custom granularities (#9369)
1 parent beaf8eb commit 0dc8320

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2639,6 +2639,9 @@ export class BaseQuery {
26392639
dimension: this.cubeEvaluator.pathFromArray([cubeName, name]),
26402640
granularity: subPropertyName
26412641
});
2642+
// for time dimension with granularity convertedToTz() is called internally in dimensionSql() flow,
2643+
// so we need to ignore convertTz later even if context convertTzForRawTimeDimension is set to true
2644+
this.safeEvaluateSymbolContext().ignoreConvertTzForTimeDimension = true;
26422645
return td.dimensionSql();
26432646
} else {
26442647
let res = this.autoPrefixAndEvaluateSql(cubeName, symbol.sql, isMemberExpr);
@@ -2647,6 +2650,7 @@ export class BaseQuery {
26472650
res = `(${this.addTimestampInterval(res, symbol.shiftInterval)})`;
26482651
}
26492652
if (this.safeEvaluateSymbolContext().convertTzForRawTimeDimension &&
2653+
!this.safeEvaluateSymbolContext().ignoreConvertTzForTimeDimension &&
26502654
!memberExpressionType &&
26512655
symbol.type === 'time' &&
26522656
this.cubeEvaluator.byPathAnyType(memberPathArray).ownedByCube

packages/cubejs-schema-compiler/test/unit/postgres-query.test.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,21 @@ describe('PostgresQuery', () => {
2525
dimensions: {
2626
createdAt: {
2727
type: 'time',
28-
sql: 'created_at'
28+
sql: 'created_at',
29+
granularities: {
30+
fiscal_year: {
31+
interval: '1 year',
32+
offset: '1 month',
33+
},
34+
fiscal_quarter: {
35+
interval: '1 quarter',
36+
offset: '1 month',
37+
},
38+
}
39+
},
40+
fiscalCreatedAtLabel: {
41+
type: 'string',
42+
sql: \`'FY' || (EXTRACT(YEAR FROM \${createdAt.fiscal_year}) + 1) || ' Q' || (EXTRACT(QUARTER FROM \${createdAt.fiscal_quarter}))\`
2943
},
3044
name: {
3145
type: 'string',
@@ -36,7 +50,7 @@ describe('PostgresQuery', () => {
3650
3751
cube(\`Deals\`, {
3852
sql: \`select * from deals\`,
39-
53+
4054
measures: {
4155
amount: {
4256
sql: \`amount\`,
@@ -52,31 +66,31 @@ describe('PostgresQuery', () => {
5266
}
5367
}
5468
})
55-
69+
5670
cube(\`SalesManagers\`, {
5771
sql: \`select * from sales_managers\`,
58-
72+
5973
joins: {
6074
Deals: {
6175
relationship: \`hasMany\`,
6276
sql: \`\${SalesManagers}.id = \${Deals}.sales_manager_id\`
6377
}
6478
},
65-
79+
6680
measures: {
6781
averageDealAmount: {
6882
sql: \`\${dealsAmount}\`,
6983
type: \`avg\`
7084
}
7185
},
72-
86+
7387
dimensions: {
7488
id: {
7589
sql: \`id\`,
7690
type: \`string\`,
7791
primaryKey: true
7892
},
79-
93+
8094
dealsAmount: {
8195
sql: \`\${Deals.amount}\`,
8296
type: \`number\`,
@@ -114,4 +128,18 @@ describe('PostgresQuery', () => {
114128
expect(queryAndParams[0]).toContain(expected);
115129
}
116130
});
131+
132+
it('test compound time dimension with custom granularity', async () => {
133+
await compiler.compile();
134+
135+
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {
136+
dimensions: [
137+
'visitors.fiscalCreatedAtLabel'
138+
],
139+
timezone: 'America/Los_Angeles'
140+
});
141+
142+
const queryAndParams = query.buildSqlAndParams();
143+
expect(queryAndParams[0].split('AT TIME ZONE \'America/Los_Angeles\'').length).toEqual(3);
144+
});
117145
});

0 commit comments

Comments
 (0)