Skip to content

Commit 6cae9b5

Browse files
authored
feat(firebolt-driver): Timezones support (#6458)
* firebolt timestamp support * lint * add test
1 parent b0ed0cc commit 6cae9b5

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

packages/cubejs-firebolt-driver/src/FireboltQuery.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,22 @@ export class FireboltQuery extends BaseQuery {
2525
public paramAllocator!: ParamAllocator;
2626

2727
public convertTz(field: string) {
28-
return field;
28+
return `${field} AT TIME ZONE '${this.timezone}'`;
2929
}
3030

3131
public timeStampCast(value: string) {
32-
return `${value}::timestamp`;
32+
return `${value}::timestamptz`;
33+
}
34+
35+
public dateTimeCast(value: string) {
36+
return `${value}::timestampntz`;
37+
}
38+
39+
public seriesSql(timeDimension: any) {
40+
const values = timeDimension.timeSeries().map(
41+
([from, to]: [string, string]) => `select '${from}' f, '${to}' t`
42+
).join(' UNION ALL ');
43+
return `SELECT ${this.dateTimeCast('dates.f')} date_from, ${this.dateTimeCast('dates.t')} date_to FROM (${values}) AS dates`;
3344
}
3445

3546
public timeGroupedColumn(granularity: string, dimension: string) {

packages/cubejs-firebolt-driver/test/FireboltQuery.test.ts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ cube(\`sales\`, {
5959
const queryAndParams = query.buildSqlAndParams();
6060

6161
expect(queryAndParams[0]).toContain(
62-
'DATE_TRUNC(\'DAY\', "sales".sales_datetime)'
62+
'DATE_TRUNC(\'DAY\', "sales".sales_datetime AT TIME ZONE \'America/Los_Angeles\')'
6363
);
6464
}));
6565

@@ -81,9 +81,39 @@ cube(\`sales\`, {
8181
const queryAndParams = query.buildSqlAndParams();
8282

8383
expect(queryAndParams[0]).toContain(
84-
'("sales".is_shiped = CAST(? AS BOOL))'
84+
'("sales".is_shiped = CAST(? AS BOOLEAN))'
8585
);
8686

8787
expect(queryAndParams[1]).toEqual(["true"]);
8888
}))
89+
it("should cast timestamp", () =>
90+
compiler.compile().then(() => {
91+
const query = new FireboltQuery(
92+
{ joinGraph, cubeEvaluator, compiler },
93+
{
94+
measures: ["sales.count"],
95+
timeDimensions: [
96+
{
97+
dimension: "sales.salesDatetime",
98+
granularity: "day",
99+
dateRange: ["2017-01-01", "2017-01-02"],
100+
},
101+
],
102+
timezone: "America/Los_Angeles",
103+
order: [
104+
{
105+
id: "sales.salesDatetime",
106+
},
107+
],
108+
}
109+
);
110+
111+
const queryAndParams = query.buildSqlAndParams();
112+
113+
expect(queryAndParams[0]).toContain(
114+
'("sales".sales_datetime >= ?::timestamptz AND "sales".sales_datetime <= ?::timestamptz)'
115+
);
116+
}));
117+
118+
89119
})

0 commit comments

Comments
 (0)