@spinajs/orm-sql 2.0.180 → 2.0.182

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.
@@ -1,1033 +1,1033 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.SqlDropEventQueryCompiler = exports.SqlEventQueryCompiler = exports.SqlAlterColumnQueryCompiler = exports.SqlColumnQueryCompiler = exports.SqlTableQueryCompiler = exports.SqlTableHistoryQueryCompiler = exports.SqlTruncateTableQueryCompiler = exports.SqlTableCloneQueryCompiler = exports.SqlAlterTableQueryCompiler = exports.SqlDropTableQueryCompiler = exports.SqlInsertQueryCompiler = exports.SqlIndexQueryCompiler = exports.SqlOnDuplicateQueryCompiler = exports.SqlDeleteQueryCompiler = exports.SqlUpdateQueryCompiler = exports.SqlSelectQueryCompiler = exports.SqlJoinCompiler = exports.SqlWhereCompiler = exports.SqlColumnsCompiler = exports.SqlGroupByCompiler = exports.SqlLimitQueryCompiler = exports.SqlForeignKeyQueryCompiler = exports.SqlWithRecursiveCompiler = exports.SqlOrderByQueryCompiler = exports.SqlQueryCompiler = exports.SqlTableAliasCompiler = void 0;
16
- /* eslint-disable @typescript-eslint/no-unsafe-call */
17
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
18
- /* eslint-disable @typescript-eslint/no-empty-interface */
19
- /* eslint-disable prettier/prettier */
20
- const exceptions_1 = require("@spinajs/exceptions");
21
- const orm_1 = require("@spinajs/orm");
22
- const typescript_mix_1 = require("typescript-mix");
23
- const di_1 = require("@spinajs/di");
24
- const lodash_1 = __importDefault(require("lodash"));
25
- let SqlTableAliasCompiler = class SqlTableAliasCompiler {
26
- compile(builder, tbl) {
27
- let table = '';
28
- if (builder.Database) {
29
- table += `\`${builder.Database}\`.`;
30
- }
31
- table += `\`${tbl ? tbl : builder.Table}\``;
32
- if (builder.TableAlias) {
33
- table += ` as \`${builder.TableAlias}\``;
34
- }
35
- return table;
36
- }
37
- };
38
- SqlTableAliasCompiler = __decorate([
39
- (0, di_1.NewInstance)()
40
- ], SqlTableAliasCompiler);
41
- exports.SqlTableAliasCompiler = SqlTableAliasCompiler;
42
- let SqlQueryCompiler = class SqlQueryCompiler extends orm_1.SelectQueryCompiler {
43
- constructor(_builder, _container) {
44
- super();
45
- this._builder = _builder;
46
- this._container = _container;
47
- if (_builder === null && _builder === undefined) {
48
- throw new exceptions_1.InvalidArgument('builder cannot be null or undefined');
49
- }
50
- }
51
- tryConvertValue(v) {
52
- let val = v;
53
- const converters = this._container.get('__orm_db_value_converters__');
54
- if (converters && v && converters.has(v.constructor.name)) {
55
- const converter = this._container.resolve(converters.get(v.constructor.name));
56
- val = converter.toDB(val, null, null);
57
- }
58
- return val;
59
- }
60
- };
61
- SqlQueryCompiler = __decorate([
62
- (0, di_1.NewInstance)(),
63
- __metadata("design:paramtypes", [Object, Object])
64
- ], SqlQueryCompiler);
65
- exports.SqlQueryCompiler = SqlQueryCompiler;
66
- let SqlOrderByQueryCompiler = class SqlOrderByQueryCompiler extends orm_1.OrderByQueryCompiler {
67
- constructor(builder) {
68
- super();
69
- if (!builder) {
70
- throw new exceptions_1.InvalidOperation('builder cannot be null or undefined');
71
- }
72
- this._builder = builder;
73
- }
74
- compile() {
75
- const sort = this._builder.getSort();
76
- let stmt = '';
77
- const bindings = [];
78
- if (sort) {
79
- stmt = ` ORDER BY ${sort.column} ${sort.order}`;
80
- }
81
- return {
82
- bindings,
83
- expression: stmt,
84
- };
85
- }
86
- };
87
- SqlOrderByQueryCompiler = __decorate([
88
- (0, di_1.NewInstance)(),
89
- __metadata("design:paramtypes", [orm_1.OrderByBuilder])
90
- ], SqlOrderByQueryCompiler);
91
- exports.SqlOrderByQueryCompiler = SqlOrderByQueryCompiler;
92
- let SqlWithRecursiveCompiler = class SqlWithRecursiveCompiler {
93
- recursive(builder) {
94
- const statement = builder.CteRecursive.build();
95
- let exprr = `WITH RECURSIVE recursive_cte(${statement.Statements[0]}) AS`;
96
- exprr += ` ( `;
97
- exprr += statement.Statements[1];
98
- exprr += ` UNION ALL `;
99
- exprr += statement.Statements[2];
100
- exprr += ` ) `;
101
- exprr += 'SELECT * FROM recursive_cte';
102
- return {
103
- bindings: statement.Bindings,
104
- expression: exprr,
105
- };
106
- }
107
- };
108
- SqlWithRecursiveCompiler = __decorate([
109
- (0, di_1.NewInstance)()
110
- ], SqlWithRecursiveCompiler);
111
- exports.SqlWithRecursiveCompiler = SqlWithRecursiveCompiler;
112
- let SqlForeignKeyQueryCompiler = class SqlForeignKeyQueryCompiler {
113
- constructor(_builder) {
114
- this._builder = _builder;
115
- if (!_builder) {
116
- throw new Error('foreign key query builder cannot be null');
117
- }
118
- }
119
- compile() {
120
- const exprr = `FOREIGN KEY (${this._builder.ForeignKeyField}) REFERENCES ${this._builder.Table}(${this._builder.PrimaryKey}) ON DELETE ${this._builder.OnDeleteAction} ON UPDATE ${this._builder.OnUpdateAction}`;
121
- return {
122
- bindings: [],
123
- expression: exprr,
124
- };
125
- }
126
- };
127
- SqlForeignKeyQueryCompiler = __decorate([
128
- (0, di_1.NewInstance)(),
129
- __metadata("design:paramtypes", [orm_1.ForeignKeyBuilder])
130
- ], SqlForeignKeyQueryCompiler);
131
- exports.SqlForeignKeyQueryCompiler = SqlForeignKeyQueryCompiler;
132
- let SqlLimitQueryCompiler = class SqlLimitQueryCompiler extends orm_1.LimitQueryCompiler {
133
- constructor(builder) {
134
- super();
135
- if (!builder) {
136
- throw new exceptions_1.InvalidOperation('builder cannot be null or undefined');
137
- }
138
- this._builder = builder;
139
- }
140
- compile() {
141
- const limits = this._builder.getLimits();
142
- const bindings = [];
143
- let stmt = '';
144
- if (limits.limit > 0) {
145
- stmt += ` LIMIT ?`;
146
- bindings.push(limits.limit);
147
- }
148
- else {
149
- if (limits.offset > 0) {
150
- stmt += ` LIMIT 18446744073709551615`;
151
- }
152
- }
153
- if (limits.offset > 0) {
154
- stmt += ` OFFSET ?`;
155
- bindings.push(limits.offset);
156
- }
157
- return {
158
- bindings,
159
- expression: stmt,
160
- };
161
- }
162
- };
163
- SqlLimitQueryCompiler = __decorate([
164
- (0, di_1.NewInstance)(),
165
- __metadata("design:paramtypes", [orm_1.LimitBuilder])
166
- ], SqlLimitQueryCompiler);
167
- exports.SqlLimitQueryCompiler = SqlLimitQueryCompiler;
168
- let SqlGroupByCompiler = class SqlGroupByCompiler {
169
- group(builder) {
170
- let bindings = [];
171
- let stmt = ' GROUP BY ';
172
- const builds = builder.GroupStatements.map((x) => x.build());
173
- stmt += builds.map((x) => x.Statements).join(',');
174
- bindings = builds.map((x) => x.Bindings);
175
- return {
176
- bindings,
177
- expression: builds.length != 0 ? stmt : '',
178
- };
179
- }
180
- };
181
- SqlGroupByCompiler = __decorate([
182
- (0, di_1.NewInstance)()
183
- ], SqlGroupByCompiler);
184
- exports.SqlGroupByCompiler = SqlGroupByCompiler;
185
- let SqlColumnsCompiler = class SqlColumnsCompiler {
186
- columns(builder) {
187
- return {
188
- bindings: [],
189
- expression: builder
190
- .getColumns()
191
- .map((c) => {
192
- return c.build().Statements[0];
193
- })
194
- .join(','),
195
- };
196
- }
197
- };
198
- SqlColumnsCompiler = __decorate([
199
- (0, di_1.NewInstance)()
200
- ], SqlColumnsCompiler);
201
- exports.SqlColumnsCompiler = SqlColumnsCompiler;
202
- let SqlWhereCompiler = class SqlWhereCompiler {
203
- where(builder) {
204
- const where = [];
205
- const bindings = [];
206
- builder.Statements.map((x) => {
207
- return x.build();
208
- }).forEach((r) => {
209
- where.push(...r.Statements);
210
- if (Array.isArray(r.Bindings)) {
211
- bindings.push(...r.Bindings);
212
- }
213
- });
214
- return {
215
- bindings,
216
- expression: where.join(` ${builder.Op.toUpperCase()} `),
217
- };
218
- }
219
- };
220
- SqlWhereCompiler = __decorate([
221
- (0, di_1.NewInstance)()
222
- ], SqlWhereCompiler);
223
- exports.SqlWhereCompiler = SqlWhereCompiler;
224
- let SqlJoinCompiler = class SqlJoinCompiler {
225
- join(builder) {
226
- const result = builder.JoinStatements.map((s) => s.build());
227
- return {
228
- bindings: lodash_1.default.flatMap(result, (r) => r.Bindings),
229
- expression: lodash_1.default.flatMap(result, (r) => r.Statements).join(' '),
230
- };
231
- }
232
- };
233
- SqlJoinCompiler = __decorate([
234
- (0, di_1.NewInstance)()
235
- ], SqlJoinCompiler);
236
- exports.SqlJoinCompiler = SqlJoinCompiler;
237
- let SqlSelectQueryCompiler = class SqlSelectQueryCompiler extends SqlQueryCompiler {
238
- constructor(_container, builder) {
239
- super(builder, _container);
240
- }
241
- compile() {
242
- if (this._builder.CteRecursive) {
243
- return this.recursive(this._builder);
244
- }
245
- const columns = this.select();
246
- const from = this.from();
247
- const limit = this.limit();
248
- const sort = this.sort();
249
- const where = this.where(this._builder);
250
- const join = this.join(this._builder);
251
- const group = this.group(this._builder);
252
- const expression = columns + ' ' + from + (join.expression ? ` ${join.expression}` : '') + (where.expression ? ` WHERE ${where.expression}` : '') + group.expression + sort.expression + limit.expression;
253
- const bindings = [];
254
- bindings.push(...join.bindings);
255
- bindings.push(...where.bindings);
256
- bindings.push(...sort.bindings);
257
- bindings.push(...limit.bindings);
258
- bindings.push(...group.bindings);
259
- return {
260
- bindings,
261
- expression: expression.trim(),
262
- };
263
- }
264
- limit() {
265
- const compiler = this._container.resolve(orm_1.LimitQueryCompiler, [this._builder]);
266
- return compiler.compile();
267
- }
268
- sort() {
269
- const compiler = this._container.resolve(orm_1.OrderByQueryCompiler, [this._builder]);
270
- return compiler.compile();
271
- }
272
- select() {
273
- let _stmt = 'SELECT ';
274
- if (this._builder.IsDistinct) {
275
- _stmt += 'DISTINCT ';
276
- }
277
- if (this._builder.getColumns().length === 0) {
278
- return _stmt + '*';
279
- }
280
- return _stmt + this.columns(this._builder).expression;
281
- }
282
- from() {
283
- return 'FROM ' + this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder);
284
- }
285
- };
286
- __decorate([
287
- (0, typescript_mix_1.use)(SqlWhereCompiler, SqlColumnsCompiler, orm_1.TableAliasCompiler, SqlJoinCompiler, SqlWithRecursiveCompiler, SqlGroupByCompiler),
288
- __metadata("design:type", Object)
289
- ], SqlSelectQueryCompiler.prototype, "this", void 0);
290
- SqlSelectQueryCompiler = __decorate([
291
- (0, di_1.NewInstance)(),
292
- (0, di_1.Inject)(di_1.Container),
293
- __metadata("design:paramtypes", [Object, orm_1.SelectQueryBuilder])
294
- ], SqlSelectQueryCompiler);
295
- exports.SqlSelectQueryCompiler = SqlSelectQueryCompiler;
296
- let SqlUpdateQueryCompiler = class SqlUpdateQueryCompiler extends SqlQueryCompiler {
297
- constructor(_container, builder) {
298
- super(builder, _container);
299
- this._container = _container;
300
- }
301
- compile() {
302
- const table = this.table();
303
- const set = this.set();
304
- const where = this.where(this._builder);
305
- const bindings = [];
306
- bindings.push(...set.bindings);
307
- bindings.push(...where.bindings);
308
- return {
309
- bindings,
310
- expression: `${table} ${set.expression} WHERE ${where.expression}`,
311
- };
312
- }
313
- set() {
314
- let bindings = [];
315
- const exprr = [];
316
- for (const prop of Object.keys(this._builder.Value)) {
317
- const v = this._builder.Value[`${prop}`];
318
- exprr.push(`\`${prop}\` = ?`);
319
- bindings = bindings.concat(this.tryConvertValue(v));
320
- }
321
- return {
322
- bindings,
323
- expression: exprr.join(','),
324
- };
325
- }
326
- table() {
327
- return `UPDATE ${this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder)} SET`;
328
- }
329
- };
330
- __decorate([
331
- (0, typescript_mix_1.use)(SqlWhereCompiler, orm_1.TableAliasCompiler),
332
- __metadata("design:type", Object)
333
- ], SqlUpdateQueryCompiler.prototype, "this", void 0);
334
- SqlUpdateQueryCompiler = __decorate([
335
- (0, di_1.NewInstance)(),
336
- (0, di_1.Inject)(di_1.Container),
337
- __metadata("design:paramtypes", [Object, orm_1.UpdateQueryBuilder])
338
- ], SqlUpdateQueryCompiler);
339
- exports.SqlUpdateQueryCompiler = SqlUpdateQueryCompiler;
340
- let SqlDeleteQueryCompiler = class SqlDeleteQueryCompiler extends SqlQueryCompiler {
341
- constructor(_container, builder) {
342
- super(builder, _container);
343
- }
344
- compile() {
345
- const _bindings = [];
346
- const _from = this.from();
347
- const _limit = this.limit();
348
- const _where = this.where(this._builder);
349
- let _expression = '';
350
- _expression = _from + (_where.expression ? ` WHERE ${_where.expression}` : '') + _limit.expression;
351
- _bindings.push(..._where.bindings);
352
- _bindings.push(..._limit.bindings);
353
- return {
354
- bindings: _bindings,
355
- expression: _expression.trim(),
356
- };
357
- }
358
- limit() {
359
- const compiler = this._container.resolve(orm_1.LimitQueryCompiler, [this._builder]);
360
- return compiler.compile();
361
- }
362
- from() {
363
- return `DELETE FROM ${this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder)}`;
364
- }
365
- };
366
- __decorate([
367
- (0, typescript_mix_1.use)(SqlWhereCompiler, orm_1.TableAliasCompiler),
368
- __metadata("design:type", Object)
369
- ], SqlDeleteQueryCompiler.prototype, "this", void 0);
370
- SqlDeleteQueryCompiler = __decorate([
371
- (0, di_1.NewInstance)(),
372
- (0, di_1.Inject)(di_1.Container),
373
- __metadata("design:paramtypes", [Object, orm_1.DeleteQueryBuilder])
374
- ], SqlDeleteQueryCompiler);
375
- exports.SqlDeleteQueryCompiler = SqlDeleteQueryCompiler;
376
- let SqlOnDuplicateQueryCompiler = class SqlOnDuplicateQueryCompiler {
377
- constructor(builder) {
378
- this._builder = builder;
379
- }
380
- compile() {
381
- const columns = this._builder
382
- .getColumnsToUpdate()
383
- .map((c) => {
384
- if (lodash_1.default.isString(c)) {
385
- return `\`${c}\` = ?`;
386
- }
387
- else {
388
- return c.Query;
389
- }
390
- })
391
- .join(',');
392
- const parent = this._builder.getParent();
393
- const valueMap = parent.getColumns().map((c) => c.Column);
394
- const bindings = this._builder.getColumnsToUpdate().map((c) => {
395
- if (lodash_1.default.isString(c)) {
396
- return parent.Values[0][valueMap.indexOf(c)];
397
- }
398
- else {
399
- return c.Bindings;
400
- }
401
- });
402
- return {
403
- bindings,
404
- expression: `ON DUPLICATE KEY UPDATE ${columns}`,
405
- };
406
- }
407
- };
408
- SqlOnDuplicateQueryCompiler = __decorate([
409
- (0, di_1.NewInstance)(),
410
- __metadata("design:paramtypes", [orm_1.OnDuplicateQueryBuilder])
411
- ], SqlOnDuplicateQueryCompiler);
412
- exports.SqlOnDuplicateQueryCompiler = SqlOnDuplicateQueryCompiler;
413
- let SqlIndexQueryCompiler = class SqlIndexQueryCompiler extends orm_1.IndexQueryCompiler {
414
- constructor(builder) {
415
- super();
416
- this._builder = builder;
417
- }
418
- compile() {
419
- return {
420
- bindings: [],
421
- expression: `CREATE ${this._builder.Unique ? 'UNIQUE ' : ''}INDEX \`${this._builder.Name}\` ON \`${this._builder.Table}\` (${this._builder.Columns.map((c) => `\`${c}\``).join(',')});`,
422
- };
423
- }
424
- };
425
- SqlIndexQueryCompiler = __decorate([
426
- (0, di_1.NewInstance)(),
427
- __metadata("design:paramtypes", [orm_1.IndexQueryBuilder])
428
- ], SqlIndexQueryCompiler);
429
- exports.SqlIndexQueryCompiler = SqlIndexQueryCompiler;
430
- let SqlInsertQueryCompiler = class SqlInsertQueryCompiler extends SqlQueryCompiler {
431
- constructor(_container, builder) {
432
- super(builder, _container);
433
- }
434
- compile() {
435
- const into = this.into();
436
- const columns = this.columns();
437
- const values = this.values();
438
- const upsort = this.upsort();
439
- return {
440
- bindings: values.bindings.concat(upsort.bindings),
441
- expression: `${into} ${columns} ${values.data} ${upsort.expression}`.trim(),
442
- };
443
- }
444
- upsort() {
445
- if (this._builder.Update) {
446
- return this._container.resolve(orm_1.OnDuplicateQueryCompiler, [this._builder.DuplicateQueryBuilder]).compile();
447
- }
448
- return {
449
- bindings: [],
450
- expression: '',
451
- };
452
- }
453
- values() {
454
- if (this._builder.Values.length === 0) {
455
- throw new exceptions_1.InvalidArgument('values count invalid');
456
- }
457
- const bindings = [];
458
- let data = 'VALUES ';
459
- data += this._builder.Values.map((val) => {
460
- const toInsert = val
461
- .filter((v, i) => {
462
- // eslint-disable-next-line security/detect-object-injection
463
- const descriptor = this._builder.getColumns()[i].Descriptor;
464
- if (descriptor) {
465
- if (!descriptor.Nullable && (v === null || v === undefined) && !descriptor.AutoIncrement) {
466
- throw new exceptions_1.InvalidArgument(`value column ${descriptor.Name} cannot be null`);
467
- }
468
- if (descriptor.AutoIncrement && descriptor.PrimaryKey)
469
- return false;
470
- }
471
- return true;
472
- })
473
- .map((v) => {
474
- if (v === undefined) {
475
- return 'DEFAULT';
476
- }
477
- if (v === null) {
478
- return 'NULL';
479
- }
480
- bindings.push(this.tryConvertValue(v));
481
- return '?';
482
- });
483
- return `(` + toInsert.join(',') + ')';
484
- }).join(',');
485
- return {
486
- bindings,
487
- data,
488
- };
489
- }
490
- columns() {
491
- const columns = this._builder
492
- .getColumns()
493
- .filter((c) => {
494
- const descriptor = c.Descriptor;
495
- if (descriptor && descriptor.AutoIncrement && descriptor.PrimaryKey)
496
- return false;
497
- return true;
498
- })
499
- .map((c) => {
500
- return c.Column;
501
- })
502
- .map((c) => {
503
- return `\`${c instanceof orm_1.RawQuery ? c.Query : c}\``;
504
- });
505
- if (columns.length === 0) {
506
- throw new exceptions_1.InvalidArgument('invalid column count');
507
- }
508
- return `(` + columns.join(',') + ')';
509
- }
510
- into() {
511
- return `INSERT${this._builder.Ignore ? ' IGNORE' : ''} INTO ${this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder)}`;
512
- }
513
- };
514
- __decorate([
515
- (0, typescript_mix_1.use)(orm_1.TableAliasCompiler),
516
- __metadata("design:type", Object)
517
- ], SqlInsertQueryCompiler.prototype, "this", void 0);
518
- SqlInsertQueryCompiler = __decorate([
519
- (0, di_1.NewInstance)(),
520
- (0, di_1.Inject)(di_1.Container),
521
- __metadata("design:paramtypes", [Object, orm_1.InsertQueryBuilder])
522
- ], SqlInsertQueryCompiler);
523
- exports.SqlInsertQueryCompiler = SqlInsertQueryCompiler;
524
- let SqlDropTableQueryCompiler = class SqlDropTableQueryCompiler extends orm_1.DropTableCompiler {
525
- constructor(container, builder) {
526
- super();
527
- this.container = container;
528
- this.builder = builder;
529
- }
530
- compile() {
531
- const exists = this.builder.Exists ? ' IF EXISTS' : '';
532
- const exprr = `DROP TABLE${exists} ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
533
- return {
534
- bindings: [],
535
- expression: exprr,
536
- };
537
- }
538
- };
539
- SqlDropTableQueryCompiler = __decorate([
540
- (0, di_1.NewInstance)(),
541
- (0, di_1.Inject)(di_1.Container),
542
- __metadata("design:paramtypes", [di_1.Container, orm_1.DropTableQueryBuilder])
543
- ], SqlDropTableQueryCompiler);
544
- exports.SqlDropTableQueryCompiler = SqlDropTableQueryCompiler;
545
- let SqlAlterTableQueryCompiler = class SqlAlterTableQueryCompiler extends orm_1.AlterTableQueryCompiler {
546
- constructor(container, builder) {
547
- super();
548
- this.container = container;
549
- this.builder = builder;
550
- }
551
- compile() {
552
- const _table = this._table();
553
- let _outputs = [];
554
- if (this.builder.DroppedColumns.length !== 0) {
555
- _outputs = _outputs.concat(this.builder.DroppedColumns.map((c) => {
556
- return {
557
- bindings: [],
558
- expression: `${_table} DROP COLUMN ${c}`,
559
- };
560
- }));
561
- }
562
- if (this.builder.NewTableName) {
563
- _outputs.push({
564
- bindings: [],
565
- expression: `${_table} RENAME TO ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder, this.builder.NewTableName)}`,
566
- });
567
- }
568
- if (this.builder.Columns.length !== 0) {
569
- _outputs = _outputs.concat(this.builder.Columns.map((c) => {
570
- const compiler = this.container.resolve(orm_1.AlterColumnQueryCompiler, [c]).compile();
571
- return {
572
- bindings: compiler.bindings,
573
- expression: `${_table} ${compiler.expression}`,
574
- };
575
- }));
576
- }
577
- return _outputs;
578
- }
579
- _table() {
580
- return `ALTER TABLE ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
581
- }
582
- };
583
- SqlAlterTableQueryCompiler = __decorate([
584
- (0, di_1.NewInstance)(),
585
- (0, di_1.Inject)(di_1.Container),
586
- __metadata("design:paramtypes", [di_1.Container, orm_1.AlterTableQueryBuilder])
587
- ], SqlAlterTableQueryCompiler);
588
- exports.SqlAlterTableQueryCompiler = SqlAlterTableQueryCompiler;
589
- let SqlTableCloneQueryCompiler = class SqlTableCloneQueryCompiler extends orm_1.TableCloneQueryCompiler {
590
- constructor(container, builder) {
591
- super();
592
- this.container = container;
593
- this.builder = builder;
594
- }
595
- compile() {
596
- const _tblName = this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder, this.builder.CloneSource);
597
- const _table = this._table();
598
- const out1 = {
599
- bindings: [],
600
- expression: `${_table} LIKE ${_tblName}`,
601
- };
602
- if (!this.builder.Shallow) {
603
- const fOut = this.builder.Filter !== undefined
604
- ? this.builder.Filter.toDB()
605
- : {
606
- bindings: [],
607
- // if no filter is provided, copy all the data
608
- expression: `SELECT * FROM ${_tblName}`,
609
- };
610
- const fExprr = `INSERT INTO \`${this.builder.Table}\` ${fOut.expression}`;
611
- return [
612
- out1,
613
- {
614
- bindings: fOut.bindings,
615
- expression: fExprr,
616
- },
617
- ];
618
- }
619
- return [out1];
620
- }
621
- _table() {
622
- return `CREATE${this.builder.Temporary ? ' TEMPORARY ' : ' '}TABLE ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
623
- }
624
- };
625
- __decorate([
626
- (0, typescript_mix_1.use)(orm_1.TableAliasCompiler),
627
- __metadata("design:type", Object)
628
- ], SqlTableCloneQueryCompiler.prototype, "this", void 0);
629
- SqlTableCloneQueryCompiler = __decorate([
630
- (0, di_1.NewInstance)(),
631
- (0, di_1.Inject)(di_1.Container),
632
- __metadata("design:paramtypes", [di_1.Container, orm_1.CloneTableQueryBuilder])
633
- ], SqlTableCloneQueryCompiler);
634
- exports.SqlTableCloneQueryCompiler = SqlTableCloneQueryCompiler;
635
- let SqlTruncateTableQueryCompiler = class SqlTruncateTableQueryCompiler extends orm_1.TableQueryCompiler {
636
- constructor(container, builder) {
637
- super();
638
- this.container = container;
639
- this.builder = builder;
640
- }
641
- compile() {
642
- return {
643
- bindings: [],
644
- expression: `TRUNCATE TABLE ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`,
645
- };
646
- }
647
- };
648
- SqlTruncateTableQueryCompiler = __decorate([
649
- (0, di_1.NewInstance)(),
650
- __metadata("design:paramtypes", [di_1.Container, orm_1.TableQueryBuilder])
651
- ], SqlTruncateTableQueryCompiler);
652
- exports.SqlTruncateTableQueryCompiler = SqlTruncateTableQueryCompiler;
653
- let SqlTableHistoryQueryCompiler = class SqlTableHistoryQueryCompiler extends orm_1.TableHistoryQueryCompiler {
654
- constructor(container, builder) {
655
- super();
656
- this.container = container;
657
- this.builder = builder;
658
- }
659
- compile() {
660
- const tblAliasCompiler = this.container.resolve(orm_1.TableAliasCompiler);
661
- const hTtblName = tblAliasCompiler.compile(this.builder, `${this.builder.Table}__history`);
662
- const tblName = tblAliasCompiler.compile(this.builder, `${this.builder.Table}`);
663
- const hTriggerName = `${this.builder.Table}__history`;
664
- const tblTriggerName = this.builder.Table;
665
- const dropUnique = this.builder.Columns.filter((c) => c.Unique).map((c) => {
666
- return {
667
- bindings: [],
668
- expression: `ALTER TABLE ${hTtblName} DROP INDEX ${c.Name}`,
669
- };
670
- });
671
- const pKey = this.builder.Columns.find((c) => c.PrimaryKey);
672
- return [
673
- // clone table
674
- {
675
- bindings: [],
676
- expression: `CREATE TABLE ${hTtblName} LIKE ${tblAliasCompiler.compile(this.builder)}`,
677
- },
678
- ...dropUnique,
679
- {
680
- bindings: [],
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SqlDropEventQueryCompiler = exports.SqlEventQueryCompiler = exports.SqlAlterColumnQueryCompiler = exports.SqlColumnQueryCompiler = exports.SqlTableQueryCompiler = exports.SqlTableHistoryQueryCompiler = exports.SqlTruncateTableQueryCompiler = exports.SqlTableCloneQueryCompiler = exports.SqlAlterTableQueryCompiler = exports.SqlDropTableQueryCompiler = exports.SqlInsertQueryCompiler = exports.SqlIndexQueryCompiler = exports.SqlOnDuplicateQueryCompiler = exports.SqlDeleteQueryCompiler = exports.SqlUpdateQueryCompiler = exports.SqlSelectQueryCompiler = exports.SqlJoinCompiler = exports.SqlWhereCompiler = exports.SqlColumnsCompiler = exports.SqlGroupByCompiler = exports.SqlLimitQueryCompiler = exports.SqlForeignKeyQueryCompiler = exports.SqlWithRecursiveCompiler = exports.SqlOrderByQueryCompiler = exports.SqlQueryCompiler = exports.SqlTableAliasCompiler = void 0;
16
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
17
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
18
+ /* eslint-disable @typescript-eslint/no-empty-interface */
19
+ /* eslint-disable prettier/prettier */
20
+ const exceptions_1 = require("@spinajs/exceptions");
21
+ const orm_1 = require("@spinajs/orm");
22
+ const typescript_mix_1 = require("typescript-mix");
23
+ const di_1 = require("@spinajs/di");
24
+ const lodash_1 = __importDefault(require("lodash"));
25
+ let SqlTableAliasCompiler = class SqlTableAliasCompiler {
26
+ compile(builder, tbl) {
27
+ let table = '';
28
+ if (builder.Database) {
29
+ table += `\`${builder.Database}\`.`;
30
+ }
31
+ table += `\`${tbl ? tbl : builder.Table}\``;
32
+ if (builder.TableAlias) {
33
+ table += ` as \`${builder.TableAlias}\``;
34
+ }
35
+ return table;
36
+ }
37
+ };
38
+ exports.SqlTableAliasCompiler = SqlTableAliasCompiler;
39
+ exports.SqlTableAliasCompiler = SqlTableAliasCompiler = __decorate([
40
+ (0, di_1.NewInstance)()
41
+ ], SqlTableAliasCompiler);
42
+ let SqlQueryCompiler = class SqlQueryCompiler extends orm_1.SelectQueryCompiler {
43
+ constructor(_builder, _container) {
44
+ super();
45
+ this._builder = _builder;
46
+ this._container = _container;
47
+ if (_builder === null && _builder === undefined) {
48
+ throw new exceptions_1.InvalidArgument('builder cannot be null or undefined');
49
+ }
50
+ }
51
+ tryConvertValue(v) {
52
+ let val = v;
53
+ const converters = this._container.get('__orm_db_value_converters__');
54
+ if (converters && v && converters.has(v.constructor.name)) {
55
+ const converter = this._container.resolve(converters.get(v.constructor.name));
56
+ val = converter.toDB(val, null, null);
57
+ }
58
+ return val;
59
+ }
60
+ };
61
+ exports.SqlQueryCompiler = SqlQueryCompiler;
62
+ exports.SqlQueryCompiler = SqlQueryCompiler = __decorate([
63
+ (0, di_1.NewInstance)(),
64
+ __metadata("design:paramtypes", [Object, Object])
65
+ ], SqlQueryCompiler);
66
+ let SqlOrderByQueryCompiler = class SqlOrderByQueryCompiler extends orm_1.OrderByQueryCompiler {
67
+ constructor(builder) {
68
+ super();
69
+ if (!builder) {
70
+ throw new exceptions_1.InvalidOperation('builder cannot be null or undefined');
71
+ }
72
+ this._builder = builder;
73
+ }
74
+ compile() {
75
+ const sort = this._builder.getSort();
76
+ let stmt = '';
77
+ const bindings = [];
78
+ if (sort) {
79
+ stmt = ` ORDER BY ${sort.column} ${sort.order}`;
80
+ }
81
+ return {
82
+ bindings,
83
+ expression: stmt,
84
+ };
85
+ }
86
+ };
87
+ exports.SqlOrderByQueryCompiler = SqlOrderByQueryCompiler;
88
+ exports.SqlOrderByQueryCompiler = SqlOrderByQueryCompiler = __decorate([
89
+ (0, di_1.NewInstance)(),
90
+ __metadata("design:paramtypes", [orm_1.OrderByBuilder])
91
+ ], SqlOrderByQueryCompiler);
92
+ let SqlWithRecursiveCompiler = class SqlWithRecursiveCompiler {
93
+ recursive(builder) {
94
+ const statement = builder.CteRecursive.build();
95
+ let exprr = `WITH RECURSIVE recursive_cte(${statement.Statements[0]}) AS`;
96
+ exprr += ` ( `;
97
+ exprr += statement.Statements[1];
98
+ exprr += ` UNION ALL `;
99
+ exprr += statement.Statements[2];
100
+ exprr += ` ) `;
101
+ exprr += 'SELECT * FROM recursive_cte';
102
+ return {
103
+ bindings: statement.Bindings,
104
+ expression: exprr,
105
+ };
106
+ }
107
+ };
108
+ exports.SqlWithRecursiveCompiler = SqlWithRecursiveCompiler;
109
+ exports.SqlWithRecursiveCompiler = SqlWithRecursiveCompiler = __decorate([
110
+ (0, di_1.NewInstance)()
111
+ ], SqlWithRecursiveCompiler);
112
+ let SqlForeignKeyQueryCompiler = class SqlForeignKeyQueryCompiler {
113
+ constructor(_builder) {
114
+ this._builder = _builder;
115
+ if (!_builder) {
116
+ throw new Error('foreign key query builder cannot be null');
117
+ }
118
+ }
119
+ compile() {
120
+ const exprr = `FOREIGN KEY (${this._builder.ForeignKeyField}) REFERENCES ${this._builder.Table}(${this._builder.PrimaryKey}) ON DELETE ${this._builder.OnDeleteAction} ON UPDATE ${this._builder.OnUpdateAction}`;
121
+ return {
122
+ bindings: [],
123
+ expression: exprr,
124
+ };
125
+ }
126
+ };
127
+ exports.SqlForeignKeyQueryCompiler = SqlForeignKeyQueryCompiler;
128
+ exports.SqlForeignKeyQueryCompiler = SqlForeignKeyQueryCompiler = __decorate([
129
+ (0, di_1.NewInstance)(),
130
+ __metadata("design:paramtypes", [orm_1.ForeignKeyBuilder])
131
+ ], SqlForeignKeyQueryCompiler);
132
+ let SqlLimitQueryCompiler = class SqlLimitQueryCompiler extends orm_1.LimitQueryCompiler {
133
+ constructor(builder) {
134
+ super();
135
+ if (!builder) {
136
+ throw new exceptions_1.InvalidOperation('builder cannot be null or undefined');
137
+ }
138
+ this._builder = builder;
139
+ }
140
+ compile() {
141
+ const limits = this._builder.getLimits();
142
+ const bindings = [];
143
+ let stmt = '';
144
+ if (limits.limit > 0) {
145
+ stmt += ` LIMIT ?`;
146
+ bindings.push(limits.limit);
147
+ }
148
+ else {
149
+ if (limits.offset > 0) {
150
+ stmt += ` LIMIT 18446744073709551615`;
151
+ }
152
+ }
153
+ if (limits.offset > 0) {
154
+ stmt += ` OFFSET ?`;
155
+ bindings.push(limits.offset);
156
+ }
157
+ return {
158
+ bindings,
159
+ expression: stmt,
160
+ };
161
+ }
162
+ };
163
+ exports.SqlLimitQueryCompiler = SqlLimitQueryCompiler;
164
+ exports.SqlLimitQueryCompiler = SqlLimitQueryCompiler = __decorate([
165
+ (0, di_1.NewInstance)(),
166
+ __metadata("design:paramtypes", [orm_1.LimitBuilder])
167
+ ], SqlLimitQueryCompiler);
168
+ let SqlGroupByCompiler = class SqlGroupByCompiler {
169
+ group(builder) {
170
+ let bindings = [];
171
+ let stmt = ' GROUP BY ';
172
+ const builds = builder.GroupStatements.map((x) => x.build());
173
+ stmt += builds.map((x) => x.Statements).join(',');
174
+ bindings = builds.map((x) => x.Bindings);
175
+ return {
176
+ bindings,
177
+ expression: builds.length != 0 ? stmt : '',
178
+ };
179
+ }
180
+ };
181
+ exports.SqlGroupByCompiler = SqlGroupByCompiler;
182
+ exports.SqlGroupByCompiler = SqlGroupByCompiler = __decorate([
183
+ (0, di_1.NewInstance)()
184
+ ], SqlGroupByCompiler);
185
+ let SqlColumnsCompiler = class SqlColumnsCompiler {
186
+ columns(builder) {
187
+ return {
188
+ bindings: [],
189
+ expression: builder
190
+ .getColumns()
191
+ .map((c) => {
192
+ return c.build().Statements[0];
193
+ })
194
+ .join(','),
195
+ };
196
+ }
197
+ };
198
+ exports.SqlColumnsCompiler = SqlColumnsCompiler;
199
+ exports.SqlColumnsCompiler = SqlColumnsCompiler = __decorate([
200
+ (0, di_1.NewInstance)()
201
+ ], SqlColumnsCompiler);
202
+ let SqlWhereCompiler = class SqlWhereCompiler {
203
+ where(builder) {
204
+ const where = [];
205
+ const bindings = [];
206
+ builder.Statements.map((x) => {
207
+ return x.build();
208
+ }).forEach((r) => {
209
+ where.push(...r.Statements);
210
+ if (Array.isArray(r.Bindings)) {
211
+ bindings.push(...r.Bindings);
212
+ }
213
+ });
214
+ return {
215
+ bindings,
216
+ expression: where.join(` ${builder.Op.toUpperCase()} `),
217
+ };
218
+ }
219
+ };
220
+ exports.SqlWhereCompiler = SqlWhereCompiler;
221
+ exports.SqlWhereCompiler = SqlWhereCompiler = __decorate([
222
+ (0, di_1.NewInstance)()
223
+ ], SqlWhereCompiler);
224
+ let SqlJoinCompiler = class SqlJoinCompiler {
225
+ join(builder) {
226
+ const result = builder.JoinStatements.map((s) => s.build());
227
+ return {
228
+ bindings: lodash_1.default.flatMap(result, (r) => r.Bindings),
229
+ expression: lodash_1.default.flatMap(result, (r) => r.Statements).join(' '),
230
+ };
231
+ }
232
+ };
233
+ exports.SqlJoinCompiler = SqlJoinCompiler;
234
+ exports.SqlJoinCompiler = SqlJoinCompiler = __decorate([
235
+ (0, di_1.NewInstance)()
236
+ ], SqlJoinCompiler);
237
+ let SqlSelectQueryCompiler = class SqlSelectQueryCompiler extends SqlQueryCompiler {
238
+ constructor(_container, builder) {
239
+ super(builder, _container);
240
+ }
241
+ compile() {
242
+ if (this._builder.CteRecursive) {
243
+ return this.recursive(this._builder);
244
+ }
245
+ const columns = this.select();
246
+ const from = this.from();
247
+ const limit = this.limit();
248
+ const sort = this.sort();
249
+ const where = this.where(this._builder);
250
+ const join = this.join(this._builder);
251
+ const group = this.group(this._builder);
252
+ const expression = columns + ' ' + from + (join.expression ? ` ${join.expression}` : '') + (where.expression ? ` WHERE ${where.expression}` : '') + group.expression + sort.expression + limit.expression;
253
+ const bindings = [];
254
+ bindings.push(...join.bindings);
255
+ bindings.push(...where.bindings);
256
+ bindings.push(...sort.bindings);
257
+ bindings.push(...limit.bindings);
258
+ bindings.push(...group.bindings);
259
+ return {
260
+ bindings,
261
+ expression: expression.trim(),
262
+ };
263
+ }
264
+ limit() {
265
+ const compiler = this._container.resolve(orm_1.LimitQueryCompiler, [this._builder]);
266
+ return compiler.compile();
267
+ }
268
+ sort() {
269
+ const compiler = this._container.resolve(orm_1.OrderByQueryCompiler, [this._builder]);
270
+ return compiler.compile();
271
+ }
272
+ select() {
273
+ let _stmt = 'SELECT ';
274
+ if (this._builder.IsDistinct) {
275
+ _stmt += 'DISTINCT ';
276
+ }
277
+ if (this._builder.getColumns().length === 0) {
278
+ return _stmt + '*';
279
+ }
280
+ return _stmt + this.columns(this._builder).expression;
281
+ }
282
+ from() {
283
+ return 'FROM ' + this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder);
284
+ }
285
+ };
286
+ exports.SqlSelectQueryCompiler = SqlSelectQueryCompiler;
287
+ __decorate([
288
+ (0, typescript_mix_1.use)(SqlWhereCompiler, SqlColumnsCompiler, orm_1.TableAliasCompiler, SqlJoinCompiler, SqlWithRecursiveCompiler, SqlGroupByCompiler),
289
+ __metadata("design:type", Object)
290
+ ], SqlSelectQueryCompiler.prototype, "this", void 0);
291
+ exports.SqlSelectQueryCompiler = SqlSelectQueryCompiler = __decorate([
292
+ (0, di_1.NewInstance)(),
293
+ (0, di_1.Inject)(di_1.Container),
294
+ __metadata("design:paramtypes", [Object, orm_1.SelectQueryBuilder])
295
+ ], SqlSelectQueryCompiler);
296
+ let SqlUpdateQueryCompiler = class SqlUpdateQueryCompiler extends SqlQueryCompiler {
297
+ constructor(_container, builder) {
298
+ super(builder, _container);
299
+ this._container = _container;
300
+ }
301
+ compile() {
302
+ const table = this.table();
303
+ const set = this.set();
304
+ const where = this.where(this._builder);
305
+ const bindings = [];
306
+ bindings.push(...set.bindings);
307
+ bindings.push(...where.bindings);
308
+ return {
309
+ bindings,
310
+ expression: `${table} ${set.expression} WHERE ${where.expression}`,
311
+ };
312
+ }
313
+ set() {
314
+ let bindings = [];
315
+ const exprr = [];
316
+ for (const prop of Object.keys(this._builder.Value)) {
317
+ const v = this._builder.Value[`${prop}`];
318
+ exprr.push(`\`${prop}\` = ?`);
319
+ bindings = bindings.concat(this.tryConvertValue(v));
320
+ }
321
+ return {
322
+ bindings,
323
+ expression: exprr.join(','),
324
+ };
325
+ }
326
+ table() {
327
+ return `UPDATE ${this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder)} SET`;
328
+ }
329
+ };
330
+ exports.SqlUpdateQueryCompiler = SqlUpdateQueryCompiler;
331
+ __decorate([
332
+ (0, typescript_mix_1.use)(SqlWhereCompiler, orm_1.TableAliasCompiler),
333
+ __metadata("design:type", Object)
334
+ ], SqlUpdateQueryCompiler.prototype, "this", void 0);
335
+ exports.SqlUpdateQueryCompiler = SqlUpdateQueryCompiler = __decorate([
336
+ (0, di_1.NewInstance)(),
337
+ (0, di_1.Inject)(di_1.Container),
338
+ __metadata("design:paramtypes", [Object, orm_1.UpdateQueryBuilder])
339
+ ], SqlUpdateQueryCompiler);
340
+ let SqlDeleteQueryCompiler = class SqlDeleteQueryCompiler extends SqlQueryCompiler {
341
+ constructor(_container, builder) {
342
+ super(builder, _container);
343
+ }
344
+ compile() {
345
+ const _bindings = [];
346
+ const _from = this.from();
347
+ const _limit = this.limit();
348
+ const _where = this.where(this._builder);
349
+ let _expression = '';
350
+ _expression = _from + (_where.expression ? ` WHERE ${_where.expression}` : '') + _limit.expression;
351
+ _bindings.push(..._where.bindings);
352
+ _bindings.push(..._limit.bindings);
353
+ return {
354
+ bindings: _bindings,
355
+ expression: _expression.trim(),
356
+ };
357
+ }
358
+ limit() {
359
+ const compiler = this._container.resolve(orm_1.LimitQueryCompiler, [this._builder]);
360
+ return compiler.compile();
361
+ }
362
+ from() {
363
+ return `DELETE FROM ${this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder)}`;
364
+ }
365
+ };
366
+ exports.SqlDeleteQueryCompiler = SqlDeleteQueryCompiler;
367
+ __decorate([
368
+ (0, typescript_mix_1.use)(SqlWhereCompiler, orm_1.TableAliasCompiler),
369
+ __metadata("design:type", Object)
370
+ ], SqlDeleteQueryCompiler.prototype, "this", void 0);
371
+ exports.SqlDeleteQueryCompiler = SqlDeleteQueryCompiler = __decorate([
372
+ (0, di_1.NewInstance)(),
373
+ (0, di_1.Inject)(di_1.Container),
374
+ __metadata("design:paramtypes", [Object, orm_1.DeleteQueryBuilder])
375
+ ], SqlDeleteQueryCompiler);
376
+ let SqlOnDuplicateQueryCompiler = class SqlOnDuplicateQueryCompiler {
377
+ constructor(builder) {
378
+ this._builder = builder;
379
+ }
380
+ compile() {
381
+ const columns = this._builder
382
+ .getColumnsToUpdate()
383
+ .map((c) => {
384
+ if (lodash_1.default.isString(c)) {
385
+ return `\`${c}\` = ?`;
386
+ }
387
+ else {
388
+ return c.Query;
389
+ }
390
+ })
391
+ .join(',');
392
+ const parent = this._builder.getParent();
393
+ const valueMap = parent.getColumns().map((c) => c.Column);
394
+ const bindings = this._builder.getColumnsToUpdate().map((c) => {
395
+ if (lodash_1.default.isString(c)) {
396
+ return parent.Values[0][valueMap.indexOf(c)];
397
+ }
398
+ else {
399
+ return c.Bindings;
400
+ }
401
+ });
402
+ return {
403
+ bindings,
404
+ expression: `ON DUPLICATE KEY UPDATE ${columns}`,
405
+ };
406
+ }
407
+ };
408
+ exports.SqlOnDuplicateQueryCompiler = SqlOnDuplicateQueryCompiler;
409
+ exports.SqlOnDuplicateQueryCompiler = SqlOnDuplicateQueryCompiler = __decorate([
410
+ (0, di_1.NewInstance)(),
411
+ __metadata("design:paramtypes", [orm_1.OnDuplicateQueryBuilder])
412
+ ], SqlOnDuplicateQueryCompiler);
413
+ let SqlIndexQueryCompiler = class SqlIndexQueryCompiler extends orm_1.IndexQueryCompiler {
414
+ constructor(builder) {
415
+ super();
416
+ this._builder = builder;
417
+ }
418
+ compile() {
419
+ return {
420
+ bindings: [],
421
+ expression: `CREATE ${this._builder.Unique ? 'UNIQUE ' : ''}INDEX \`${this._builder.Name}\` ON \`${this._builder.Table}\` (${this._builder.Columns.map((c) => `\`${c}\``).join(',')});`,
422
+ };
423
+ }
424
+ };
425
+ exports.SqlIndexQueryCompiler = SqlIndexQueryCompiler;
426
+ exports.SqlIndexQueryCompiler = SqlIndexQueryCompiler = __decorate([
427
+ (0, di_1.NewInstance)(),
428
+ __metadata("design:paramtypes", [orm_1.IndexQueryBuilder])
429
+ ], SqlIndexQueryCompiler);
430
+ let SqlInsertQueryCompiler = class SqlInsertQueryCompiler extends SqlQueryCompiler {
431
+ constructor(_container, builder) {
432
+ super(builder, _container);
433
+ }
434
+ compile() {
435
+ const into = this.into();
436
+ const columns = this.columns();
437
+ const values = this.values();
438
+ const upsort = this.upsort();
439
+ return {
440
+ bindings: values.bindings.concat(upsort.bindings),
441
+ expression: `${into} ${columns} ${values.data} ${upsort.expression}`.trim(),
442
+ };
443
+ }
444
+ upsort() {
445
+ if (this._builder.Update) {
446
+ return this._container.resolve(orm_1.OnDuplicateQueryCompiler, [this._builder.DuplicateQueryBuilder]).compile();
447
+ }
448
+ return {
449
+ bindings: [],
450
+ expression: '',
451
+ };
452
+ }
453
+ values() {
454
+ if (this._builder.Values.length === 0) {
455
+ throw new exceptions_1.InvalidArgument('values count invalid');
456
+ }
457
+ const bindings = [];
458
+ let data = 'VALUES ';
459
+ data += this._builder.Values.map((val) => {
460
+ const toInsert = val
461
+ .filter((v, i) => {
462
+ // eslint-disable-next-line security/detect-object-injection
463
+ const descriptor = this._builder.getColumns()[i].Descriptor;
464
+ if (descriptor) {
465
+ if (!descriptor.Nullable && (v === null || v === undefined) && !descriptor.AutoIncrement) {
466
+ throw new exceptions_1.InvalidArgument(`value column ${descriptor.Name} cannot be null`);
467
+ }
468
+ if (descriptor.AutoIncrement && descriptor.PrimaryKey)
469
+ return false;
470
+ }
471
+ return true;
472
+ })
473
+ .map((v) => {
474
+ if (v === undefined) {
475
+ return 'DEFAULT';
476
+ }
477
+ if (v === null) {
478
+ return 'NULL';
479
+ }
480
+ bindings.push(this.tryConvertValue(v));
481
+ return '?';
482
+ });
483
+ return `(` + toInsert.join(',') + ')';
484
+ }).join(',');
485
+ return {
486
+ bindings,
487
+ data,
488
+ };
489
+ }
490
+ columns() {
491
+ const columns = this._builder
492
+ .getColumns()
493
+ .filter((c) => {
494
+ const descriptor = c.Descriptor;
495
+ if (descriptor && descriptor.AutoIncrement && descriptor.PrimaryKey)
496
+ return false;
497
+ return true;
498
+ })
499
+ .map((c) => {
500
+ return c.Column;
501
+ })
502
+ .map((c) => {
503
+ return `\`${c instanceof orm_1.RawQuery ? c.Query : c}\``;
504
+ });
505
+ if (columns.length === 0) {
506
+ throw new exceptions_1.InvalidArgument('invalid column count');
507
+ }
508
+ return `(` + columns.join(',') + ')';
509
+ }
510
+ into() {
511
+ return `INSERT${this._builder.Ignore ? ' IGNORE' : ''} INTO ${this._container.resolve(orm_1.TableAliasCompiler).compile(this._builder)}`;
512
+ }
513
+ };
514
+ exports.SqlInsertQueryCompiler = SqlInsertQueryCompiler;
515
+ __decorate([
516
+ (0, typescript_mix_1.use)(orm_1.TableAliasCompiler),
517
+ __metadata("design:type", Object)
518
+ ], SqlInsertQueryCompiler.prototype, "this", void 0);
519
+ exports.SqlInsertQueryCompiler = SqlInsertQueryCompiler = __decorate([
520
+ (0, di_1.NewInstance)(),
521
+ (0, di_1.Inject)(di_1.Container),
522
+ __metadata("design:paramtypes", [Object, orm_1.InsertQueryBuilder])
523
+ ], SqlInsertQueryCompiler);
524
+ let SqlDropTableQueryCompiler = class SqlDropTableQueryCompiler extends orm_1.DropTableCompiler {
525
+ constructor(container, builder) {
526
+ super();
527
+ this.container = container;
528
+ this.builder = builder;
529
+ }
530
+ compile() {
531
+ const exists = this.builder.Exists ? ' IF EXISTS' : '';
532
+ const exprr = `DROP TABLE${exists} ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
533
+ return {
534
+ bindings: [],
535
+ expression: exprr,
536
+ };
537
+ }
538
+ };
539
+ exports.SqlDropTableQueryCompiler = SqlDropTableQueryCompiler;
540
+ exports.SqlDropTableQueryCompiler = SqlDropTableQueryCompiler = __decorate([
541
+ (0, di_1.NewInstance)(),
542
+ (0, di_1.Inject)(di_1.Container),
543
+ __metadata("design:paramtypes", [di_1.Container, orm_1.DropTableQueryBuilder])
544
+ ], SqlDropTableQueryCompiler);
545
+ let SqlAlterTableQueryCompiler = class SqlAlterTableQueryCompiler extends orm_1.AlterTableQueryCompiler {
546
+ constructor(container, builder) {
547
+ super();
548
+ this.container = container;
549
+ this.builder = builder;
550
+ }
551
+ compile() {
552
+ const _table = this._table();
553
+ let _outputs = [];
554
+ if (this.builder.DroppedColumns.length !== 0) {
555
+ _outputs = _outputs.concat(this.builder.DroppedColumns.map((c) => {
556
+ return {
557
+ bindings: [],
558
+ expression: `${_table} DROP COLUMN ${c}`,
559
+ };
560
+ }));
561
+ }
562
+ if (this.builder.NewTableName) {
563
+ _outputs.push({
564
+ bindings: [],
565
+ expression: `${_table} RENAME TO ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder, this.builder.NewTableName)}`,
566
+ });
567
+ }
568
+ if (this.builder.Columns.length !== 0) {
569
+ _outputs = _outputs.concat(this.builder.Columns.map((c) => {
570
+ const compiler = this.container.resolve(orm_1.AlterColumnQueryCompiler, [c]).compile();
571
+ return {
572
+ bindings: compiler.bindings,
573
+ expression: `${_table} ${compiler.expression}`,
574
+ };
575
+ }));
576
+ }
577
+ return _outputs;
578
+ }
579
+ _table() {
580
+ return `ALTER TABLE ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
581
+ }
582
+ };
583
+ exports.SqlAlterTableQueryCompiler = SqlAlterTableQueryCompiler;
584
+ exports.SqlAlterTableQueryCompiler = SqlAlterTableQueryCompiler = __decorate([
585
+ (0, di_1.NewInstance)(),
586
+ (0, di_1.Inject)(di_1.Container),
587
+ __metadata("design:paramtypes", [di_1.Container, orm_1.AlterTableQueryBuilder])
588
+ ], SqlAlterTableQueryCompiler);
589
+ let SqlTableCloneQueryCompiler = class SqlTableCloneQueryCompiler extends orm_1.TableCloneQueryCompiler {
590
+ constructor(container, builder) {
591
+ super();
592
+ this.container = container;
593
+ this.builder = builder;
594
+ }
595
+ compile() {
596
+ const _tblName = this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder, this.builder.CloneSource);
597
+ const _table = this._table();
598
+ const out1 = {
599
+ bindings: [],
600
+ expression: `${_table} LIKE ${_tblName}`,
601
+ };
602
+ if (!this.builder.Shallow) {
603
+ const fOut = this.builder.Filter !== undefined
604
+ ? this.builder.Filter.toDB()
605
+ : {
606
+ bindings: [],
607
+ // if no filter is provided, copy all the data
608
+ expression: `SELECT * FROM ${_tblName}`,
609
+ };
610
+ const fExprr = `INSERT INTO \`${this.builder.Table}\` ${fOut.expression}`;
611
+ return [
612
+ out1,
613
+ {
614
+ bindings: fOut.bindings,
615
+ expression: fExprr,
616
+ },
617
+ ];
618
+ }
619
+ return [out1];
620
+ }
621
+ _table() {
622
+ return `CREATE${this.builder.Temporary ? ' TEMPORARY ' : ' '}TABLE ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
623
+ }
624
+ };
625
+ exports.SqlTableCloneQueryCompiler = SqlTableCloneQueryCompiler;
626
+ __decorate([
627
+ (0, typescript_mix_1.use)(orm_1.TableAliasCompiler),
628
+ __metadata("design:type", Object)
629
+ ], SqlTableCloneQueryCompiler.prototype, "this", void 0);
630
+ exports.SqlTableCloneQueryCompiler = SqlTableCloneQueryCompiler = __decorate([
631
+ (0, di_1.NewInstance)(),
632
+ (0, di_1.Inject)(di_1.Container),
633
+ __metadata("design:paramtypes", [di_1.Container, orm_1.CloneTableQueryBuilder])
634
+ ], SqlTableCloneQueryCompiler);
635
+ let SqlTruncateTableQueryCompiler = class SqlTruncateTableQueryCompiler extends orm_1.TableQueryCompiler {
636
+ constructor(container, builder) {
637
+ super();
638
+ this.container = container;
639
+ this.builder = builder;
640
+ }
641
+ compile() {
642
+ return {
643
+ bindings: [],
644
+ expression: `TRUNCATE TABLE ${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`,
645
+ };
646
+ }
647
+ };
648
+ exports.SqlTruncateTableQueryCompiler = SqlTruncateTableQueryCompiler;
649
+ exports.SqlTruncateTableQueryCompiler = SqlTruncateTableQueryCompiler = __decorate([
650
+ (0, di_1.NewInstance)(),
651
+ __metadata("design:paramtypes", [di_1.Container, orm_1.TableQueryBuilder])
652
+ ], SqlTruncateTableQueryCompiler);
653
+ let SqlTableHistoryQueryCompiler = class SqlTableHistoryQueryCompiler extends orm_1.TableHistoryQueryCompiler {
654
+ constructor(container, builder) {
655
+ super();
656
+ this.container = container;
657
+ this.builder = builder;
658
+ }
659
+ compile() {
660
+ const tblAliasCompiler = this.container.resolve(orm_1.TableAliasCompiler);
661
+ const hTtblName = tblAliasCompiler.compile(this.builder, `${this.builder.Table}__history`);
662
+ const tblName = tblAliasCompiler.compile(this.builder, `${this.builder.Table}`);
663
+ const hTriggerName = `${this.builder.Table}__history`;
664
+ const tblTriggerName = this.builder.Table;
665
+ const dropUnique = this.builder.Columns.filter((c) => c.Unique).map((c) => {
666
+ return {
667
+ bindings: [],
668
+ expression: `ALTER TABLE ${hTtblName} DROP INDEX ${c.Name}`,
669
+ };
670
+ });
671
+ const pKey = this.builder.Columns.find((c) => c.PrimaryKey);
672
+ return [
673
+ // clone table
674
+ {
675
+ bindings: [],
676
+ expression: `CREATE TABLE ${hTtblName} LIKE ${tblAliasCompiler.compile(this.builder)}`,
677
+ },
678
+ ...dropUnique,
679
+ {
680
+ bindings: [],
681
681
  expression: `ALTER TABLE ${hTtblName}
682
682
  CHANGE COLUMN ${pKey.Name} ${pKey.Name} INT NOT NULL ,
683
- DROP PRIMARY KEY;`,
684
- },
685
- // remove primary key & add history columns
686
- {
687
- bindings: [],
688
- expression: `ALTER TABLE ${hTtblName} ADD __action__ VARCHAR(8) DEFAULT 'insert' FIRST, ADD __revision__ INT(6) NOT NULL AFTER __action__, ADD __start__ DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER __revision__, ADD __end__ DATETIME AFTER __start__`,
689
- },
690
- {
691
- bindings: [],
692
- expression: `ALTER TABLE ${hTtblName} ADD PRIMARY KEY (${pKey.Name}, __revision__)`,
693
- },
694
- {
695
- bindings: [],
683
+ DROP PRIMARY KEY;`,
684
+ },
685
+ // remove primary key & add history columns
686
+ {
687
+ bindings: [],
688
+ expression: `ALTER TABLE ${hTtblName} ADD __action__ VARCHAR(8) DEFAULT 'insert' FIRST, ADD __revision__ INT(6) NOT NULL AFTER __action__, ADD __start__ DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER __revision__, ADD __end__ DATETIME AFTER __start__`,
689
+ },
690
+ {
691
+ bindings: [],
692
+ expression: `ALTER TABLE ${hTtblName} ADD PRIMARY KEY (${pKey.Name}, __revision__)`,
693
+ },
694
+ {
695
+ bindings: [],
696
696
  expression: `DELIMITER $$
697
697
  CREATE TRIGGER ${hTriggerName}__insert_trigger BEFORE INSERT ON ${hTtblName} FOR EACH ROW
698
698
  BEGIN
699
699
  DECLARE rev INT;
700
700
  SET rev = (SELECT IFNULL(MAX(__revision__), 0) FROM ${hTtblName} WHERE Id = NEW.Id);
701
701
  SET NEW.__revision__ = rev + 1;
702
- END;`,
703
- },
704
- // create tracking triggers
705
- {
706
- bindings: [],
707
- expression: `DROP TRIGGER IF EXISTS ${tblTriggerName}__insert_trigger`,
708
- },
709
- {
710
- bindings: [],
711
- expression: `DROP TRIGGER IF EXISTS ${tblTriggerName}__update_trigger`,
712
- },
713
- {
714
- bindings: [],
715
- expression: `DROP TRIGGER IF EXISTS ${tblTriggerName}__delete_trigger`,
716
- },
717
- // insert into history table & update __end__ date for all operations
718
- {
719
- bindings: [],
702
+ END;`,
703
+ },
704
+ // create tracking triggers
705
+ {
706
+ bindings: [],
707
+ expression: `DROP TRIGGER IF EXISTS ${tblTriggerName}__insert_trigger`,
708
+ },
709
+ {
710
+ bindings: [],
711
+ expression: `DROP TRIGGER IF EXISTS ${tblTriggerName}__update_trigger`,
712
+ },
713
+ {
714
+ bindings: [],
715
+ expression: `DROP TRIGGER IF EXISTS ${tblTriggerName}__delete_trigger`,
716
+ },
717
+ // insert into history table & update __end__ date for all operations
718
+ {
719
+ bindings: [],
720
720
  expression: `DELIMITER $$
721
721
  CREATE TRIGGER ${tblTriggerName}__insert_trigger AFTER INSERT ON ${tblName} FOR EACH ROW BEGIN
722
722
  DECLARE rev INT;
723
723
  SET rev = (SELECT IFNULL(MAX(__revision__), 0) FROM ${hTtblName} WHERE Id = NEW.Id);
724
724
  UPDATE ${hTtblName} SET __end__ = NOW() WHERE Id = NEW.Id AND __revision__ = rev;
725
725
  INSERT INTO ${hTtblName} SELECT 'insert', 0, NOW(), NULL, d.* FROM ${tblName} AS d WHERE d.${pKey.Name} = NEW.${pKey.Name};
726
- END;`,
727
- },
728
- {
729
- bindings: [],
726
+ END;`,
727
+ },
728
+ {
729
+ bindings: [],
730
730
  expression: `DELIMITER $$
731
731
  CREATE TRIGGER ${tblTriggerName}__update_trigger AFTER UPDATE ON ${tblName} FOR EACH ROW BEGIN
732
732
  DECLARE rev INT;
733
733
  SET rev = (SELECT IFNULL(MAX(__revision__), 0) FROM ${hTtblName} WHERE Id = NEW.Id);
734
734
  UPDATE ${hTtblName} SET __end__ = NOW() WHERE Id = NEW.Id AND __revision__ = rev;
735
735
  INSERT INTO ${hTtblName} SELECT 'update', 0, NOW(), NULL, d.* FROM ${tblName} AS d WHERE d.${pKey.Name} = NEW.${pKey.Name};
736
- END;`,
737
- },
738
- {
739
- bindings: [],
736
+ END;`,
737
+ },
738
+ {
739
+ bindings: [],
740
740
  expression: `DELIMITER $$
741
741
  CREATE TRIGGER ${tblTriggerName}__delete_trigger BEFORE DELETE ON ${tblName} FOR EACH ROW BEGIN
742
742
  DECLARE rev INT;
743
743
  SET rev = (SELECT IFNULL(MAX(__revision__), 0) FROM ${hTtblName} WHERE Id = NEW.Id);
744
744
  UPDATE ${hTtblName} SET __end__ = NOW() WHERE Id = NEW.Id AND __revision__ = rev;
745
745
  INSERT INTO ${hTtblName} SELECT 'delete', 0, NOW(), NULL, d.* FROM ${tblName} AS d WHERE d.${pKey.Name} = NEW.${pKey.Name};
746
- END;`,
747
- },
748
- ];
749
- }
750
- };
751
- SqlTableHistoryQueryCompiler = __decorate([
752
- (0, di_1.NewInstance)(),
753
- (0, di_1.Inject)(di_1.Container),
754
- __metadata("design:paramtypes", [di_1.Container, orm_1.TableQueryBuilder])
755
- ], SqlTableHistoryQueryCompiler);
756
- exports.SqlTableHistoryQueryCompiler = SqlTableHistoryQueryCompiler;
757
- let SqlTableQueryCompiler = class SqlTableQueryCompiler extends orm_1.TableQueryCompiler {
758
- constructor(container, builder) {
759
- super();
760
- this.container = container;
761
- this.builder = builder;
762
- }
763
- compile() {
764
- const _table = this._table();
765
- const _columns = this._columns();
766
- const _keys = this._foreignKeys();
767
- const _primaryKey = this._primaryKeys();
768
- const createOutput = {
769
- bindings: [],
770
- expression: `${_table} (${_columns} ${_primaryKey ? ',' + _primaryKey : ''} ${_keys ? ',' + _keys : ''})`,
771
- };
772
- if (this.builder.TrackHistory) {
773
- const hCompiler = this.container.resolve(orm_1.TableHistoryQueryCompiler, [this.builder]);
774
- return [createOutput, ...hCompiler.compile()];
775
- }
776
- else {
777
- return [createOutput];
778
- }
779
- }
780
- _columns() {
781
- return this.builder.Columns.map((c) => {
782
- return this.container.resolve(orm_1.ColumnQueryCompiler, [c]).compile().expression;
783
- }).join(',');
784
- }
785
- _foreignKeys() {
786
- return this.builder.ForeignKeys.map((f) => {
787
- return this.container.resolve(orm_1.ForeignKeyQueryCompiler, [f]).compile().expression;
788
- }).join(',');
789
- }
790
- _primaryKeys() {
791
- const _keys = this.builder.Columns.filter((x) => x.PrimaryKey)
792
- .map((c) => `\`${c.Name}\``)
793
- .join(',');
794
- if (!lodash_1.default.isEmpty(_keys)) {
795
- return `PRIMARY KEY (${_keys})`;
796
- }
797
- return '';
798
- }
799
- _table() {
800
- return `CREATE${this.builder.Temporary ? ' TEMPORARY ' : ' '}TABLE ${this.builder.CheckExists ? 'IF NOT EXISTS ' : ''}${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
801
- }
802
- };
803
- SqlTableQueryCompiler = __decorate([
804
- (0, di_1.NewInstance)(),
805
- (0, di_1.Inject)(di_1.Container),
806
- __metadata("design:paramtypes", [di_1.Container, orm_1.TableQueryBuilder])
807
- ], SqlTableQueryCompiler);
808
- exports.SqlTableQueryCompiler = SqlTableQueryCompiler;
809
- let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
810
- constructor(builder) {
811
- this.builder = builder;
812
- this._statementsMappings = {
813
- set: (builder) => `SET(${builder.Args[0].map((a) => `'${a}\'`).join(',')})`,
814
- string: (builder) => `VARCHAR(${builder.Args[0] ? builder.Args[0] : 255})`,
815
- boolean: () => `TINYINT(1)`,
816
- float: (builder) => {
817
- const _precision = builder.Args[0] ? builder.Args[0] : 8;
818
- const _scale = builder.Args[1] ? builder.Args[1] : 2;
819
- return `${builder.Type.toUpperCase()}(${_precision},${_scale})`;
820
- },
821
- double: (builder) => this._statementsMappings.float(builder),
822
- decimal: (builder) => this._statementsMappings.float(builder),
823
- enum: (builder) => `${builder.Type.toUpperCase()}(${builder.Args[0].map((a) => `'${a}'`).join(',')})`,
824
- binary: (builder) => `BINARY(${builder.Args[0] ?? 255}`,
825
- smallint: (builder) => builder.Type.toUpperCase(),
826
- tinyint: (builder) => builder.Type.toUpperCase(),
827
- mediumint: (builder) => builder.Type.toUpperCase(),
828
- int: (builder) => builder.Type.toUpperCase(),
829
- bigint: (builder) => builder.Type.toUpperCase(),
830
- tinytext: (builder) => builder.Type.toUpperCase(),
831
- mediumtext: (builder) => builder.Type.toUpperCase(),
832
- longtext: (builder) => builder.Type.toUpperCase(),
833
- text: (builder) => builder.Type.toUpperCase(),
834
- bit: (builder) => builder.Type.toUpperCase(),
835
- date: (builder) => builder.Type.toUpperCase(),
836
- time: (builder) => builder.Type.toUpperCase(),
837
- dateTime: (builder) => builder.Type.toUpperCase(),
838
- timestamp: (builder) => builder.Type.toUpperCase(),
839
- json: (builder) => builder.Type.toUpperCase(),
840
- tinyblob: (builder) => builder.Type.toUpperCase(),
841
- mediumblob: (builder) => builder.Type.toUpperCase(),
842
- longblob: (builder) => builder.Type.toUpperCase(),
843
- // COLUMN ADDITIONA PROPS
844
- unsigned: () => 'UNSIGNED',
845
- charset: (builder) => `CHARACTER SET '${builder.Charset}'`,
846
- collation: (builder) => `COLLATE '${builder.Collation}'`,
847
- notnull: () => `NOT NULL`,
848
- default: () => this._defaultCompiler(),
849
- autoincrement: () => `AUTO_INCREMENT`,
850
- comment: (builder) => `COMMENT '${builder.Comment}'`,
851
- };
852
- if (!builder) {
853
- throw new Error('column query builder cannot be null');
854
- }
855
- }
856
- compile() {
857
- const _stmt = [];
858
- _stmt.push(`\`${this.builder.Name}\``);
859
- _stmt.push(this._statementsMappings[this.builder.Type](this.builder));
860
- if (this.builder.Unsigned) {
861
- _stmt.push(this._statementsMappings.unsigned());
862
- }
863
- if (this.builder.Charset) {
864
- _stmt.push(this._statementsMappings.charset(this.builder));
865
- }
866
- if (this.builder.Collation) {
867
- _stmt.push(this._statementsMappings.collation(this.builder));
868
- }
869
- if (this.builder.NotNull) {
870
- _stmt.push(this._statementsMappings.notnull());
871
- }
872
- if (this.builder.Default) {
873
- _stmt.push(this._statementsMappings.default());
874
- }
875
- if (this.builder.AutoIncrement) {
876
- _stmt.push(this._statementsMappings.autoincrement());
877
- }
878
- if (this.builder.Comment) {
879
- _stmt.push(this._statementsMappings.comment(this.builder));
880
- }
881
- if (this.builder.Unique) {
882
- _stmt.push('UNIQUE');
883
- }
884
- return {
885
- bindings: [],
886
- expression: _stmt.filter((x) => !lodash_1.default.isEmpty(x)).join(' '),
887
- };
888
- }
889
- _defaultCompiler() {
890
- let _stmt = '';
891
- if (lodash_1.default.isNil(this.builder.Default) || (lodash_1.default.isNil(this.builder.Default.Query) && lodash_1.default.isNil(this.builder.Default.Value))) {
892
- return _stmt;
893
- }
894
- if (lodash_1.default.isString(this.builder.Default.Value)) {
895
- _stmt = `DEFAULT '${this.builder.Default.Value.trim()}'`;
896
- }
897
- else if (lodash_1.default.isNumber(this.builder.Default.Value)) {
898
- _stmt = `DEFAULT ${this.builder.Default.Value}`;
899
- }
900
- else if (this.builder.Default.Query instanceof orm_1.RawQuery) {
901
- _stmt = `DEFAULT ${this.builder.Default.Query.Query}`;
902
- }
903
- return _stmt;
904
- }
905
- };
906
- SqlColumnQueryCompiler = __decorate([
907
- (0, di_1.NewInstance)(),
908
- __metadata("design:paramtypes", [orm_1.ColumnQueryBuilder])
909
- ], SqlColumnQueryCompiler);
910
- exports.SqlColumnQueryCompiler = SqlColumnQueryCompiler;
911
- let SqlAlterColumnQueryCompiler = class SqlAlterColumnQueryCompiler extends SqlColumnQueryCompiler {
912
- constructor(builder) {
913
- super(builder);
914
- }
915
- compile() {
916
- const builder = this.builder;
917
- if (builder.AlterType === orm_1.ColumnAlterationType.Rename) {
918
- const bld = this.builder;
919
- return {
920
- bindings: [],
921
- expression: `RENAME COLUMN \`${bld.OldName}\` TO \`${bld.Name}\``,
922
- };
923
- }
924
- const cDefinition = super.compile();
925
- if (builder.AlterType === orm_1.ColumnAlterationType.Add) {
926
- return {
927
- bindings: cDefinition.bindings,
928
- expression: `ADD ${cDefinition.expression} ${builder.AfterColumn ? `AFTER \`${builder.AfterColumn}\`` : ''}`,
929
- };
930
- }
931
- if (builder.AlterType === orm_1.ColumnAlterationType.Modify) {
932
- return {
933
- bindings: cDefinition.bindings,
934
- expression: `MODIFY ${cDefinition.expression}`,
935
- };
936
- }
937
- }
938
- };
939
- SqlAlterColumnQueryCompiler = __decorate([
940
- (0, di_1.NewInstance)(),
941
- __metadata("design:paramtypes", [orm_1.AlterColumnQueryBuilder])
942
- ], SqlAlterColumnQueryCompiler);
943
- exports.SqlAlterColumnQueryCompiler = SqlAlterColumnQueryCompiler;
944
- let SqlEventQueryCompiler = class SqlEventQueryCompiler extends SqlQueryCompiler {
945
- constructor(container, builder) {
946
- super(builder, container);
947
- }
948
- compile() {
949
- const schedule = this._createSchedule();
950
- const action = this._action();
951
- return {
952
- bindings: action.bindings,
953
- expression: `CREATE EVENT ${this._builder.Name} ON SCHEDULE ${schedule} DO BEGIN ${action.expression} END`,
954
- };
955
- }
956
- _createSchedule() {
957
- if (this._builder.FromNowInverval) {
958
- return `AT CURRENT_TIMESTAMP + INTERVAL ${this._getInterval(this._builder.FromNowInverval)}`;
959
- }
960
- if (this._builder.At) {
961
- return `AT ${this._builder.At.toFormat(`yyyy-mm-dd HH:mm:ss`)}`;
962
- }
963
- if (this._builder.EveryInterval) {
964
- return `EVERY ${this._getInterval(this._builder.EveryInterval)}`;
965
- }
966
- }
967
- _getInterval(desc) {
968
- return Object.getOwnPropertyNames(desc)
969
- .map((x) => {
970
- if (desc[`${x}`] > 0) {
971
- return `${desc[`${x}`]} ${x.toUpperCase()}`;
972
- }
973
- return null;
974
- })
975
- .find((x) => x !== null);
976
- }
977
- _action() {
978
- if (this._builder.RawSql) {
979
- const res = this._builder.RawSql.build();
980
- return {
981
- expression: res.Statements.join(';'),
982
- bindings: res.Bindings,
983
- };
984
- }
985
- else {
986
- const qResult = this._builder.Queries.reduce((prev, curr) => {
987
- const res = curr.toDB();
988
- if (Array.isArray(res)) {
989
- res.forEach((x) => {
990
- prev.bindings = prev.bindings.concat(x.bindings);
991
- prev.expression.push(x.expression);
992
- });
993
- }
994
- else {
995
- prev.bindings = prev.bindings.concat(res.bindings);
996
- prev.expression.push(res.expression);
997
- }
998
- return prev;
999
- }, {
1000
- expression: [],
1001
- bindings: [],
1002
- });
1003
- return {
1004
- expression: qResult.expression.join(';'),
1005
- bindings: qResult.bindings,
1006
- };
1007
- }
1008
- }
1009
- };
1010
- SqlEventQueryCompiler = __decorate([
1011
- (0, di_1.NewInstance)(),
1012
- (0, di_1.Inject)(di_1.Container),
1013
- __metadata("design:paramtypes", [Object, orm_1.EventQueryBuilder])
1014
- ], SqlEventQueryCompiler);
1015
- exports.SqlEventQueryCompiler = SqlEventQueryCompiler;
1016
- let SqlDropEventQueryCompiler = class SqlDropEventQueryCompiler extends SqlQueryCompiler {
1017
- constructor(container, builder) {
1018
- super(builder, container);
1019
- }
1020
- compile() {
1021
- return {
1022
- bindings: [],
1023
- expression: `DROP EVENT IF EXISTS ${this._builder.Name}`,
1024
- };
1025
- }
1026
- };
1027
- SqlDropEventQueryCompiler = __decorate([
1028
- (0, di_1.NewInstance)(),
1029
- (0, di_1.Inject)(di_1.Container),
1030
- __metadata("design:paramtypes", [Object, orm_1.DropEventQueryBuilder])
1031
- ], SqlDropEventQueryCompiler);
1032
- exports.SqlDropEventQueryCompiler = SqlDropEventQueryCompiler;
746
+ END;`,
747
+ },
748
+ ];
749
+ }
750
+ };
751
+ exports.SqlTableHistoryQueryCompiler = SqlTableHistoryQueryCompiler;
752
+ exports.SqlTableHistoryQueryCompiler = SqlTableHistoryQueryCompiler = __decorate([
753
+ (0, di_1.NewInstance)(),
754
+ (0, di_1.Inject)(di_1.Container),
755
+ __metadata("design:paramtypes", [di_1.Container, orm_1.TableQueryBuilder])
756
+ ], SqlTableHistoryQueryCompiler);
757
+ let SqlTableQueryCompiler = class SqlTableQueryCompiler extends orm_1.TableQueryCompiler {
758
+ constructor(container, builder) {
759
+ super();
760
+ this.container = container;
761
+ this.builder = builder;
762
+ }
763
+ compile() {
764
+ const _table = this._table();
765
+ const _columns = this._columns();
766
+ const _keys = this._foreignKeys();
767
+ const _primaryKey = this._primaryKeys();
768
+ const createOutput = {
769
+ bindings: [],
770
+ expression: `${_table} (${_columns} ${_primaryKey ? ',' + _primaryKey : ''} ${_keys ? ',' + _keys : ''})`,
771
+ };
772
+ if (this.builder.TrackHistory) {
773
+ const hCompiler = this.container.resolve(orm_1.TableHistoryQueryCompiler, [this.builder]);
774
+ return [createOutput, ...hCompiler.compile()];
775
+ }
776
+ else {
777
+ return [createOutput];
778
+ }
779
+ }
780
+ _columns() {
781
+ return this.builder.Columns.map((c) => {
782
+ return this.container.resolve(orm_1.ColumnQueryCompiler, [c]).compile().expression;
783
+ }).join(',');
784
+ }
785
+ _foreignKeys() {
786
+ return this.builder.ForeignKeys.map((f) => {
787
+ return this.container.resolve(orm_1.ForeignKeyQueryCompiler, [f]).compile().expression;
788
+ }).join(',');
789
+ }
790
+ _primaryKeys() {
791
+ const _keys = this.builder.Columns.filter((x) => x.PrimaryKey)
792
+ .map((c) => `\`${c.Name}\``)
793
+ .join(',');
794
+ if (!lodash_1.default.isEmpty(_keys)) {
795
+ return `PRIMARY KEY (${_keys})`;
796
+ }
797
+ return '';
798
+ }
799
+ _table() {
800
+ return `CREATE${this.builder.Temporary ? ' TEMPORARY ' : ' '}TABLE ${this.builder.CheckExists ? 'IF NOT EXISTS ' : ''}${this.container.resolve(orm_1.TableAliasCompiler).compile(this.builder)}`;
801
+ }
802
+ };
803
+ exports.SqlTableQueryCompiler = SqlTableQueryCompiler;
804
+ exports.SqlTableQueryCompiler = SqlTableQueryCompiler = __decorate([
805
+ (0, di_1.NewInstance)(),
806
+ (0, di_1.Inject)(di_1.Container),
807
+ __metadata("design:paramtypes", [di_1.Container, orm_1.TableQueryBuilder])
808
+ ], SqlTableQueryCompiler);
809
+ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
810
+ constructor(builder) {
811
+ this.builder = builder;
812
+ this._statementsMappings = {
813
+ set: (builder) => `SET(${builder.Args[0].map((a) => `'${a}\'`).join(',')})`,
814
+ string: (builder) => `VARCHAR(${builder.Args[0] ? builder.Args[0] : 255})`,
815
+ boolean: () => `TINYINT(1)`,
816
+ float: (builder) => {
817
+ const _precision = builder.Args[0] ? builder.Args[0] : 8;
818
+ const _scale = builder.Args[1] ? builder.Args[1] : 2;
819
+ return `${builder.Type.toUpperCase()}(${_precision},${_scale})`;
820
+ },
821
+ double: (builder) => this._statementsMappings.float(builder),
822
+ decimal: (builder) => this._statementsMappings.float(builder),
823
+ enum: (builder) => `${builder.Type.toUpperCase()}(${builder.Args[0].map((a) => `'${a}'`).join(',')})`,
824
+ binary: (builder) => `BINARY(${builder.Args[0] ?? 255}`,
825
+ smallint: (builder) => builder.Type.toUpperCase(),
826
+ tinyint: (builder) => builder.Type.toUpperCase(),
827
+ mediumint: (builder) => builder.Type.toUpperCase(),
828
+ int: (builder) => builder.Type.toUpperCase(),
829
+ bigint: (builder) => builder.Type.toUpperCase(),
830
+ tinytext: (builder) => builder.Type.toUpperCase(),
831
+ mediumtext: (builder) => builder.Type.toUpperCase(),
832
+ longtext: (builder) => builder.Type.toUpperCase(),
833
+ text: (builder) => builder.Type.toUpperCase(),
834
+ bit: (builder) => builder.Type.toUpperCase(),
835
+ date: (builder) => builder.Type.toUpperCase(),
836
+ time: (builder) => builder.Type.toUpperCase(),
837
+ dateTime: (builder) => builder.Type.toUpperCase(),
838
+ timestamp: (builder) => builder.Type.toUpperCase(),
839
+ json: (builder) => builder.Type.toUpperCase(),
840
+ tinyblob: (builder) => builder.Type.toUpperCase(),
841
+ mediumblob: (builder) => builder.Type.toUpperCase(),
842
+ longblob: (builder) => builder.Type.toUpperCase(),
843
+ // COLUMN ADDITIONA PROPS
844
+ unsigned: () => 'UNSIGNED',
845
+ charset: (builder) => `CHARACTER SET '${builder.Charset}'`,
846
+ collation: (builder) => `COLLATE '${builder.Collation}'`,
847
+ notnull: () => `NOT NULL`,
848
+ default: () => this._defaultCompiler(),
849
+ autoincrement: () => `AUTO_INCREMENT`,
850
+ comment: (builder) => `COMMENT '${builder.Comment}'`,
851
+ };
852
+ if (!builder) {
853
+ throw new Error('column query builder cannot be null');
854
+ }
855
+ }
856
+ compile() {
857
+ const _stmt = [];
858
+ _stmt.push(`\`${this.builder.Name}\``);
859
+ _stmt.push(this._statementsMappings[this.builder.Type](this.builder));
860
+ if (this.builder.Unsigned) {
861
+ _stmt.push(this._statementsMappings.unsigned());
862
+ }
863
+ if (this.builder.Charset) {
864
+ _stmt.push(this._statementsMappings.charset(this.builder));
865
+ }
866
+ if (this.builder.Collation) {
867
+ _stmt.push(this._statementsMappings.collation(this.builder));
868
+ }
869
+ if (this.builder.NotNull) {
870
+ _stmt.push(this._statementsMappings.notnull());
871
+ }
872
+ if (this.builder.Default) {
873
+ _stmt.push(this._statementsMappings.default());
874
+ }
875
+ if (this.builder.AutoIncrement) {
876
+ _stmt.push(this._statementsMappings.autoincrement());
877
+ }
878
+ if (this.builder.Comment) {
879
+ _stmt.push(this._statementsMappings.comment(this.builder));
880
+ }
881
+ if (this.builder.Unique) {
882
+ _stmt.push('UNIQUE');
883
+ }
884
+ return {
885
+ bindings: [],
886
+ expression: _stmt.filter((x) => !lodash_1.default.isEmpty(x)).join(' '),
887
+ };
888
+ }
889
+ _defaultCompiler() {
890
+ let _stmt = '';
891
+ if (lodash_1.default.isNil(this.builder.Default) || (lodash_1.default.isNil(this.builder.Default.Query) && lodash_1.default.isNil(this.builder.Default.Value))) {
892
+ return _stmt;
893
+ }
894
+ if (lodash_1.default.isString(this.builder.Default.Value)) {
895
+ _stmt = `DEFAULT '${this.builder.Default.Value.trim()}'`;
896
+ }
897
+ else if (lodash_1.default.isNumber(this.builder.Default.Value)) {
898
+ _stmt = `DEFAULT ${this.builder.Default.Value}`;
899
+ }
900
+ else if (this.builder.Default.Query instanceof orm_1.RawQuery) {
901
+ _stmt = `DEFAULT ${this.builder.Default.Query.Query}`;
902
+ }
903
+ return _stmt;
904
+ }
905
+ };
906
+ exports.SqlColumnQueryCompiler = SqlColumnQueryCompiler;
907
+ exports.SqlColumnQueryCompiler = SqlColumnQueryCompiler = __decorate([
908
+ (0, di_1.NewInstance)(),
909
+ __metadata("design:paramtypes", [orm_1.ColumnQueryBuilder])
910
+ ], SqlColumnQueryCompiler);
911
+ let SqlAlterColumnQueryCompiler = class SqlAlterColumnQueryCompiler extends SqlColumnQueryCompiler {
912
+ constructor(builder) {
913
+ super(builder);
914
+ }
915
+ compile() {
916
+ const builder = this.builder;
917
+ if (builder.AlterType === orm_1.ColumnAlterationType.Rename) {
918
+ const bld = this.builder;
919
+ return {
920
+ bindings: [],
921
+ expression: `RENAME COLUMN \`${bld.OldName}\` TO \`${bld.Name}\``,
922
+ };
923
+ }
924
+ const cDefinition = super.compile();
925
+ if (builder.AlterType === orm_1.ColumnAlterationType.Add) {
926
+ return {
927
+ bindings: cDefinition.bindings,
928
+ expression: `ADD ${cDefinition.expression} ${builder.AfterColumn ? `AFTER \`${builder.AfterColumn}\`` : ''}`,
929
+ };
930
+ }
931
+ if (builder.AlterType === orm_1.ColumnAlterationType.Modify) {
932
+ return {
933
+ bindings: cDefinition.bindings,
934
+ expression: `MODIFY ${cDefinition.expression}`,
935
+ };
936
+ }
937
+ }
938
+ };
939
+ exports.SqlAlterColumnQueryCompiler = SqlAlterColumnQueryCompiler;
940
+ exports.SqlAlterColumnQueryCompiler = SqlAlterColumnQueryCompiler = __decorate([
941
+ (0, di_1.NewInstance)(),
942
+ __metadata("design:paramtypes", [orm_1.AlterColumnQueryBuilder])
943
+ ], SqlAlterColumnQueryCompiler);
944
+ let SqlEventQueryCompiler = class SqlEventQueryCompiler extends SqlQueryCompiler {
945
+ constructor(container, builder) {
946
+ super(builder, container);
947
+ }
948
+ compile() {
949
+ const schedule = this._createSchedule();
950
+ const action = this._action();
951
+ return {
952
+ bindings: action.bindings,
953
+ expression: `CREATE EVENT ${this._builder.Name} ON SCHEDULE ${schedule} DO BEGIN ${action.expression} END`,
954
+ };
955
+ }
956
+ _createSchedule() {
957
+ if (this._builder.FromNowInverval) {
958
+ return `AT CURRENT_TIMESTAMP + INTERVAL ${this._getInterval(this._builder.FromNowInverval)}`;
959
+ }
960
+ if (this._builder.At) {
961
+ return `AT ${this._builder.At.toFormat(`yyyy-mm-dd HH:mm:ss`)}`;
962
+ }
963
+ if (this._builder.EveryInterval) {
964
+ return `EVERY ${this._getInterval(this._builder.EveryInterval)}`;
965
+ }
966
+ }
967
+ _getInterval(desc) {
968
+ return Object.getOwnPropertyNames(desc)
969
+ .map((x) => {
970
+ if (desc[`${x}`] > 0) {
971
+ return `${desc[`${x}`]} ${x.toUpperCase()}`;
972
+ }
973
+ return null;
974
+ })
975
+ .find((x) => x !== null);
976
+ }
977
+ _action() {
978
+ if (this._builder.RawSql) {
979
+ const res = this._builder.RawSql.build();
980
+ return {
981
+ expression: res.Statements.join(';'),
982
+ bindings: res.Bindings,
983
+ };
984
+ }
985
+ else {
986
+ const qResult = this._builder.Queries.reduce((prev, curr) => {
987
+ const res = curr.toDB();
988
+ if (Array.isArray(res)) {
989
+ res.forEach((x) => {
990
+ prev.bindings = prev.bindings.concat(x.bindings);
991
+ prev.expression.push(x.expression);
992
+ });
993
+ }
994
+ else {
995
+ prev.bindings = prev.bindings.concat(res.bindings);
996
+ prev.expression.push(res.expression);
997
+ }
998
+ return prev;
999
+ }, {
1000
+ expression: [],
1001
+ bindings: [],
1002
+ });
1003
+ return {
1004
+ expression: qResult.expression.join(';'),
1005
+ bindings: qResult.bindings,
1006
+ };
1007
+ }
1008
+ }
1009
+ };
1010
+ exports.SqlEventQueryCompiler = SqlEventQueryCompiler;
1011
+ exports.SqlEventQueryCompiler = SqlEventQueryCompiler = __decorate([
1012
+ (0, di_1.NewInstance)(),
1013
+ (0, di_1.Inject)(di_1.Container),
1014
+ __metadata("design:paramtypes", [Object, orm_1.EventQueryBuilder])
1015
+ ], SqlEventQueryCompiler);
1016
+ let SqlDropEventQueryCompiler = class SqlDropEventQueryCompiler extends SqlQueryCompiler {
1017
+ constructor(container, builder) {
1018
+ super(builder, container);
1019
+ }
1020
+ compile() {
1021
+ return {
1022
+ bindings: [],
1023
+ expression: `DROP EVENT IF EXISTS ${this._builder.Name}`,
1024
+ };
1025
+ }
1026
+ };
1027
+ exports.SqlDropEventQueryCompiler = SqlDropEventQueryCompiler;
1028
+ exports.SqlDropEventQueryCompiler = SqlDropEventQueryCompiler = __decorate([
1029
+ (0, di_1.NewInstance)(),
1030
+ (0, di_1.Inject)(di_1.Container),
1031
+ __metadata("design:paramtypes", [Object, orm_1.DropEventQueryBuilder])
1032
+ ], SqlDropEventQueryCompiler);
1033
1033
  //# sourceMappingURL=compilers.js.map