@lightdash/warehouses 0.3439.0 → 0.3441.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/warehouseClients/AthenaWarehouseClient.d.ts +2 -1
- package/dist/warehouseClients/AthenaWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/AthenaWarehouseClient.js +27 -13
- package/dist/warehouseClients/BigqueryWarehouseClient.d.ts +2 -1
- package/dist/warehouseClients/BigqueryWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/BigqueryWarehouseClient.js +20 -7
- package/dist/warehouseClients/BigqueryWarehouseClient.test.js +1 -1
- package/dist/warehouseClients/ClickhouseWarehouseClient.d.ts +2 -1
- package/dist/warehouseClients/ClickhouseWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/ClickhouseWarehouseClient.js +21 -5
- package/dist/warehouseClients/DatabricksWarehouseClient.d.ts +2 -1
- package/dist/warehouseClients/DatabricksWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/DatabricksWarehouseClient.js +23 -8
- package/dist/warehouseClients/DuckdbWarehouseClient.d.ts +2 -1
- package/dist/warehouseClients/DuckdbWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/DuckdbWarehouseClient.js +17 -5
- package/dist/warehouseClients/DuckdbWarehouseClient.test.js +5 -0
- package/dist/warehouseClients/PostgresWarehouseClient.d.ts +5 -5
- package/dist/warehouseClients/PostgresWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/PostgresWarehouseClient.js +19 -2
- package/dist/warehouseClients/PostgresWarehouseClient.test.js +1 -1
- package/dist/warehouseClients/SnowflakeWarehouseClient.d.ts +2 -1
- package/dist/warehouseClients/SnowflakeWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/SnowflakeWarehouseClient.js +21 -3
- package/dist/warehouseClients/SnowflakeWarehouseClient.mock.d.ts +9 -0
- package/dist/warehouseClients/SnowflakeWarehouseClient.mock.d.ts.map +1 -1
- package/dist/warehouseClients/SnowflakeWarehouseClient.mock.js +6 -0
- package/dist/warehouseClients/TrinoWarehouseClient.d.ts +2 -1
- package/dist/warehouseClients/TrinoWarehouseClient.d.ts.map +1 -1
- package/dist/warehouseClients/TrinoWarehouseClient.js +16 -4
- package/dist/warehouseClients/TrinoWarehouseClient.test.js +1 -1
- package/dist/warehouseClients/WarehouseBaseClient.d.ts +2 -2
- package/dist/warehouseClients/WarehouseBaseClient.d.ts.map +1 -1
- package/dist/warehouseClients/WarehouseBaseClient.js +5 -2
- package/dist/warehouseClients/WarehouseClient.mock.d.ts +2 -0
- package/dist/warehouseClients/WarehouseClient.mock.d.ts.map +1 -1
- package/dist/warehouseClients/WarehouseClient.mock.js +8 -1
- package/dist/warehouseClients/timestampDomain.test.d.ts +2 -0
- package/dist/warehouseClients/timestampDomain.test.d.ts.map +1 -0
- package/dist/warehouseClients/timestampDomain.test.js +101 -0
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnyType, CreateSnowflakeCredentials, DimensionType, Metric, SupportedDbtAdapter, WarehouseQueryError, WarehouseResults, WarehouseTypes, type WarehouseExecuteAsyncQuery, type WarehouseExecuteAsyncQueryArgs } from '@lightdash/common';
|
|
1
|
+
import { AnyType, CreateSnowflakeCredentials, DimensionType, Metric, SupportedDbtAdapter, WarehouseQueryError, WarehouseResults, WarehouseTypes, type TimestampDomain, type WarehouseExecuteAsyncQuery, type WarehouseExecuteAsyncQueryArgs } from '@lightdash/common';
|
|
2
2
|
import { Connection, ConnectionOptions, SnowflakeError } from 'snowflake-sdk';
|
|
3
3
|
import { WarehouseCatalog } from '../types';
|
|
4
4
|
import WarehouseBaseClient from './WarehouseBaseClient';
|
|
@@ -33,6 +33,7 @@ export declare enum SnowflakeTypes {
|
|
|
33
33
|
ARRAY = "ARRAY",
|
|
34
34
|
GEOGRAPHY = "GEOGRAPHY"
|
|
35
35
|
}
|
|
36
|
+
export declare const getSnowflakeTimestampDomain: (type: string) => TimestampDomain | undefined;
|
|
36
37
|
export type SnowflakeOAuthTokens = {
|
|
37
38
|
accessToken: string;
|
|
38
39
|
refreshToken: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnowflakeWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/SnowflakeWarehouseClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EACP,0BAA0B,EAC1B,aAAa,EAGb,MAAM,
|
|
1
|
+
{"version":3,"file":"SnowflakeWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/SnowflakeWarehouseClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.SnowflakeWarehouseClient = exports.SnowflakeSqlBuilder = exports.mapFieldType = exports.SnowflakeDiagnosticError = exports.mapSnowflakeDiagnosticError = exports.snowflakeIdentifier = exports.SnowflakeTypes = void 0;
|
|
39
|
+
exports.SnowflakeWarehouseClient = exports.SnowflakeSqlBuilder = exports.mapFieldType = exports.SnowflakeDiagnosticError = exports.mapSnowflakeDiagnosticError = exports.snowflakeIdentifier = exports.getSnowflakeTimestampDomain = exports.SnowflakeTypes = void 0;
|
|
40
40
|
const common_1 = require("@lightdash/common");
|
|
41
41
|
const crypto = __importStar(require("crypto"));
|
|
42
42
|
const snowflake_sdk_1 = require("snowflake-sdk");
|
|
@@ -92,6 +92,22 @@ const normaliseSnowflakeType = (type) => {
|
|
|
92
92
|
}
|
|
93
93
|
return match[0];
|
|
94
94
|
};
|
|
95
|
+
// Classifies on the full raw string: normaliseSnowflakeType truncates at the
|
|
96
|
+
// underscore, collapsing TIMESTAMP_NTZ/TZ/LTZ into TIMESTAMP. Strips parameter
|
|
97
|
+
// suffixes like TIMESTAMP_NTZ(9). Bare TIMESTAMP is left unknown — it aliases
|
|
98
|
+
// per-account via TIMESTAMP_TYPE_MAPPING.
|
|
99
|
+
const getSnowflakeTimestampDomain = (type) => {
|
|
100
|
+
switch (type.toUpperCase().replace(/\s*\(.*\)$/, '')) {
|
|
101
|
+
case SnowflakeTypes.TIMESTAMP_NTZ:
|
|
102
|
+
return 'naive';
|
|
103
|
+
case SnowflakeTypes.TIMESTAMP_TZ:
|
|
104
|
+
case SnowflakeTypes.TIMESTAMP_LTZ:
|
|
105
|
+
return 'aware';
|
|
106
|
+
default:
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
exports.getSnowflakeTimestampDomain = getSnowflakeTimestampDomain;
|
|
95
111
|
const EXTERNAL_BROWSER_AUTHENTICATOR = 'EXTERNALBROWSER';
|
|
96
112
|
const OAUTH_AUTHORIZATION_CODE_AUTHENTICATOR = 'OAUTH_AUTHORIZATION_CODE';
|
|
97
113
|
const SESSION_DISCOVERY_LIMIT = 100;
|
|
@@ -1161,7 +1177,9 @@ class SnowflakeWarehouseClient extends WarehouseBaseClient_1.default {
|
|
|
1161
1177
|
acc[match.database][match.schema][match.table] =
|
|
1162
1178
|
acc[match.database][match.schema][match.table] ||
|
|
1163
1179
|
{};
|
|
1164
|
-
|
|
1180
|
+
const rawType = JSON.parse(row.data_type).type;
|
|
1181
|
+
acc[match.database][match.schema][match.table][row.column_name] = (0, exports.mapFieldType)(rawType);
|
|
1182
|
+
(0, common_1.setCatalogTimestampDomain)(acc, match.database, match.schema, match.table, row.column_name, (0, exports.getSnowflakeTimestampDomain)(rawType));
|
|
1165
1183
|
}
|
|
1166
1184
|
});
|
|
1167
1185
|
}
|
|
@@ -1221,7 +1239,7 @@ class SnowflakeWarehouseClient extends WarehouseBaseClient_1.default {
|
|
|
1221
1239
|
values,
|
|
1222
1240
|
});
|
|
1223
1241
|
const { rows } = await this.runQuery(query, tags, undefined, values);
|
|
1224
|
-
return this.parseWarehouseCatalog(rows, exports.mapFieldType);
|
|
1242
|
+
return this.parseWarehouseCatalog(rows, exports.mapFieldType, exports.getSnowflakeTimestampDomain);
|
|
1225
1243
|
}
|
|
1226
1244
|
/*
|
|
1227
1245
|
* This function is used to format the error message for the user.
|
|
@@ -23,6 +23,15 @@ export declare const expectedWarehouseSchema: {
|
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
|
+
__lightdashTimestampDomains: {
|
|
27
|
+
myDatabase: {
|
|
28
|
+
mySchema: {
|
|
29
|
+
myTable: {
|
|
30
|
+
MYTIMESTAMPCOLUMN: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
};
|
|
26
35
|
};
|
|
27
36
|
export declare const expectedFields: Record<string, AnyType>;
|
|
28
37
|
export declare const expectedRow: Record<string, AnyType>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnowflakeWarehouseClient.mock.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/SnowflakeWarehouseClient.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EACP,0BAA0B,EAC1B,aAAa,EAEhB,MAAM,mBAAmB,CAAC;AAI3B,eAAO,MAAM,WAAW,EAAE,0BASzB,CAAC;AASF,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAiG5C,CAAC;AAEF,cAAM,UAAU;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKtC,OAAO;IAIP,OAAO;CAGV;AAED,eAAO,MAAM,gBAAgB,cAQ5B,CAAC;AAEF,eAAO,MAAM,uBAAuB
|
|
1
|
+
{"version":3,"file":"SnowflakeWarehouseClient.mock.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/SnowflakeWarehouseClient.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EACP,0BAA0B,EAC1B,aAAa,EAEhB,MAAM,mBAAmB,CAAC;AAI3B,eAAO,MAAM,WAAW,EAAE,0BASzB,CAAC;AASF,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAiG5C,CAAC;AAEF,cAAM,UAAU;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKtC,OAAO;IAIP,OAAO;CAGV;AAED,eAAO,MAAM,gBAAgB,cAQ5B,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;CAoBnC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAQlD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAQ/C,CAAC"}
|
|
@@ -153,6 +153,12 @@ exports.expectedWarehouseSchema = {
|
|
|
153
153
|
},
|
|
154
154
|
},
|
|
155
155
|
},
|
|
156
|
+
// TIMESTAMP_NTZ in the catalog carries the naive domain
|
|
157
|
+
__lightdashTimestampDomains: {
|
|
158
|
+
myDatabase: {
|
|
159
|
+
mySchema: { myTable: { MYTIMESTAMPCOLUMN: 'naive' } },
|
|
160
|
+
},
|
|
161
|
+
},
|
|
156
162
|
};
|
|
157
163
|
exports.expectedFields = {
|
|
158
164
|
MYSTRINGCOLUMN: { type: common_1.DimensionType.STRING },
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CreateTrinoCredentials, Metric, SupportedDbtAdapter, TimeIntervalUnit, WarehouseResults, WarehouseTypes } from '@lightdash/common';
|
|
1
|
+
import { CreateTrinoCredentials, Metric, SupportedDbtAdapter, TimeIntervalUnit, WarehouseResults, WarehouseTypes, type TimestampDomain } from '@lightdash/common';
|
|
2
2
|
import { ConnectionOptions } from 'trino-client';
|
|
3
3
|
import { WarehouseCatalog } from '../types';
|
|
4
4
|
import WarehouseBaseClient from './WarehouseBaseClient';
|
|
@@ -34,6 +34,7 @@ interface TableInfo {
|
|
|
34
34
|
schema: string;
|
|
35
35
|
table: string;
|
|
36
36
|
}
|
|
37
|
+
export declare const getTrinoTimestampDomain: (type: TrinoTypes | string) => TimestampDomain | undefined;
|
|
37
38
|
export declare class TrinoSqlBuilder extends WarehouseBaseSqlBuilder {
|
|
38
39
|
readonly type = WarehouseTypes.TRINO;
|
|
39
40
|
getAdapterType(): SupportedDbtAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TrinoWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/TrinoWarehouseClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,sBAAsB,EAEtB,MAAM,
|
|
1
|
+
{"version":3,"file":"TrinoWarehouseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/TrinoWarehouseClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.TrinoWarehouseClient = exports.TrinoSqlBuilder = exports.TrinoTypes = void 0;
|
|
6
|
+
exports.TrinoWarehouseClient = exports.TrinoSqlBuilder = exports.getTrinoTimestampDomain = exports.TrinoTypes = void 0;
|
|
7
7
|
const common_1 = require("@lightdash/common");
|
|
8
8
|
const trino_client_1 = require("trino-client");
|
|
9
9
|
const processPromisesInBatches_1 = require("../utils/processPromisesInBatches");
|
|
@@ -59,8 +59,19 @@ const queryTableSchema = ({ database, schema, table, }) => `SELECT table_catalog
|
|
|
59
59
|
AND table_schema = '${schema}'
|
|
60
60
|
AND table_name = '${table}'
|
|
61
61
|
ORDER BY 1, 2, 3, ordinal_position`;
|
|
62
|
+
const getTrinoTimestampDomain = (type) => {
|
|
63
|
+
switch (type.replace(/\(\d+\)/, '')) {
|
|
64
|
+
case TrinoTypes.TIMESTAMP:
|
|
65
|
+
return 'naive';
|
|
66
|
+
case TrinoTypes.TIMESTAMP_TZ:
|
|
67
|
+
return 'aware';
|
|
68
|
+
default:
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
exports.getTrinoTimestampDomain = getTrinoTimestampDomain;
|
|
62
73
|
const convertDataTypeToDimensionType = (type) => {
|
|
63
|
-
const typeWithoutTimePrecision = type.replace(/\(\d
|
|
74
|
+
const typeWithoutTimePrecision = type.replace(/\(\d+\)/, '');
|
|
64
75
|
switch (typeWithoutTimePrecision) {
|
|
65
76
|
case TrinoTypes.BOOLEAN:
|
|
66
77
|
return common_1.DimensionType.BOOLEAN;
|
|
@@ -100,6 +111,7 @@ const catalogToSchema = (results) => {
|
|
|
100
111
|
warehouseCatalog[table_catalog][table_schema][table_name] ||
|
|
101
112
|
{};
|
|
102
113
|
warehouseCatalog[table_catalog][table_schema][table_name][column_name] = convertDataTypeToDimensionType(data_type);
|
|
114
|
+
(0, common_1.setCatalogTimestampDomain)(warehouseCatalog, table_catalog, table_schema, table_name, column_name, (0, exports.getTrinoTimestampDomain)(data_type));
|
|
103
115
|
});
|
|
104
116
|
});
|
|
105
117
|
return warehouseCatalog;
|
|
@@ -320,7 +332,7 @@ class TrinoWarehouseClient extends WarehouseBaseClient_1.default {
|
|
|
320
332
|
ORDER BY 1,2,3
|
|
321
333
|
`;
|
|
322
334
|
const { rows } = await this.runQuery(query, tags);
|
|
323
|
-
return this.parseWarehouseCatalog(rows, convertDataTypeToDimensionType);
|
|
335
|
+
return this.parseWarehouseCatalog(rows, convertDataTypeToDimensionType, exports.getTrinoTimestampDomain);
|
|
324
336
|
}
|
|
325
337
|
async getFields(tableName, schema, database, tags) {
|
|
326
338
|
const query = `
|
|
@@ -339,7 +351,7 @@ class TrinoWarehouseClient extends WarehouseBaseClient_1.default {
|
|
|
339
351
|
: ''}
|
|
340
352
|
`;
|
|
341
353
|
const { rows } = await this.runQuery(query, tags);
|
|
342
|
-
return this.parseWarehouseCatalog(rows, convertDataTypeToDimensionType);
|
|
354
|
+
return this.parseWarehouseCatalog(rows, convertDataTypeToDimensionType, exports.getTrinoTimestampDomain);
|
|
343
355
|
}
|
|
344
356
|
async getAllTables() {
|
|
345
357
|
const databaseName = this.connectionOptions.catalog;
|
|
@@ -92,7 +92,7 @@ describe('TrinoWarehouseClient', () => {
|
|
|
92
92
|
.fn()
|
|
93
93
|
.mockResolvedValue({ done: true, value: TrinoWarehouseClient_mock_1.querySchemaResponse }),
|
|
94
94
|
});
|
|
95
|
-
await expect(warehouse.getCatalog(warehouseClient.config)).resolves.toEqual(warehouseClient.
|
|
95
|
+
await expect(warehouse.getCatalog(warehouseClient.config)).resolves.toEqual(warehouseClient.expectedWarehouseSchemaWithNaiveTimestamp);
|
|
96
96
|
});
|
|
97
97
|
describe('streamQuery client tag headers', () => {
|
|
98
98
|
it('sends X-Trino-Client-Tags header as comma-separated key=value pairs when tags are provided', async () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnyType, CreateWarehouseCredentials, DimensionType, Metric, PartitionColumn, SupportedDbtAdapter, TimeIntervalUnit, WarehouseCatalog, WarehouseResults, WarehouseSqlBuilder, WeekDay, type WarehouseExecuteAsyncQuery, type WarehouseExecuteAsyncQueryArgs, type WarehouseQueryPhase } from '@lightdash/common';
|
|
1
|
+
import { AnyType, CreateWarehouseCredentials, DimensionType, Metric, PartitionColumn, SupportedDbtAdapter, TimeIntervalUnit, WarehouseCatalog, WarehouseResults, WarehouseSqlBuilder, WeekDay, type TimestampDomain, type WarehouseExecuteAsyncQuery, type WarehouseExecuteAsyncQueryArgs, type WarehouseQueryPhase } from '@lightdash/common';
|
|
2
2
|
import { type WarehouseClient } from '../types';
|
|
3
3
|
export default abstract class WarehouseBaseClient<T extends CreateWarehouseCredentials> implements WarehouseClient {
|
|
4
4
|
credentials: T;
|
|
@@ -44,7 +44,7 @@ export default abstract class WarehouseBaseClient<T extends CreateWarehouseCrede
|
|
|
44
44
|
partitionColumn?: PartitionColumn;
|
|
45
45
|
}[]>;
|
|
46
46
|
abstract getFields(tableName: string, schema?: string, database?: string, tags?: Record<string, string>): Promise<WarehouseCatalog>;
|
|
47
|
-
parseWarehouseCatalog(rows: Record<string, AnyType>[], mapFieldType: (type: string) => DimensionType): WarehouseCatalog;
|
|
47
|
+
parseWarehouseCatalog(rows: Record<string, AnyType>[], mapFieldType: (type: string) => DimensionType, mapTimestampDomain?: (type: string) => TimestampDomain | undefined): WarehouseCatalog;
|
|
48
48
|
parseError(error: Error): Error;
|
|
49
49
|
escapeString(value: string): string;
|
|
50
50
|
castToTimestamp(date: Date): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WarehouseBaseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/WarehouseBaseClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EACP,0BAA0B,EAC1B,aAAa,EACb,MAAM,EACN,eAAe,
|
|
1
|
+
{"version":3,"file":"WarehouseBaseClient.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/WarehouseBaseClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const common_1 = require("@lightdash/common");
|
|
3
4
|
class WarehouseBaseClient {
|
|
4
5
|
constructor(credentials, sqlBuilder) {
|
|
5
6
|
this.credentials = credentials;
|
|
@@ -87,16 +88,18 @@ class WarehouseBaseClient {
|
|
|
87
88
|
concatString(...args) {
|
|
88
89
|
return this.sqlBuilder.concatString(...args);
|
|
89
90
|
}
|
|
90
|
-
parseWarehouseCatalog(rows, mapFieldType) {
|
|
91
|
+
parseWarehouseCatalog(rows, mapFieldType, mapTimestampDomain) {
|
|
91
92
|
return rows.reduce((acc, { table_catalog, table_schema, table_name, column_name, data_type, }) => {
|
|
92
93
|
acc[table_catalog] = acc[table_catalog] || {};
|
|
93
94
|
acc[table_catalog][table_schema] =
|
|
94
95
|
acc[table_catalog][table_schema] || {};
|
|
95
96
|
acc[table_catalog][table_schema][table_name] =
|
|
96
97
|
acc[table_catalog][table_schema][table_name] || {};
|
|
97
|
-
if (column_name && data_type)
|
|
98
|
+
if (column_name && data_type) {
|
|
98
99
|
acc[table_catalog][table_schema][table_name][column_name] =
|
|
99
100
|
mapFieldType(data_type);
|
|
101
|
+
(0, common_1.setCatalogTimestampDomain)(acc, table_catalog, table_schema, table_name, column_name, mapTimestampDomain?.(data_type));
|
|
102
|
+
}
|
|
100
103
|
return acc;
|
|
101
104
|
}, {});
|
|
102
105
|
}
|
|
@@ -6,6 +6,8 @@ export declare const config: {
|
|
|
6
6
|
table: string;
|
|
7
7
|
}[];
|
|
8
8
|
export declare const expectedWarehouseSchema: WarehouseCatalog;
|
|
9
|
+
export declare const expectedWarehouseSchemaWithNaiveTimestamp: WarehouseCatalog;
|
|
10
|
+
export declare const expectedWarehouseSchemaWithAwareTimestamp: WarehouseCatalog;
|
|
9
11
|
export declare const expectedFields: Record<string, AnyType>;
|
|
10
12
|
export declare const expectedRow: Record<string, AnyType>;
|
|
11
13
|
//# sourceMappingURL=WarehouseClient.mock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WarehouseClient.mock.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/WarehouseClient.mock.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"WarehouseClient.mock.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/WarehouseClient.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EAIV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB,EAMA,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,gBAcrC,CAAC;AAiBF,eAAO,MAAM,yCAAyC,kBAChB,CAAC;AAEvC,eAAO,MAAM,yCAAyC,kBAChB,CAAC;AAEvC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAQlD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAQ/C,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.expectedRow = exports.expectedFields = exports.expectedWarehouseSchema = exports.config = void 0;
|
|
3
|
+
exports.expectedRow = exports.expectedFields = exports.expectedWarehouseSchemaWithAwareTimestamp = exports.expectedWarehouseSchemaWithNaiveTimestamp = exports.expectedWarehouseSchema = exports.config = void 0;
|
|
4
4
|
const common_1 = require("@lightdash/common");
|
|
5
5
|
exports.config = [
|
|
6
6
|
{
|
|
@@ -24,6 +24,13 @@ exports.expectedWarehouseSchema = {
|
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
26
|
};
|
|
27
|
+
const schemaWithTimestampDomain = (timestampDomain) => {
|
|
28
|
+
const catalog = structuredClone(exports.expectedWarehouseSchema);
|
|
29
|
+
(0, common_1.setCatalogTimestampDomain)(catalog, 'myDatabase', 'mySchema', 'myTable', 'myTimestampColumn', timestampDomain);
|
|
30
|
+
return catalog;
|
|
31
|
+
};
|
|
32
|
+
exports.expectedWarehouseSchemaWithNaiveTimestamp = schemaWithTimestampDomain('naive');
|
|
33
|
+
exports.expectedWarehouseSchemaWithAwareTimestamp = schemaWithTimestampDomain('aware');
|
|
27
34
|
exports.expectedFields = {
|
|
28
35
|
myStringColumn: { type: common_1.DimensionType.STRING },
|
|
29
36
|
myNumberColumn: { type: common_1.DimensionType.NUMBER },
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestampDomain.test.d.ts","sourceRoot":"","sources":["../../src/warehouseClients/timestampDomain.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const AthenaWarehouseClient_1 = require("./AthenaWarehouseClient");
|
|
4
|
+
const BigqueryWarehouseClient_1 = require("./BigqueryWarehouseClient");
|
|
5
|
+
const ClickhouseWarehouseClient_1 = require("./ClickhouseWarehouseClient");
|
|
6
|
+
const DatabricksWarehouseClient_1 = require("./DatabricksWarehouseClient");
|
|
7
|
+
const DuckdbWarehouseClient_1 = require("./DuckdbWarehouseClient");
|
|
8
|
+
const PostgresWarehouseClient_1 = require("./PostgresWarehouseClient");
|
|
9
|
+
const SnowflakeWarehouseClient_1 = require("./SnowflakeWarehouseClient");
|
|
10
|
+
const TrinoWarehouseClient_1 = require("./TrinoWarehouseClient");
|
|
11
|
+
describe('postgres timestamp domain', () => {
|
|
12
|
+
it('classifies naive types', () => {
|
|
13
|
+
expect((0, PostgresWarehouseClient_1.getPostgresTimestampDomain)('timestamp')).toEqual('naive');
|
|
14
|
+
expect((0, PostgresWarehouseClient_1.getPostgresTimestampDomain)('timestamp without time zone')).toEqual('naive');
|
|
15
|
+
});
|
|
16
|
+
it('classifies aware types', () => {
|
|
17
|
+
expect((0, PostgresWarehouseClient_1.getPostgresTimestampDomain)('timestamptz')).toEqual('aware');
|
|
18
|
+
expect((0, PostgresWarehouseClient_1.getPostgresTimestampDomain)('timestamp with time zone')).toEqual('aware');
|
|
19
|
+
});
|
|
20
|
+
it('leaves non-timestamp types unclassified', () => {
|
|
21
|
+
expect((0, PostgresWarehouseClient_1.getPostgresTimestampDomain)('integer')).toBeUndefined();
|
|
22
|
+
expect((0, PostgresWarehouseClient_1.getPostgresTimestampDomain)('date')).toBeUndefined();
|
|
23
|
+
expect((0, PostgresWarehouseClient_1.getPostgresTimestampDomain)('time')).toBeUndefined();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('bigquery timestamp domain', () => {
|
|
27
|
+
it('classifies DATETIME as naive and TIMESTAMP as aware', () => {
|
|
28
|
+
expect((0, BigqueryWarehouseClient_1.getBigqueryTimestampDomain)('DATETIME')).toEqual('naive');
|
|
29
|
+
expect((0, BigqueryWarehouseClient_1.getBigqueryTimestampDomain)('TIMESTAMP')).toEqual('aware');
|
|
30
|
+
});
|
|
31
|
+
it('leaves TIME and non-timestamp types unclassified', () => {
|
|
32
|
+
expect((0, BigqueryWarehouseClient_1.getBigqueryTimestampDomain)('TIME')).toBeUndefined();
|
|
33
|
+
expect((0, BigqueryWarehouseClient_1.getBigqueryTimestampDomain)('STRING')).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('snowflake timestamp domain', () => {
|
|
37
|
+
it('classifies NTZ as naive, including parameterised types', () => {
|
|
38
|
+
expect((0, SnowflakeWarehouseClient_1.getSnowflakeTimestampDomain)('TIMESTAMP_NTZ')).toEqual('naive');
|
|
39
|
+
expect((0, SnowflakeWarehouseClient_1.getSnowflakeTimestampDomain)('TIMESTAMP_NTZ(9)')).toEqual('naive');
|
|
40
|
+
});
|
|
41
|
+
it('classifies TZ and LTZ as aware', () => {
|
|
42
|
+
expect((0, SnowflakeWarehouseClient_1.getSnowflakeTimestampDomain)('TIMESTAMP_TZ')).toEqual('aware');
|
|
43
|
+
expect((0, SnowflakeWarehouseClient_1.getSnowflakeTimestampDomain)('TIMESTAMP_LTZ(9)')).toEqual('aware');
|
|
44
|
+
});
|
|
45
|
+
it('leaves bare TIMESTAMP unclassified (account-level alias)', () => {
|
|
46
|
+
expect((0, SnowflakeWarehouseClient_1.getSnowflakeTimestampDomain)('TIMESTAMP')).toBeUndefined();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('databricks timestamp domain', () => {
|
|
50
|
+
it('classifies TIMESTAMP_NTZ as naive despite type normalization truncating it', () => {
|
|
51
|
+
expect((0, DatabricksWarehouseClient_1.getDatabricksTimestampDomain)('TIMESTAMP_NTZ')).toEqual('naive');
|
|
52
|
+
});
|
|
53
|
+
it('classifies bare TIMESTAMP as aware (stores an instant)', () => {
|
|
54
|
+
expect((0, DatabricksWarehouseClient_1.getDatabricksTimestampDomain)('TIMESTAMP')).toEqual('aware');
|
|
55
|
+
});
|
|
56
|
+
it('leaves non-timestamp types unclassified', () => {
|
|
57
|
+
expect((0, DatabricksWarehouseClient_1.getDatabricksTimestampDomain)('DECIMAL(10,2)')).toBeUndefined();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('trino timestamp domain', () => {
|
|
61
|
+
it('classifies bare timestamp as naive, stripping any precision', () => {
|
|
62
|
+
expect((0, TrinoWarehouseClient_1.getTrinoTimestampDomain)('timestamp')).toEqual('naive');
|
|
63
|
+
expect((0, TrinoWarehouseClient_1.getTrinoTimestampDomain)('timestamp(3)')).toEqual('naive');
|
|
64
|
+
expect((0, TrinoWarehouseClient_1.getTrinoTimestampDomain)('timestamp(6)')).toEqual('naive');
|
|
65
|
+
});
|
|
66
|
+
it('classifies timestamp with time zone as aware', () => {
|
|
67
|
+
expect((0, TrinoWarehouseClient_1.getTrinoTimestampDomain)('timestamp with time zone')).toEqual('aware');
|
|
68
|
+
expect((0, TrinoWarehouseClient_1.getTrinoTimestampDomain)('timestamp(3) with time zone')).toEqual('aware');
|
|
69
|
+
});
|
|
70
|
+
it('leaves non-timestamp types unclassified', () => {
|
|
71
|
+
expect((0, TrinoWarehouseClient_1.getTrinoTimestampDomain)('varchar')).toBeUndefined();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('clickhouse timestamp domain', () => {
|
|
75
|
+
it('classifies DateTime types as always aware', () => {
|
|
76
|
+
expect((0, ClickhouseWarehouseClient_1.getClickhouseTimestampDomain)('DateTime')).toEqual('aware');
|
|
77
|
+
expect((0, ClickhouseWarehouseClient_1.getClickhouseTimestampDomain)("DateTime64(3, 'UTC')")).toEqual('aware');
|
|
78
|
+
expect((0, ClickhouseWarehouseClient_1.getClickhouseTimestampDomain)('Nullable(DateTime)')).toEqual('aware');
|
|
79
|
+
});
|
|
80
|
+
it('leaves non-timestamp types unclassified', () => {
|
|
81
|
+
expect((0, ClickhouseWarehouseClient_1.getClickhouseTimestampDomain)('Date')).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('athena timestamp domain', () => {
|
|
85
|
+
it('classifies bare timestamp as naive and with time zone as aware', () => {
|
|
86
|
+
expect((0, AthenaWarehouseClient_1.getAthenaTimestampDomain)('timestamp')).toEqual('naive');
|
|
87
|
+
expect((0, AthenaWarehouseClient_1.getAthenaTimestampDomain)('timestamp(3)')).toEqual('naive');
|
|
88
|
+
expect((0, AthenaWarehouseClient_1.getAthenaTimestampDomain)('timestamp with time zone')).toEqual('aware');
|
|
89
|
+
});
|
|
90
|
+
it('leaves non-timestamp types unclassified', () => {
|
|
91
|
+
expect((0, AthenaWarehouseClient_1.getAthenaTimestampDomain)('varchar')).toBeUndefined();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('duckdb timestamp domain', () => {
|
|
95
|
+
it('classifies type name strings', () => {
|
|
96
|
+
expect((0, DuckdbWarehouseClient_1.getDuckdbTimestampDomainFromString)('TIMESTAMP')).toEqual('naive');
|
|
97
|
+
expect((0, DuckdbWarehouseClient_1.getDuckdbTimestampDomainFromString)('TIMESTAMP WITH TIME ZONE')).toEqual('aware');
|
|
98
|
+
expect((0, DuckdbWarehouseClient_1.getDuckdbTimestampDomainFromString)('TIMESTAMPTZ')).toEqual('aware');
|
|
99
|
+
expect((0, DuckdbWarehouseClient_1.getDuckdbTimestampDomainFromString)('BOOLEAN')).toBeUndefined();
|
|
100
|
+
});
|
|
101
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightdash/warehouses",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3441.0",
|
|
4
4
|
"description": "Warehouse connectors for Lightdash",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"snowflake-sdk": "2.3.4",
|
|
31
31
|
"ssh2": "1.14.0",
|
|
32
32
|
"trino-client": "0.2.9",
|
|
33
|
-
"@lightdash/common": "0.
|
|
33
|
+
"@lightdash/common": "0.3441.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/big.js": "6.2.2",
|