@trafficbyintent/kysely-bigquery 2.0.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/LICENSE +22 -0
- package/README.md +504 -0
- package/dist/BigQueryAdapter.d.ts +10 -0
- package/dist/BigQueryAdapter.d.ts.map +1 -0
- package/dist/BigQueryAdapter.js +16 -0
- package/dist/BigQueryAdapter.js.map +1 -0
- package/dist/BigQueryCompiler.d.ts +24 -0
- package/dist/BigQueryCompiler.d.ts.map +1 -0
- package/dist/BigQueryCompiler.js +244 -0
- package/dist/BigQueryCompiler.js.map +1 -0
- package/dist/BigQueryConnection.d.ts +41 -0
- package/dist/BigQueryConnection.d.ts.map +1 -0
- package/dist/BigQueryConnection.js +222 -0
- package/dist/BigQueryConnection.js.map +1 -0
- package/dist/BigQueryDialect.d.ts +80 -0
- package/dist/BigQueryDialect.d.ts.map +1 -0
- package/dist/BigQueryDialect.js +77 -0
- package/dist/BigQueryDialect.js.map +1 -0
- package/dist/BigQueryDriver.d.ts +20 -0
- package/dist/BigQueryDriver.d.ts.map +1 -0
- package/dist/BigQueryDriver.js +47 -0
- package/dist/BigQueryDriver.js.map +1 -0
- package/dist/BigQueryIntrospector.d.ts +15 -0
- package/dist/BigQueryIntrospector.d.ts.map +1 -0
- package/dist/BigQueryIntrospector.js +90 -0
- package/dist/BigQueryIntrospector.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonColumnDetector.d.ts +53 -0
- package/dist/jsonColumnDetector.d.ts.map +1 -0
- package/dist/jsonColumnDetector.js +187 -0
- package/dist/jsonColumnDetector.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _BigQueryCompiler_defaultProject;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.BigQueryCompiler = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const kysely_1 = require("kysely");
|
|
7
|
+
/**
|
|
8
|
+
* Query compiler for BigQuery dialect.
|
|
9
|
+
*
|
|
10
|
+
* Extends MysqlQueryCompiler and overrides methods to generate
|
|
11
|
+
* BigQuery-compatible SQL.
|
|
12
|
+
*/
|
|
13
|
+
class BigQueryCompiler extends kysely_1.MysqlQueryCompiler {
|
|
14
|
+
constructor(defaultProject) {
|
|
15
|
+
super();
|
|
16
|
+
_BigQueryCompiler_defaultProject.set(this, void 0);
|
|
17
|
+
tslib_1.__classPrivateFieldSet(this, _BigQueryCompiler_defaultProject, defaultProject, "f");
|
|
18
|
+
}
|
|
19
|
+
visitSetOperation(node) {
|
|
20
|
+
if (node.operator === 'union' && !node.all) {
|
|
21
|
+
this.append('union distinct ');
|
|
22
|
+
this.visitNode(node.expression);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
super.visitSetOperation(node);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
visitFunction(node) {
|
|
29
|
+
const funcName = node.func.toUpperCase();
|
|
30
|
+
switch (funcName) {
|
|
31
|
+
case 'NOW':
|
|
32
|
+
this.append('CURRENT_TIMESTAMP');
|
|
33
|
+
this.visitFunctionArgumentList(node.arguments);
|
|
34
|
+
return;
|
|
35
|
+
case 'LENGTH':
|
|
36
|
+
/* BigQuery uses CHAR_LENGTH for character count */
|
|
37
|
+
this.append('CHAR_LENGTH');
|
|
38
|
+
this.visitFunctionArgumentList(node.arguments);
|
|
39
|
+
return;
|
|
40
|
+
case 'DATE_FORMAT':
|
|
41
|
+
if (node.arguments.length === 2 &&
|
|
42
|
+
node.arguments[0] !== null &&
|
|
43
|
+
node.arguments[0] !== undefined &&
|
|
44
|
+
node.arguments[1] !== null &&
|
|
45
|
+
node.arguments[1] !== undefined) {
|
|
46
|
+
this.append('FORMAT_TIMESTAMP');
|
|
47
|
+
this.append('(');
|
|
48
|
+
this.visitNode(node.arguments[1]);
|
|
49
|
+
this.append(', ');
|
|
50
|
+
this.visitNode(node.arguments[0]);
|
|
51
|
+
this.append(')');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
case 'DATE_ADD':
|
|
56
|
+
/*
|
|
57
|
+
* Pass through DATE_ADD as BigQuery supports it
|
|
58
|
+
* Note: BigQuery syntax is DATE_ADD(date, INTERVAL n unit)
|
|
59
|
+
*/
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
/* Use default handler for all other functions */
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
super.visitFunction(node);
|
|
66
|
+
}
|
|
67
|
+
visitUpdateQuery(node) {
|
|
68
|
+
if (node.where === null || node.where === undefined) {
|
|
69
|
+
/*
|
|
70
|
+
* BigQuery requires WHERE clause for UPDATE statements
|
|
71
|
+
* Add WHERE TRUE to allow the query to execute
|
|
72
|
+
*/
|
|
73
|
+
super.visitUpdateQuery(node);
|
|
74
|
+
this.append(' where true');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
super.visitUpdateQuery(node);
|
|
78
|
+
}
|
|
79
|
+
visitDeleteQuery(node) {
|
|
80
|
+
if (node.where === null || node.where === undefined) {
|
|
81
|
+
/*
|
|
82
|
+
* BigQuery requires WHERE clause for DELETE statements
|
|
83
|
+
* Add WHERE TRUE to allow the query to execute
|
|
84
|
+
*/
|
|
85
|
+
super.visitDeleteQuery(node);
|
|
86
|
+
this.append(' where true');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
super.visitDeleteQuery(node);
|
|
90
|
+
}
|
|
91
|
+
visitTable(node) {
|
|
92
|
+
if (tslib_1.__classPrivateFieldGet(this, _BigQueryCompiler_defaultProject, "f") && node.table.kind === 'SchemableIdentifierNode') {
|
|
93
|
+
const schemableNode = node.table;
|
|
94
|
+
if (schemableNode.schema && schemableNode.schema.kind === 'IdentifierNode') {
|
|
95
|
+
this.visitIdentifier({
|
|
96
|
+
kind: 'IdentifierNode',
|
|
97
|
+
name: tslib_1.__classPrivateFieldGet(this, _BigQueryCompiler_defaultProject, "f"),
|
|
98
|
+
});
|
|
99
|
+
this.append('.');
|
|
100
|
+
this.visitIdentifier(schemableNode.schema);
|
|
101
|
+
this.append('.');
|
|
102
|
+
this.visitIdentifier(schemableNode.identifier);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
super.visitTable(node);
|
|
107
|
+
}
|
|
108
|
+
visitRaw(node) {
|
|
109
|
+
const translatedFragments = [...node.sqlFragments];
|
|
110
|
+
for (let i = 0; i < translatedFragments.length; i++) {
|
|
111
|
+
let fragment = translatedFragments[i];
|
|
112
|
+
if (fragment === null || fragment === undefined || fragment === '') {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
fragment = fragment.replace(/\bNOW\s*\(\s*\)/gi, 'CURRENT_TIMESTAMP()');
|
|
116
|
+
translatedFragments[i] = fragment;
|
|
117
|
+
}
|
|
118
|
+
if (translatedFragments.some((f) => f.match(/\bDATE_FORMAT\s*\(/i))) {
|
|
119
|
+
for (let i = 0; i < translatedFragments.length; i++) {
|
|
120
|
+
let fragment = translatedFragments[i];
|
|
121
|
+
/* c8 ignore start - defensive: fragments already filtered above */
|
|
122
|
+
if (fragment === null || fragment === undefined || fragment === '') {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
/* c8 ignore stop */
|
|
126
|
+
const fullMatch = fragment.match(/\bDATE_FORMAT\s*\(\s*([^,]+)\s*,\s*('[^']*')\s*\)/gi);
|
|
127
|
+
if (fullMatch) {
|
|
128
|
+
fragment = fragment.replace(/\bDATE_FORMAT\s*\(\s*([^,]+)\s*,\s*('[^']*')\s*\)/gi, 'FORMAT_TIMESTAMP($2, $1)');
|
|
129
|
+
translatedFragments[i] = fragment;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
translatedFragments[i] = fragment.replace(/\bDATE_FORMAT\s*\(/gi, 'FORMAT_TIMESTAMP(');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (translatedFragments.length === 2 && node.parameters.length === 1) {
|
|
136
|
+
const secondFragment = translatedFragments[1];
|
|
137
|
+
if (secondFragment) {
|
|
138
|
+
const formatMatch = secondFragment.match(/,\s*'([^']*)'(.*)$/);
|
|
139
|
+
if (formatMatch && translatedFragments[0] && node.parameters[0]) {
|
|
140
|
+
this.append(translatedFragments[0]);
|
|
141
|
+
this.append(`'${formatMatch[1]}'`);
|
|
142
|
+
this.append(', ');
|
|
143
|
+
this.visitNode(node.parameters[0]);
|
|
144
|
+
this.append(formatMatch[2] || '');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.appendFragmentsWithParams(translatedFragments, node.parameters);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.appendFragmentsWithParams(translatedFragments, node.parameters);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
appendFragmentsWithParams(fragments, params) {
|
|
156
|
+
for (let i = 0; i < fragments.length; i++) {
|
|
157
|
+
if (i > 0) {
|
|
158
|
+
const param = params[i - 1];
|
|
159
|
+
if (param) {
|
|
160
|
+
this.visitNode(param);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const fragment = fragments[i];
|
|
164
|
+
if (fragment) {
|
|
165
|
+
this.append(fragment);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
visitFunctionArgumentList(args) {
|
|
170
|
+
this.append('(');
|
|
171
|
+
const lastNode = args[args.length - 1];
|
|
172
|
+
for (const node of args) {
|
|
173
|
+
this.visitNode(node);
|
|
174
|
+
/* c8 ignore start - defensive: currently only called with 0-1 args */
|
|
175
|
+
if (node !== lastNode) {
|
|
176
|
+
this.append(', ');
|
|
177
|
+
}
|
|
178
|
+
/* c8 ignore stop */
|
|
179
|
+
}
|
|
180
|
+
this.append(')');
|
|
181
|
+
}
|
|
182
|
+
visitColumnDefinition(node) {
|
|
183
|
+
/* Call parent implementation first */
|
|
184
|
+
super.visitColumnDefinition(node);
|
|
185
|
+
/* If column has inline constraints, append NOT ENFORCED */
|
|
186
|
+
if (node.primaryKey || node.unique || node.references) {
|
|
187
|
+
this.append(' not enforced');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
visitPrimaryKeyConstraint(node) {
|
|
191
|
+
if (node.name) {
|
|
192
|
+
this.append('constraint ');
|
|
193
|
+
this.visitNode(node.name);
|
|
194
|
+
this.append(' ');
|
|
195
|
+
}
|
|
196
|
+
this.append('primary key');
|
|
197
|
+
if (node.columns) {
|
|
198
|
+
this.append(' (');
|
|
199
|
+
this.compileList(node.columns);
|
|
200
|
+
this.append(')');
|
|
201
|
+
}
|
|
202
|
+
/* BigQuery requires NOT ENFORCED for all constraints */
|
|
203
|
+
this.append(' not enforced');
|
|
204
|
+
}
|
|
205
|
+
visitUniqueConstraint(node) {
|
|
206
|
+
if (node.name) {
|
|
207
|
+
this.append('constraint ');
|
|
208
|
+
this.visitNode(node.name);
|
|
209
|
+
this.append(' ');
|
|
210
|
+
}
|
|
211
|
+
this.append('unique');
|
|
212
|
+
if (node.columns) {
|
|
213
|
+
this.append(' (');
|
|
214
|
+
this.compileList(node.columns);
|
|
215
|
+
this.append(')');
|
|
216
|
+
}
|
|
217
|
+
/* BigQuery requires NOT ENFORCED for all constraints */
|
|
218
|
+
this.append(' not enforced');
|
|
219
|
+
}
|
|
220
|
+
visitForeignKeyConstraint(node) {
|
|
221
|
+
if (node.name) {
|
|
222
|
+
this.append('constraint ');
|
|
223
|
+
this.visitNode(node.name);
|
|
224
|
+
this.append(' ');
|
|
225
|
+
}
|
|
226
|
+
this.append('foreign key (');
|
|
227
|
+
this.compileList(node.columns);
|
|
228
|
+
this.append(') ');
|
|
229
|
+
this.visitNode(node.references);
|
|
230
|
+
if (node.onDelete) {
|
|
231
|
+
this.append(' on delete ');
|
|
232
|
+
this.append(node.onDelete);
|
|
233
|
+
}
|
|
234
|
+
if (node.onUpdate) {
|
|
235
|
+
this.append(' on update ');
|
|
236
|
+
this.append(node.onUpdate);
|
|
237
|
+
}
|
|
238
|
+
/* BigQuery requires NOT ENFORCED for all constraints */
|
|
239
|
+
this.append(' not enforced');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.BigQueryCompiler = BigQueryCompiler;
|
|
243
|
+
_BigQueryCompiler_defaultProject = new WeakMap();
|
|
244
|
+
//# sourceMappingURL=BigQueryCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigQueryCompiler.js","sourceRoot":"","sources":["../src/BigQueryCompiler.ts"],"names":[],"mappings":";;;;;AAAA,mCAcgB;AAEhB;;;;;GAKG;AACH,MAAa,gBAAiB,SAAQ,2BAAkB;IAGtD,YAAY,cAAuB;QACjC,KAAK,EAAE,CAAC;QAHD,mDAAoC;QAI3C,+BAAA,IAAI,oCAAmB,cAAc,MAAA,CAAC;IACxC,CAAC;IAEkB,iBAAiB,CAAC,IAAsB;QACzD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAEkB,aAAa,CAAC,IAAkB;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,KAAK;gBACR,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBACjC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/C,OAAO;YAET,KAAK,QAAQ;gBACX,mDAAmD;gBACnD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC3B,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/C,OAAO;YAET,KAAK,aAAa;gBAChB,IACE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;oBAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;oBAC1B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS;oBAC/B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;oBAC1B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAC/B,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;oBAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,MAAM;YAER,KAAK,UAAU;gBACb;;;mBAGG;gBACH,MAAM;YAER;gBACE,iDAAiD;gBACjD,MAAM;QACV,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEkB,gBAAgB,CAAC,IAAqB;QACvD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACpD;;;eAGG;YACH,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEkB,gBAAgB,CAAC,IAAqB;QACvD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACpD;;;eAGG;YACH,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEkB,UAAU,CAAC,IAAe;QAC3C,IAAI,+BAAA,IAAI,wCAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;YAEjC,IAAI,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC3E,IAAI,CAAC,eAAe,CAAC;oBACnB,IAAI,EAAE,gBAAgB;oBACtB,IAAI,EAAE,+BAAA,IAAI,wCAAgB;iBACT,CAAC,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEkB,QAAQ,CAAC,IAAa;QACvC,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,IAAI,QAAQ,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gBACnE,SAAS;YACX,CAAC;YAED,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;YAExE,mBAAmB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QACpC,CAAC;QAED,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC;YACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,IAAI,QAAQ,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBACtC,mEAAmE;gBACnE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;oBACnE,SAAS;gBACX,CAAC;gBACD,oBAAoB;gBAEpB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACxF,IAAI,SAAS,EAAE,CAAC;oBACd,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,qDAAqD,EACrD,0BAA0B,CAC3B,CAAC;oBACF,mBAAmB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,mBAAmB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;YAED,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrE,MAAM,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBAC9C,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBAC/D,IAAI,WAAW,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;wBAClC,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,yBAAyB,CAAC,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,yBAAyB,CAAC,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAEO,yBAAyB,CAC/B,SAAmB,EACnB,MAAoC;QAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5B,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAES,yBAAyB,CAAC,IAAkC;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAErB,sEAAsE;YACtE,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;YACD,oBAAoB;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAEkB,qBAAqB,CAAC,IAA0B;QACjE,sCAAsC;QACtC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAElC,2DAA2D;QAC3D,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEkB,yBAAyB,CAAC,IAA8B;QACzE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,wDAAwD;QACxD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAEkB,qBAAqB,CAAC,IAA0B;QACjE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,wDAAwD;QACxD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAEkB,yBAAyB,CAAC,IAA8B;QACzE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,wDAAwD;QACxD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;CACF;AAxQD,4CAwQC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type CompiledQuery, type DatabaseConnection, type QueryResult } from 'kysely';
|
|
2
|
+
import { type BigQueryDialectConfig } from './BigQueryDialect';
|
|
3
|
+
/**
|
|
4
|
+
* BigQuery database connection implementation for Kysely.
|
|
5
|
+
*
|
|
6
|
+
* Handles query execution and streaming for BigQuery.
|
|
7
|
+
*/
|
|
8
|
+
export declare class BigQueryConnection implements DatabaseConnection {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(config: BigQueryDialectConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Executes a compiled query against BigQuery.
|
|
13
|
+
* @param compiledQuery - The compiled query with SQL and parameters
|
|
14
|
+
* @returns A promise that resolves to the query results
|
|
15
|
+
* @throws Error if the query fails or if null parameters are not properly typed
|
|
16
|
+
*/
|
|
17
|
+
executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>>;
|
|
18
|
+
/**
|
|
19
|
+
* Begins a transaction (not supported by BigQuery).
|
|
20
|
+
* @returns A rejected promise as BigQuery doesn't support transactions
|
|
21
|
+
*/
|
|
22
|
+
beginTransaction(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Commits a transaction (not supported by BigQuery).
|
|
25
|
+
* @returns A rejected promise as BigQuery doesn't support transactions
|
|
26
|
+
*/
|
|
27
|
+
commitTransaction(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Rolls back a transaction (not supported by BigQuery).
|
|
30
|
+
* @returns A rejected promise as BigQuery doesn't support transactions
|
|
31
|
+
*/
|
|
32
|
+
rollbackTransaction(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Streams query results for handling large datasets.
|
|
35
|
+
* @param compiledQuery - The compiled query with SQL and parameters
|
|
36
|
+
* @param _chunkSize - Chunk size parameter (currently unused)
|
|
37
|
+
* @returns An async iterator that yields query results in batches
|
|
38
|
+
*/
|
|
39
|
+
streamQuery<O>(compiledQuery: CompiledQuery, _chunkSize: number): AsyncIterableIterator<QueryResult<O>>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=BigQueryConnection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigQueryConnection.d.ts","sourceRoot":"","sources":["../src/BigQueryConnection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAIvF,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,kBAAkB;;gBAK/C,MAAM,EAAE,qBAAqB;IAczC;;;;;OAKG;IACG,YAAY,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA8C5E;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACH,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;;;;OAKG;IACI,WAAW,CAAC,CAAC,EAClB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,GACjB,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CA2HzC"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _BigQueryConnection_instances, _BigQueryConnection_client, _BigQueryConnection_jsonDetector, _BigQueryConnection_jsonColumnNames, _BigQueryConnection_inferParamTypes, _BigQueryConnection_inferArrayType, _BigQueryConnection_processResultRow;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.BigQueryConnection = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const bigquery_1 = require("@google-cloud/bigquery");
|
|
7
|
+
const jsonColumnDetector_1 = require("./jsonColumnDetector");
|
|
8
|
+
/**
|
|
9
|
+
* BigQuery database connection implementation for Kysely.
|
|
10
|
+
*
|
|
11
|
+
* Handles query execution and streaming for BigQuery.
|
|
12
|
+
*/
|
|
13
|
+
class BigQueryConnection {
|
|
14
|
+
constructor(config) {
|
|
15
|
+
var _a;
|
|
16
|
+
_BigQueryConnection_instances.add(this);
|
|
17
|
+
_BigQueryConnection_client.set(this, void 0);
|
|
18
|
+
_BigQueryConnection_jsonDetector.set(this, void 0);
|
|
19
|
+
_BigQueryConnection_jsonColumnNames.set(this, void 0);
|
|
20
|
+
tslib_1.__classPrivateFieldSet(this, _BigQueryConnection_client, (_a = config.bigquery) !== null && _a !== void 0 ? _a : new bigquery_1.BigQuery(config.options), "f");
|
|
21
|
+
tslib_1.__classPrivateFieldSet(this, _BigQueryConnection_jsonDetector, new jsonColumnDetector_1.JsonColumnDetector(), "f");
|
|
22
|
+
/* Register known JSON columns if provided in config */
|
|
23
|
+
if (config.jsonColumns) {
|
|
24
|
+
for (const [tableName, columns] of Object.entries(config.jsonColumns)) {
|
|
25
|
+
tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_jsonDetector, "f").registerJsonColumns(tableName, columns);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
tslib_1.__classPrivateFieldSet(this, _BigQueryConnection_jsonColumnNames, tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_jsonDetector, "f").getRegisteredJsonColumnNames(), "f");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Executes a compiled query against BigQuery.
|
|
32
|
+
* @param compiledQuery - The compiled query with SQL and parameters
|
|
33
|
+
* @returns A promise that resolves to the query results
|
|
34
|
+
* @throws Error if the query fails or if null parameters are not properly typed
|
|
35
|
+
*/
|
|
36
|
+
executeQuery(compiledQuery) {
|
|
37
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
try {
|
|
39
|
+
const params = [...compiledQuery.parameters];
|
|
40
|
+
/* Process parameters to handle nulls and JSON serialization */
|
|
41
|
+
const processedParams = tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_jsonDetector, "f").processParameters(compiledQuery, params);
|
|
42
|
+
const options = {
|
|
43
|
+
query: compiledQuery.sql,
|
|
44
|
+
params: processedParams,
|
|
45
|
+
parseJSON: true,
|
|
46
|
+
};
|
|
47
|
+
/* BigQuery needs types array for ALL parameters when there are null parameters */
|
|
48
|
+
if (processedParams.some((p) => p === null)) {
|
|
49
|
+
options.types = tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_instances, "m", _BigQueryConnection_inferParamTypes).call(this, processedParams);
|
|
50
|
+
}
|
|
51
|
+
const [rows] = yield tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_client, "f").query(options);
|
|
52
|
+
const processedRows = Array.isArray(rows)
|
|
53
|
+
? rows.map((row) => tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_instances, "m", _BigQueryConnection_processResultRow).call(this, row))
|
|
54
|
+
: [];
|
|
55
|
+
return {
|
|
56
|
+
rows: processedRows,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
/* Provide more helpful error messages */
|
|
61
|
+
if (error instanceof Error) {
|
|
62
|
+
if (error.message.includes('Parameter types must be provided for null values') ||
|
|
63
|
+
error.message.includes('Incorrect number of parameter types provided')) {
|
|
64
|
+
throw new Error(`BigQuery query failed: ${error.message}\n` +
|
|
65
|
+
'Hint: The BigQuery dialect now automatically handles null parameters. ' +
|
|
66
|
+
"If you're still seeing this error, please report it as a bug.");
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`BigQuery query failed: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Begins a transaction (not supported by BigQuery).
|
|
76
|
+
* @returns A rejected promise as BigQuery doesn't support transactions
|
|
77
|
+
*/
|
|
78
|
+
beginTransaction() {
|
|
79
|
+
return Promise.reject(new Error('Transactions are not supported.'));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Commits a transaction (not supported by BigQuery).
|
|
83
|
+
* @returns A rejected promise as BigQuery doesn't support transactions
|
|
84
|
+
*/
|
|
85
|
+
commitTransaction() {
|
|
86
|
+
return Promise.reject(new Error('Transactions are not supported.'));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Rolls back a transaction (not supported by BigQuery).
|
|
90
|
+
* @returns A rejected promise as BigQuery doesn't support transactions
|
|
91
|
+
*/
|
|
92
|
+
rollbackTransaction() {
|
|
93
|
+
return Promise.reject(new Error('Transactions are not supported.'));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Streams query results for handling large datasets.
|
|
97
|
+
* @param compiledQuery - The compiled query with SQL and parameters
|
|
98
|
+
* @param _chunkSize - Chunk size parameter (currently unused)
|
|
99
|
+
* @returns An async iterator that yields query results in batches
|
|
100
|
+
*/
|
|
101
|
+
streamQuery(compiledQuery, _chunkSize) {
|
|
102
|
+
return tslib_1.__asyncGenerator(this, arguments, function* streamQuery_1() {
|
|
103
|
+
var _a, e_1, _b, _c;
|
|
104
|
+
const params = [...compiledQuery.parameters];
|
|
105
|
+
/* Process parameters to handle nulls and JSON serialization */
|
|
106
|
+
const processedParams = tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_jsonDetector, "f").processParameters(compiledQuery, params);
|
|
107
|
+
const options = {
|
|
108
|
+
query: compiledQuery.sql,
|
|
109
|
+
params: processedParams,
|
|
110
|
+
parseJSON: true,
|
|
111
|
+
};
|
|
112
|
+
/* BigQuery needs types array for ALL parameters when there are null parameters */
|
|
113
|
+
if (processedParams.some((p) => p === null)) {
|
|
114
|
+
options.types = tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_instances, "m", _BigQueryConnection_inferParamTypes).call(this, processedParams);
|
|
115
|
+
}
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
117
|
+
let stream;
|
|
118
|
+
try {
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
120
|
+
stream = tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_client, "f").createQueryStream(options);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error instanceof Error) {
|
|
124
|
+
throw new Error(`BigQuery stream query failed: ${error.message}`);
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
try {
|
|
130
|
+
for (var _d = true, stream_1 = tslib_1.__asyncValues(stream), stream_1_1; stream_1_1 = yield tslib_1.__await(stream_1.next()), _a = stream_1_1.done, !_a; _d = true) {
|
|
131
|
+
_c = stream_1_1.value;
|
|
132
|
+
_d = false;
|
|
133
|
+
const row = _c;
|
|
134
|
+
yield yield tslib_1.__await({
|
|
135
|
+
rows: [tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_instances, "m", _BigQueryConnection_processResultRow).call(this, row)],
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
140
|
+
finally {
|
|
141
|
+
try {
|
|
142
|
+
if (!_d && !_a && (_b = stream_1.return)) yield tslib_1.__await(_b.call(stream_1));
|
|
143
|
+
}
|
|
144
|
+
finally { if (e_1) throw e_1.error; }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
/* Handle stream errors */
|
|
149
|
+
if (error instanceof Error) {
|
|
150
|
+
throw new Error(`BigQuery stream error: ${error.message}`);
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.BigQueryConnection = BigQueryConnection;
|
|
158
|
+
_BigQueryConnection_client = new WeakMap(), _BigQueryConnection_jsonDetector = new WeakMap(), _BigQueryConnection_jsonColumnNames = new WeakMap(), _BigQueryConnection_instances = new WeakSet(), _BigQueryConnection_inferParamTypes = function _BigQueryConnection_inferParamTypes(params) {
|
|
159
|
+
return params.map((param) => {
|
|
160
|
+
if (param === null) {
|
|
161
|
+
return 'STRING';
|
|
162
|
+
}
|
|
163
|
+
if (typeof param === 'number') {
|
|
164
|
+
return Number.isInteger(param) ? 'INT64' : 'FLOAT64';
|
|
165
|
+
}
|
|
166
|
+
if (typeof param === 'boolean') {
|
|
167
|
+
return 'BOOL';
|
|
168
|
+
}
|
|
169
|
+
if (param instanceof Date) {
|
|
170
|
+
return 'TIMESTAMP';
|
|
171
|
+
}
|
|
172
|
+
if (param instanceof Buffer) {
|
|
173
|
+
return 'BYTES';
|
|
174
|
+
}
|
|
175
|
+
if (Array.isArray(param)) {
|
|
176
|
+
return tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_instances, "m", _BigQueryConnection_inferArrayType).call(this, param);
|
|
177
|
+
}
|
|
178
|
+
if (typeof param === 'object') {
|
|
179
|
+
/*
|
|
180
|
+
* After processParameters, registered JSON values are already stringified
|
|
181
|
+
* to strings, so they never reach here. Remaining objects are STRUCTs or
|
|
182
|
+
* unregistered objects. BigQuery needs the full STRUCT<...> descriptor to
|
|
183
|
+
* use a provided type, which we can't infer generically. Returning 'STRING'
|
|
184
|
+
* is a safe fallback — BigQuery's SDK calls .toString() on the value.
|
|
185
|
+
*/
|
|
186
|
+
return 'STRING';
|
|
187
|
+
}
|
|
188
|
+
return 'STRING';
|
|
189
|
+
});
|
|
190
|
+
}, _BigQueryConnection_inferArrayType = function _BigQueryConnection_inferArrayType(param) {
|
|
191
|
+
if (param.length === 0) {
|
|
192
|
+
return 'ARRAY<STRING>';
|
|
193
|
+
}
|
|
194
|
+
const first = param[0];
|
|
195
|
+
if (typeof first === 'number') {
|
|
196
|
+
return Number.isInteger(first) ? 'ARRAY<INT64>' : 'ARRAY<FLOAT64>';
|
|
197
|
+
}
|
|
198
|
+
if (typeof first === 'boolean') {
|
|
199
|
+
return 'ARRAY<BOOL>';
|
|
200
|
+
}
|
|
201
|
+
return 'ARRAY<STRING>';
|
|
202
|
+
}, _BigQueryConnection_processResultRow = function _BigQueryConnection_processResultRow(row) {
|
|
203
|
+
if (tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_jsonColumnNames, "f").size === 0) {
|
|
204
|
+
return row;
|
|
205
|
+
}
|
|
206
|
+
const processedRow = {};
|
|
207
|
+
for (const [key, value] of Object.entries(row)) {
|
|
208
|
+
if (tslib_1.__classPrivateFieldGet(this, _BigQueryConnection_jsonColumnNames, "f").has(key) && typeof value === 'string' && value.length > 0) {
|
|
209
|
+
try {
|
|
210
|
+
processedRow[key] = JSON.parse(value);
|
|
211
|
+
}
|
|
212
|
+
catch (_a) {
|
|
213
|
+
processedRow[key] = value;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
processedRow[key] = value;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return processedRow;
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=BigQueryConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigQueryConnection.js","sourceRoot":"","sources":["../src/BigQueryConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type BigQuery, type BigQueryOptions, type Dataset, type Table } from '@google-cloud/bigquery';
|
|
2
|
+
import { type DatabaseIntrospector, type Dialect, type Driver, type Kysely, type QueryCompiler } from 'kysely';
|
|
3
|
+
import { BigQueryAdapter } from './BigQueryAdapter';
|
|
4
|
+
/**
|
|
5
|
+
* Configuration options for BigQuery dialect.
|
|
6
|
+
*/
|
|
7
|
+
export interface BigQueryDialectConfig {
|
|
8
|
+
/**
|
|
9
|
+
* BigQuery client options.
|
|
10
|
+
*/
|
|
11
|
+
options?: BigQueryOptions;
|
|
12
|
+
/**
|
|
13
|
+
* Existing BigQuery, Dataset, or Table instance to use.
|
|
14
|
+
* If provided, this will be used instead of creating a new client.
|
|
15
|
+
*/
|
|
16
|
+
bigquery?: BigQuery | Dataset | Table;
|
|
17
|
+
/**
|
|
18
|
+
* Optional mapping of table names to their JSON column names.
|
|
19
|
+
* This enables automatic JSON serialization for these columns.
|
|
20
|
+
*
|
|
21
|
+
* Example:
|
|
22
|
+
* ```
|
|
23
|
+
* {
|
|
24
|
+
* 'dataset.users': ['metadata', 'settings'],
|
|
25
|
+
* 'dataset.products': ['specifications']
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
jsonColumns?: Record<string, string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Default GCP project ID to prepend to table references.
|
|
32
|
+
*
|
|
33
|
+
* BigQuery supports three-level table names: `project.dataset.table`.
|
|
34
|
+
* Kysely's parser only handles two-level names (`schema.table`), so
|
|
35
|
+
* three-part strings like `'my-project.dataset.table'` lose the table name.
|
|
36
|
+
*
|
|
37
|
+
* Set this to your project ID so you can write `selectFrom('dataset.table')`
|
|
38
|
+
* and the compiler emits `\`project\`.\`dataset\`.\`table\``.
|
|
39
|
+
*
|
|
40
|
+
* Example:
|
|
41
|
+
* ```
|
|
42
|
+
* new BigQueryDialect({
|
|
43
|
+
* bigquery: client,
|
|
44
|
+
* defaultProject: 'my-gcp-project',
|
|
45
|
+
* })
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
defaultProject?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* BigQuery dialect for Kysely.
|
|
52
|
+
*
|
|
53
|
+
* This dialect allows you to use Kysely with Google BigQuery.
|
|
54
|
+
*/
|
|
55
|
+
export declare class BigQueryDialect implements Dialect {
|
|
56
|
+
#private;
|
|
57
|
+
constructor(config?: BigQueryDialectConfig);
|
|
58
|
+
/**
|
|
59
|
+
* Creates a BigQuery adapter for Kysely.
|
|
60
|
+
* @returns A new BigQueryAdapter instance
|
|
61
|
+
*/
|
|
62
|
+
createAdapter(): BigQueryAdapter;
|
|
63
|
+
/**
|
|
64
|
+
* Creates a BigQuery driver for database connections.
|
|
65
|
+
* @returns A new BigQueryDriver instance configured with the dialect settings
|
|
66
|
+
*/
|
|
67
|
+
createDriver(): Driver;
|
|
68
|
+
/**
|
|
69
|
+
* Creates a BigQuery query compiler for SQL generation.
|
|
70
|
+
* @returns A new BigQueryCompiler instance that translates Kysely queries to BigQuery SQL
|
|
71
|
+
*/
|
|
72
|
+
createQueryCompiler(): QueryCompiler;
|
|
73
|
+
/**
|
|
74
|
+
* Creates a BigQuery database introspector for schema discovery.
|
|
75
|
+
* @param db - The Kysely database instance
|
|
76
|
+
* @returns A new BigQueryIntrospector instance for examining database schema
|
|
77
|
+
*/
|
|
78
|
+
createIntrospector(db: Kysely<unknown>): DatabaseIntrospector;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=BigQueryDialect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigQueryDialect.d.ts","sourceRoot":"","sources":["../src/BigQueryDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,KAAK,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,MAAM,EACX,KAAK,aAAa,EACnB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;IAEtC;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,OAAO;;gBAGjC,MAAM,CAAC,EAAE,qBAAqB;IAI1C;;;OAGG;IACH,aAAa;IAIb;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,mBAAmB,IAAI,aAAa;IAIpC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,oBAAoB;CAwC9D"}
|