Skip to content

Commit 70df903

Browse files
authored
fix(trino-driver): Timezone issue fix (#5731) Thanks @yuraborue !
* fix: trino timezone issue fix * lint fixes * one more fix
1 parent 8e89427 commit 70df903

File tree

12 files changed

+179
-9
lines changed

12 files changed

+179
-9
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export class PrestodbQuery extends BaseQuery {
5151
convertTz(field) {
5252
const atTimezone = `${field} AT TIME ZONE '${this.timezone}'`;
5353
return this.timezone ?
54-
`CAST(date_add('minute', timezone_minute(${atTimezone}), date_add('hour', timezone_hour(${atTimezone}), ${atTimezone})) AS TIMESTAMP)` :
54+
`CAST(date_add('minute', timezone_minute(${atTimezone}), date_add('hour', timezone_hour(${atTimezone}), ${field})) AS TIMESTAMP)` :
5555
field;
5656
}
5757

packages/cubejs-testing-shared/src/db/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ export * from './materialize';
66
export * from './crate';
77
export * from './prestodb';
88
export * from './mssql';
9+
export * from './trino';

packages/cubejs-testing-shared/src/db/prestodb.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export class PrestoDbRunner extends DbRunnerAbstract {
1212

1313
const container = new GenericContainer(`ahanaio/prestodb-sandbox:${version}`)
1414
.withExposedPorts(8080)
15-
.withWaitStrategy(Wait.forLogMessage("======== SERVER STARTED ========"))
15+
.withWaitStrategy(Wait.forLogMessage('======== SERVER STARTED ========'))
1616
.withStartupTimeout(30 * 1000);
1717

1818
if (options.volumes) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { GenericContainer, Wait } from 'testcontainers';
2+
3+
import { DbRunnerAbstract, DBRunnerContainerOptions } from './db-runner.abstract';
4+
5+
type TrinoStartOptions = DBRunnerContainerOptions & {
6+
version?: string,
7+
};
8+
9+
export class TrinoDBRunner extends DbRunnerAbstract {
10+
public static startContainer(options: TrinoStartOptions) {
11+
const version = process.env.TEST_TRINO_VERSION || options.version || '403';
12+
13+
const container = new GenericContainer(`trinodb/trino:${version}`)
14+
.withExposedPorts(8080)
15+
.withWaitStrategy(Wait.forLogMessage('======== SERVER STARTED ========'))
16+
.withStartupTimeout(30 * 1000);
17+
18+
if (options.volumes) {
19+
// eslint-disable-next-line no-restricted-syntax
20+
for (const { source, target, bindMode } of options.volumes) {
21+
container.withBindMount(source, target, bindMode);
22+
}
23+
}
24+
25+
return container.start();
26+
}
27+
}

packages/cubejs-testing/birdbox-fixtures/presto/schema/Orders.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
cube('Orders', {
22
sql: `
3-
select 1 as id, 100 as amount, 'new' status
3+
select 1 as id, 100 as amount, 'new' status, TIMESTAMP '2022-12-05 06:00:00' created_at
44
UNION ALL
5-
select 2 as id, 200 as amount, 'new' status
5+
select 2 as id, 200 as amount, 'new' status, TIMESTAMP '2022-12-05 06:15:00' created_at
66
UNION ALL
7-
select 3 as id, 300 as amount, 'processed' status
7+
select 3 as id, 300 as amount, 'processed' status, TIMESTAMP '2022-12-05 08:00:00' created_at
88
UNION ALL
9-
select 4 as id, 500 as amount, 'processed' status
9+
select 4 as id, 500 as amount, 'processed' status, TIMESTAMP '2022-12-05 09:00:00' created_at
1010
UNION ALL
11-
select 5 as id, 600 as amount, 'shipped' status
11+
select 5 as id, 600 as amount, 'shipped' status, TIMESTAMP '2022-12-05 10:00:00' created_at
1212
UNION ALL
13-
select 6 as id, 700 as amount, 'cancelled_by_customer' status
13+
select 6 as id, 700 as amount, 'cancelled_by_customer' status, TIMESTAMP '2022-12-05 11:00:00' created_at
1414
`,
1515
measures: {
1616
count: {
@@ -26,6 +26,10 @@ cube('Orders', {
2626
sql: 'status',
2727
type: 'string',
2828
},
29+
createdAt: {
30+
sql: 'created_at',
31+
type: 'time',
32+
},
2933
},
3034
preAggregations: {
3135
orderStatus: {

packages/cubejs-testing/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@
7171
"smoke:cubesql:snapshot": "jest --verbose --forceExit --updateSnapshot -i dist/test/smoke-cubesql.test.js",
7272
"smoke:prestodb": "jest --verbose -i dist/test/smoke-prestodb.test.js",
7373
"smoke:prestodb:snapshot": "jest --verbose --forceExit --updateSnapshot -i dist/test/smoke-prestodb.test.js",
74+
"smoke:trino": "jest --verbose -i dist/test/smoke-trino.test.js",
75+
"smoke:trino:snapshot": "jest --verbose --forceExit --updateSnapshot -i dist/test/smoke-trino.test.js",
7476
"smoke:mssql": "jest --verbose -i dist/test/smoke-mssql.test.js",
7577
"smoke:mssql:snapshot": "jest --verbose --forceExit --updateSnapshot -i dist/test/smoke-mssql.test.js"
7678
},

packages/cubejs-testing/src/REQUIRED_ENV_VARS.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,6 @@ export const REQUIRED_ENV_VARS: {[key: string]: string[]} = {
4545
'CUBEJS_DB_EXPORT_BUCKET_AWS_REGION',
4646
],
4747
prestodb: [],
48+
trino: [],
4849
mssql: [],
4950
};

packages/cubejs-testing/src/birdbox.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ interface Args {
4848
log: Log,
4949
}
5050

51-
export type DriverType = 'postgresql' | 'postgres' | 'multidb' | 'materialize' | 'crate' | 'bigquery' | 'athena' | 'postgresql-cubestore' | 'firebolt' | 'questdb' | 'redshift' | 'databricks-jdbc' | 'prestodb' | 'mssql';
51+
export type DriverType = 'postgresql' | 'postgres' | 'multidb' | 'materialize' | 'crate' | 'bigquery' | 'athena' | 'postgresql-cubestore' | 'firebolt' | 'questdb' | 'redshift' | 'databricks-jdbc' | 'prestodb' | 'mssql' | 'trino';
5252

5353
export type Schemas = string[];
5454

@@ -105,6 +105,7 @@ const driverNameToFolderNameMapper: Record<DriverType, string> = {
105105
'databricks-jdbc': 'databricks-jdbc',
106106
prestodb: 'postgresql',
107107
mssql: 'mssql',
108+
trino: 'postgresql'
108109
};
109110

110111
/**

packages/cubejs-testing/test/__snapshots__/smoke-prestodb.test.ts.snap

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,36 @@ Array [
2929
]
3030
`;
3131

32+
exports[`prestodb query measure grouped by time dimension with timezone: measure-group-by 1`] = `
33+
Array [
34+
Object {
35+
"Orders.createdAt": "2022-12-05T08:00:00.000",
36+
"Orders.createdAt.hour": "2022-12-05T08:00:00.000",
37+
"Orders.totalAmount": 300,
38+
},
39+
Object {
40+
"Orders.createdAt": "2022-12-05T10:00:00.000",
41+
"Orders.createdAt.hour": "2022-12-05T10:00:00.000",
42+
"Orders.totalAmount": 300,
43+
},
44+
Object {
45+
"Orders.createdAt": "2022-12-05T11:00:00.000",
46+
"Orders.createdAt.hour": "2022-12-05T11:00:00.000",
47+
"Orders.totalAmount": 500,
48+
},
49+
Object {
50+
"Orders.createdAt": "2022-12-05T12:00:00.000",
51+
"Orders.createdAt.hour": "2022-12-05T12:00:00.000",
52+
"Orders.totalAmount": 600,
53+
},
54+
Object {
55+
"Orders.createdAt": "2022-12-05T13:00:00.000",
56+
"Orders.createdAt.hour": "2022-12-05T13:00:00.000",
57+
"Orders.totalAmount": 700,
58+
},
59+
]
60+
`;
61+
3262
exports[`prestodb query measure: query 1`] = `
3363
Array [
3464
Object {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`trino query measure grouped by time dimension with timezone: measure-group-by 1`] = `
4+
Array [
5+
Object {
6+
"Orders.createdAt": "2022-12-05T08:00:00.000",
7+
"Orders.createdAt.hour": "2022-12-05T08:00:00.000",
8+
"Orders.totalAmount": 300,
9+
},
10+
Object {
11+
"Orders.createdAt": "2022-12-05T10:00:00.000",
12+
"Orders.createdAt.hour": "2022-12-05T10:00:00.000",
13+
"Orders.totalAmount": 300,
14+
},
15+
Object {
16+
"Orders.createdAt": "2022-12-05T11:00:00.000",
17+
"Orders.createdAt.hour": "2022-12-05T11:00:00.000",
18+
"Orders.totalAmount": 500,
19+
},
20+
Object {
21+
"Orders.createdAt": "2022-12-05T12:00:00.000",
22+
"Orders.createdAt.hour": "2022-12-05T12:00:00.000",
23+
"Orders.totalAmount": 600,
24+
},
25+
Object {
26+
"Orders.createdAt": "2022-12-05T13:00:00.000",
27+
"Orders.createdAt.hour": "2022-12-05T13:00:00.000",
28+
"Orders.totalAmount": 700,
29+
},
30+
]
31+
`;

0 commit comments

Comments
 (0)