rado 0.1.63 → 0.2.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/README.md +269 -0
- package/dist/define/Column.d.ts +18 -18
- package/dist/define/Column.js +17 -5
- package/dist/define/Cursor.d.ts +48 -37
- package/dist/define/Cursor.js +109 -34
- package/dist/define/Expr.d.ts +11 -9
- package/dist/define/Expr.js +48 -44
- package/dist/define/Fields.d.ts +2 -2
- package/dist/define/Ops.d.ts +2 -0
- package/dist/define/Ops.js +14 -5
- package/dist/define/Query.d.ts +34 -19
- package/dist/define/Query.js +10 -5
- package/dist/define/Schema.d.ts +3 -10
- package/dist/define/Schema.js +51 -6
- package/dist/define/Selection.d.ts +3 -3
- package/dist/define/Table.d.ts +56 -51
- package/dist/define/Table.js +146 -103
- package/dist/define/Target.d.ts +4 -4
- package/dist/lib/Callable.d.ts +3 -0
- package/dist/lib/Callable.js +14 -0
- package/dist/lib/Driver.js +5 -4
- package/dist/lib/Formatter.d.ts +3 -0
- package/dist/lib/Formatter.js +71 -27
- package/package.json +1 -1
package/dist/lib/Formatter.js
CHANGED
|
@@ -61,12 +61,14 @@ var Formatter = class {
|
|
|
61
61
|
return this.formatDelete(ctx, query);
|
|
62
62
|
case QueryType.CreateTable:
|
|
63
63
|
return this.formatCreateTable(ctx, query);
|
|
64
|
+
case QueryType.AlterTable:
|
|
65
|
+
return this.formatAlterTable(ctx, query);
|
|
66
|
+
case QueryType.DropTable:
|
|
67
|
+
return this.formatDropTable(ctx, query);
|
|
64
68
|
case QueryType.CreateIndex:
|
|
65
69
|
return this.formatCreateIndex(ctx, query);
|
|
66
70
|
case QueryType.DropIndex:
|
|
67
71
|
return this.formatDropIndex(ctx, query);
|
|
68
|
-
case QueryType.AlterTable:
|
|
69
|
-
return this.formatAlterTable(ctx, query);
|
|
70
72
|
case QueryType.Transaction:
|
|
71
73
|
return this.formatTransaction(ctx, query);
|
|
72
74
|
case QueryType.Batch:
|
|
@@ -83,8 +85,10 @@ var Formatter = class {
|
|
|
83
85
|
query.selection,
|
|
84
86
|
topLevel ? formatAsResultObject : void 0
|
|
85
87
|
);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
if (query.from) {
|
|
89
|
+
stmt.addLine("FROM").space();
|
|
90
|
+
this.formatTarget(ctx, query.from);
|
|
91
|
+
}
|
|
88
92
|
this.formatWhere(ctx, query.where);
|
|
89
93
|
this.formatGroupBy(ctx, query.groupBy);
|
|
90
94
|
this.formatHaving(ctx, query.having);
|
|
@@ -94,18 +98,28 @@ var Formatter = class {
|
|
|
94
98
|
}
|
|
95
99
|
formatInsert(ctx, query) {
|
|
96
100
|
const { stmt } = ctx;
|
|
97
|
-
const columns = Object.values(query.into.columns);
|
|
101
|
+
const columns = Object.values(query.into.columns).map((c) => c.name);
|
|
98
102
|
stmt.add("INSERT INTO").addIdentifier(query.into.name);
|
|
99
103
|
if (query.into.alias)
|
|
100
104
|
stmt.raw("AS").addIdentifier(query.into.alias);
|
|
101
105
|
for (const column of stmt.call(columns))
|
|
102
|
-
this.formatString(ctx, column
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
stmt.add("()");
|
|
106
|
-
else
|
|
106
|
+
this.formatString(ctx, column);
|
|
107
|
+
if (query.data) {
|
|
108
|
+
stmt.add("VALUES").space();
|
|
107
109
|
for (const row of stmt.separate(query.data))
|
|
108
110
|
this.formatInsertRow(ctx, query.into.columns, row);
|
|
111
|
+
}
|
|
112
|
+
if (query.select) {
|
|
113
|
+
stmt.space();
|
|
114
|
+
this.formatSelect(
|
|
115
|
+
{
|
|
116
|
+
...ctx,
|
|
117
|
+
topLevel: false,
|
|
118
|
+
selectAsColumns: true
|
|
119
|
+
},
|
|
120
|
+
query.select
|
|
121
|
+
);
|
|
122
|
+
}
|
|
109
123
|
if (query.selection) {
|
|
110
124
|
stmt.add("RETURNING").space();
|
|
111
125
|
this.formatSelection(ctx, query.selection, formatAsResultObject);
|
|
@@ -181,17 +195,33 @@ var Formatter = class {
|
|
|
181
195
|
}
|
|
182
196
|
formatAlterTable(ctx, query) {
|
|
183
197
|
const { stmt } = ctx;
|
|
184
|
-
stmt.add("ALTER TABLE").addIdentifier(
|
|
198
|
+
stmt.add("ALTER TABLE").addIdentifier(
|
|
199
|
+
query.renameTable ? query.renameTable.from : query.table.name
|
|
200
|
+
);
|
|
185
201
|
if (query.addColumn) {
|
|
186
202
|
stmt.add("ADD COLUMN").space();
|
|
187
203
|
this.formatColumn(ctx, query.addColumn);
|
|
188
204
|
} else if (query.dropColumn) {
|
|
189
205
|
stmt.add("DROP COLUMN").addIdentifier(query.dropColumn);
|
|
206
|
+
} else if (query.renameColumn) {
|
|
207
|
+
stmt.add("RENAME COLUMN");
|
|
208
|
+
stmt.addIdentifier(query.renameColumn.from).add("TO");
|
|
209
|
+
stmt.addIdentifier(query.renameColumn.to);
|
|
210
|
+
} else if (query.renameTable) {
|
|
211
|
+
stmt.add("RENAME TO").addIdentifier(query.table.name);
|
|
190
212
|
} else if (query.alterColumn) {
|
|
191
213
|
throw new Error(`Not available in this formatter: alter column`);
|
|
192
214
|
}
|
|
193
215
|
return stmt;
|
|
194
216
|
}
|
|
217
|
+
formatDropTable(ctx, query) {
|
|
218
|
+
const { stmt } = ctx;
|
|
219
|
+
stmt.add("DROP TABLE");
|
|
220
|
+
if (query.ifExists)
|
|
221
|
+
stmt.add("IF EXISTS");
|
|
222
|
+
stmt.addIdentifier(query.table.name);
|
|
223
|
+
return stmt;
|
|
224
|
+
}
|
|
195
225
|
formatTransaction(ctx, { op, id }) {
|
|
196
226
|
const { stmt } = ctx;
|
|
197
227
|
switch (op) {
|
|
@@ -321,8 +351,6 @@ var Formatter = class {
|
|
|
321
351
|
throw new TypeError(`Expected boolean for column ${column.name}`);
|
|
322
352
|
return stmt.raw(this.escapeValue(columnValue));
|
|
323
353
|
case ColumnType.Json:
|
|
324
|
-
if (typeof columnValue !== "object")
|
|
325
|
-
throw new TypeError(`Expected object for column ${column.name}`);
|
|
326
354
|
return stmt.value(JSON.stringify(columnValue));
|
|
327
355
|
}
|
|
328
356
|
}
|
|
@@ -390,12 +418,15 @@ var Formatter = class {
|
|
|
390
418
|
return stmt;
|
|
391
419
|
}
|
|
392
420
|
formatLimit(ctx, { limit, offset, singleResult }) {
|
|
393
|
-
const { stmt } = ctx;
|
|
421
|
+
const { stmt, forceInline } = ctx;
|
|
394
422
|
if (!limit && !offset && !singleResult)
|
|
395
423
|
return stmt;
|
|
396
|
-
stmt.newline().raw("LIMIT").
|
|
397
|
-
|
|
398
|
-
|
|
424
|
+
stmt.newline().raw("LIMIT").space();
|
|
425
|
+
this.formatValue(ctx, singleResult ? 1 : limit);
|
|
426
|
+
if (offset && offset > 0) {
|
|
427
|
+
stmt.add("OFFSET").space();
|
|
428
|
+
this.formatValue(ctx, offset);
|
|
429
|
+
}
|
|
399
430
|
return stmt;
|
|
400
431
|
}
|
|
401
432
|
formatSelection(ctx, selection, formatSubject) {
|
|
@@ -411,7 +442,8 @@ var Formatter = class {
|
|
|
411
442
|
formatSubject(stmt, mkSubject);
|
|
412
443
|
else
|
|
413
444
|
this.formatExpr(ctx, selection);
|
|
414
|
-
|
|
445
|
+
if (!ctx.selectAsColumns)
|
|
446
|
+
stmt.add("AS").addIdentifier("result");
|
|
415
447
|
return stmt;
|
|
416
448
|
}
|
|
417
449
|
formatExprJson(ctx, expr) {
|
|
@@ -441,7 +473,8 @@ var Formatter = class {
|
|
|
441
473
|
case TargetType.Table:
|
|
442
474
|
const column = expr.target.table.columns[field];
|
|
443
475
|
const asBoolean = column?.type === ColumnType.Boolean && ctx.formatAsJson;
|
|
444
|
-
const
|
|
476
|
+
const jsonColumn = column?.type === ColumnType.Json;
|
|
477
|
+
const asJson = jsonColumn && ctx.formatAsJson;
|
|
445
478
|
if (asJson) {
|
|
446
479
|
stmt.raw("json");
|
|
447
480
|
stmt.openParenthesis();
|
|
@@ -456,6 +489,8 @@ var Formatter = class {
|
|
|
456
489
|
stmt.add(`, 'true', 'false'))`);
|
|
457
490
|
if (asJson)
|
|
458
491
|
stmt.closeParenthesis();
|
|
492
|
+
if (jsonColumn && !asJson)
|
|
493
|
+
stmt.raw("->>'$'");
|
|
459
494
|
return stmt;
|
|
460
495
|
}
|
|
461
496
|
default:
|
|
@@ -573,12 +608,12 @@ var Formatter = class {
|
|
|
573
608
|
return stmt.closeParenthesis();
|
|
574
609
|
}
|
|
575
610
|
if (expr.query.singleResult) {
|
|
576
|
-
stmt.
|
|
577
|
-
this.format(ctx, expr.query);
|
|
578
|
-
return stmt.closeParenthesis().
|
|
611
|
+
stmt.openParenthesis();
|
|
612
|
+
this.format({ ...ctx, topLevel: true }, expr.query);
|
|
613
|
+
return stmt.closeParenthesis().raw(`->'$.result'`);
|
|
579
614
|
}
|
|
580
|
-
stmt.openParenthesis().raw(
|
|
581
|
-
this.format(ctx, expr.query);
|
|
615
|
+
stmt.openParenthesis().raw(`SELECT json_group_array(result->'$.result')`).newline().raw("FROM").space().openParenthesis();
|
|
616
|
+
this.format({ ...ctx, topLevel: true }, expr.query);
|
|
582
617
|
return stmt.closeParenthesis().closeParenthesis();
|
|
583
618
|
case ExprType.Row:
|
|
584
619
|
switch (expr.target.type) {
|
|
@@ -609,12 +644,21 @@ var Formatter = class {
|
|
|
609
644
|
this.formatExpr({ ...ctx, formatAsJson: true }, expr.b);
|
|
610
645
|
return stmt.closeParenthesis();
|
|
611
646
|
case ExprType.Record:
|
|
612
|
-
|
|
613
|
-
|
|
647
|
+
if (ctx.selectAsColumns) {
|
|
648
|
+
const inner = { ...ctx, selectAsColumns: false };
|
|
649
|
+
for (const [key, value] of stmt.separate(
|
|
650
|
+
Object.entries(expr.fields)
|
|
651
|
+
)) {
|
|
652
|
+
this.formatExprJson(inner, value);
|
|
653
|
+
}
|
|
654
|
+
return stmt;
|
|
655
|
+
}
|
|
656
|
+
stmt.identifier("json_object").openParenthesis();
|
|
657
|
+
for (const [key, value] of stmt.separate(Object.entries(expr.fields))) {
|
|
614
658
|
this.formatString(ctx, key).raw(", ");
|
|
615
659
|
this.formatExprJson(ctx, value);
|
|
616
660
|
}
|
|
617
|
-
return stmt;
|
|
661
|
+
return stmt.closeParenthesis();
|
|
618
662
|
case ExprType.Filter: {
|
|
619
663
|
const { target, condition } = expr;
|
|
620
664
|
switch (target.type) {
|