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.
@@ -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
- stmt.addLine("FROM").space();
87
- this.formatTarget(ctx, query.from);
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.name);
103
- stmt.add("VALUES");
104
- if (query.data.length === 0)
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(query.table.name);
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").addValue(singleResult ? 1 : limit);
397
- if (offset && offset > 0)
398
- stmt.raw("OFFSET").addValue(offset);
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
- stmt.add("AS").addIdentifier("result");
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 asJson = column?.type === ColumnType.Json && ctx.formatAsJson;
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.raw("json").openParenthesis().openParenthesis();
577
- this.format(ctx, expr.query);
578
- return stmt.closeParenthesis().closeParenthesis();
611
+ stmt.openParenthesis();
612
+ this.format({ ...ctx, topLevel: true }, expr.query);
613
+ return stmt.closeParenthesis().raw(`->'$.result'`);
579
614
  }
580
- stmt.openParenthesis().raw("SELECT json_group_array(json(result))").newline().raw("FROM").space().openParenthesis();
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
- stmt.identifier("json_object");
613
- for (const [key, value] of stmt.call(Object.entries(expr.fields))) {
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rado",
3
- "version": "0.1.63",
3
+ "version": "0.2.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",