rado 0.3.2 → 0.3.4

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.
Files changed (101) hide show
  1. package/README.md +2 -0
  2. package/dist/define/CTE.d.ts +2 -0
  3. package/dist/define/CTE.js +51 -0
  4. package/dist/define/Cursor.d.ts +65 -42
  5. package/dist/define/Cursor.js +170 -88
  6. package/dist/define/Expr.d.ts +2 -2
  7. package/dist/define/Expr.js +4 -1
  8. package/dist/define/Ops.d.ts +1 -6
  9. package/dist/define/Ops.js +10 -7
  10. package/dist/define/Query.d.ts +117 -2
  11. package/dist/define/Query.js +472 -17
  12. package/dist/define/Selection.d.ts +1 -1
  13. package/dist/define/Table.d.ts +6 -3
  14. package/dist/define/Table.js +6 -1
  15. package/dist/define/VirtualTable.d.ts +1 -1
  16. package/dist/define/query/Delete.d.ts +0 -2
  17. package/dist/define/query/Delete.js +0 -3
  18. package/dist/define/query/Select.d.ts +0 -2
  19. package/dist/define/query/Select.js +1 -14
  20. package/dist/deno/driver/better-sqlite3.js +57 -0
  21. package/dist/deno/driver/bun-sqlite.js +69 -0
  22. package/dist/deno/driver/sql.js.js +72 -0
  23. package/dist/deno/driver/sqlite3.js +123 -0
  24. package/dist/deno/index.js +14 -0
  25. package/dist/deno/lib/Driver.js +330 -0
  26. package/dist/deno/lib/Formatter.js +715 -0
  27. package/dist/deno/lib/SqlError.js +11 -0
  28. package/dist/deno/lib/Statement.js +108 -0
  29. package/dist/deno/sqlite/SqliteFormatter.js +70 -0
  30. package/dist/deno/sqlite/SqliteFunctions.js +150 -0
  31. package/dist/deno/sqlite/SqliteSchema.js +47 -0
  32. package/dist/deno/sqlite.js +3 -0
  33. package/dist/deno/util/Callable.js +15 -0
  34. package/dist/driver/bun-sqlite.js +1 -2
  35. package/dist/index.d.ts +0 -8
  36. package/dist/index.js +0 -8
  37. package/dist/lib/Driver.d.ts +1 -2
  38. package/dist/lib/Formatter.js +17 -3
  39. package/dist/sqlite/index.d.ts +2 -0
  40. package/dist/sqlite/index.js +3 -0
  41. package/dist/src/driver/better-sqlite3.js +49 -0
  42. package/dist/src/driver/sql.js.js +66 -0
  43. package/dist/src/driver/sqlite3.js +87 -0
  44. package/dist/src/index.js +24 -0
  45. package/dist/{lib → src/lib}/Column.js +1 -6
  46. package/dist/{lib → src/lib}/Cursor.js +25 -50
  47. package/dist/src/lib/Driver.js +316 -0
  48. package/dist/{lib → src/lib}/Expr.js +4 -4
  49. package/dist/src/lib/Formatter.js +625 -0
  50. package/dist/{lib → src/lib}/Ops.js +14 -5
  51. package/dist/src/lib/Sanitizer.js +0 -0
  52. package/dist/src/lib/Statement.js +103 -0
  53. package/dist/{lib → src/lib}/Table.js +1 -1
  54. package/dist/{lib → src/lib}/Target.js +4 -9
  55. package/dist/src/lib/Update.js +0 -0
  56. package/dist/src/sqlite/SqliteFormatter.js +67 -0
  57. package/dist/src/sqlite/SqliteFunctions.js +146 -0
  58. package/dist/src/sqlite/SqliteSchema.js +47 -0
  59. package/dist/src/sqlite.js +3 -0
  60. package/dist/test/DbSuite.js +28 -0
  61. package/dist/test/TSTestTypes.js +6 -0
  62. package/dist/test/TestBasic.js +172 -0
  63. package/dist/test/TestExtend.js +68 -0
  64. package/dist/test/TestFts5.js +34 -0
  65. package/dist/test/TestFunctions.js +28 -0
  66. package/dist/test/TestJoins.js +34 -0
  67. package/dist/test/TestJson.js +33 -0
  68. package/dist/test/TestPrepare.js +27 -0
  69. package/dist/test/TestRawSql.js +31 -0
  70. package/dist/test/TestSchema.js +69 -0
  71. package/dist/test/TestSubQueries.js +79 -0
  72. package/dist/test/TestTransaction.js +54 -0
  73. package/dist/test/TestUpdate.js +95 -0
  74. package/dist/test/index.js +14 -0
  75. package/package.json +1 -1
  76. package/dist/lib/Column.d.ts +0 -57
  77. package/dist/lib/Cursor.d.ts +0 -85
  78. package/dist/lib/Expr.d.ts +0 -154
  79. package/dist/lib/Fields.d.ts +0 -13
  80. package/dist/lib/Functions.d.ts +0 -5
  81. package/dist/lib/Id.d.ts +0 -3
  82. package/dist/lib/Index.d.ts +0 -17
  83. package/dist/lib/Ops.d.ts +0 -7
  84. package/dist/lib/OrderBy.d.ts +0 -9
  85. package/dist/lib/Param.d.ts +0 -20
  86. package/dist/lib/Query.d.ts +0 -109
  87. package/dist/lib/Schema.d.ts +0 -18
  88. package/dist/lib/Selection.d.ts +0 -20
  89. package/dist/lib/Table.d.ts +0 -62
  90. package/dist/lib/Target.d.ts +0 -38
  91. package/dist/lib/Update.d.ts +0 -4
  92. /package/dist/{lib/Fields.js → deno/lib/Sanitizer.js} +0 -0
  93. /package/dist/{lib/Id.js → src/lib/Fields.js} +0 -0
  94. /package/dist/{lib → src/lib}/Functions.js +0 -0
  95. /package/dist/{lib/Update.js → src/lib/Id.js} +0 -0
  96. /package/dist/{lib → src/lib}/Index.js +0 -0
  97. /package/dist/{lib → src/lib}/OrderBy.js +0 -0
  98. /package/dist/{lib → src/lib}/Param.js +0 -0
  99. /package/dist/{lib → src/lib}/Query.js +0 -0
  100. /package/dist/{lib → src/lib}/Schema.js +0 -0
  101. /package/dist/{lib → src/lib}/Selection.js +0 -0
@@ -1,14 +1,17 @@
1
1
  import { ExprData } from "./Expr.js";
2
- import { Query, QueryData } from "./Query.js";
2
+ import {
3
+ Batch,
4
+ Delete,
5
+ InsertInto,
6
+ Query,
7
+ QueryData,
8
+ RecursiveUnion,
9
+ Select,
10
+ Update
11
+ } from "./Query.js";
3
12
  import { Schema } from "./Schema.js";
4
13
  import { Table, createTable } from "./Table.js";
5
14
  import { Target } from "./Target.js";
6
- import { Batch } from "./query/Batch.js";
7
- import { Delete } from "./query/Delete.js";
8
- import { InsertInto } from "./query/Insert.js";
9
- import { Select } from "./query/Select.js";
10
- import { RecursiveUnion } from "./query/Union.js";
11
- import { Update } from "./query/Update.js";
12
15
  function withRecursive(initialSelect) {
13
16
  return new RecursiveUnion(initialSelect[Query.Data]);
14
17
  }
@@ -1,12 +1,13 @@
1
1
  import { Driver } from '../lib/Driver.js';
2
2
  import { CompileOptions } from '../lib/Formatter.js';
3
3
  import { ColumnData } from './Column.js';
4
- import { EV, ExprData } from './Expr.js';
4
+ import { EV, Expr, ExprData } from './Expr.js';
5
5
  import { IndexData } from './Index.js';
6
6
  import { OrderBy } from './OrderBy.js';
7
7
  import { Selection } from './Selection.js';
8
- import { TableData } from './Table.js';
8
+ import { Table, TableData } from './Table.js';
9
9
  import { Target } from './Target.js';
10
+ import { VirtualTable } from './VirtualTable.js';
10
11
  export declare enum QueryType {
11
12
  Insert = "QueryData.Insert",
12
13
  Select = "QueryData.Select",
@@ -151,3 +152,117 @@ export declare namespace Query {
151
152
  const Data: unique symbol;
152
153
  function isQuery<T>(input: any): input is Query<T>;
153
154
  }
155
+ export declare class Batch<T = void> extends Query<T> {
156
+ protected queries: Array<QueryData>;
157
+ [Query.Data]: QueryData.Batch;
158
+ constructor(queries: Array<QueryData>);
159
+ next<T>(cursor: Query<T>): Query<T>;
160
+ }
161
+ export declare class CreateTable extends Query<void> {
162
+ protected table: TableData;
163
+ constructor(table: TableData);
164
+ }
165
+ export declare class Delete extends Query<{
166
+ rowsAffected: number;
167
+ }> {
168
+ [Query.Data]: QueryData.Delete;
169
+ constructor(query: QueryData.Delete);
170
+ where(...where: Array<EV<boolean>>): Delete;
171
+ orderBy(...orderBy: Array<OrderBy>): Delete;
172
+ take(limit: number | undefined): Delete;
173
+ skip(offset: number | undefined): Delete;
174
+ }
175
+ export declare class Insert<T = {
176
+ rowsAffected: number;
177
+ }> extends Query<T> {
178
+ [Query.Data]: QueryData.Insert;
179
+ constructor(query: QueryData.Insert);
180
+ returning<X extends Selection>(selection: X): Insert<Array<Selection.Infer<X>>>;
181
+ }
182
+ export declare class InsertOne<T> extends Query<T> {
183
+ [Query.Data]: QueryData.Insert;
184
+ constructor(query: QueryData.Insert);
185
+ returning<X extends Selection>(selection: X): Insert<Selection.Infer<X>>;
186
+ }
187
+ export declare class InsertInto<Definition> {
188
+ protected into: TableData;
189
+ constructor(into: TableData);
190
+ selection(query: Select<Table.Select<Definition>>): Insert;
191
+ values(...data: Array<Table.Insert<Definition>>): Insert;
192
+ }
193
+ export declare class RecursiveUnion<Row> {
194
+ initialSelect: QueryData.Select;
195
+ constructor(initialSelect: QueryData.Select);
196
+ union(create: () => Select<Row> | Union<Row>): VirtualTable.Of<Row>;
197
+ unionAll(create: () => Select<Row> | Union<Row>): VirtualTable.Of<Row>;
198
+ }
199
+ export declare class Union<Row> extends Query<Array<Row>> {
200
+ [Query.Data]: QueryData.Union | QueryData.Select;
201
+ constructor(query: QueryData.Union | QueryData.Select);
202
+ union(query: Select<Row> | Union<Row>): Union<Row>;
203
+ unionAll(query: Select<Row> | Union<Row>): Union<Row>;
204
+ except(query: Select<Row> | Union<Row>): Union<Row>;
205
+ intersect(query: Select<Row> | Union<Row>): Union<Row>;
206
+ }
207
+ export declare class Select<Row> extends Union<Row> {
208
+ [Query.Data]: QueryData.Select;
209
+ constructor(query: QueryData.Select);
210
+ from(table: Table<any> | VirtualTable<any>): Select<Row>;
211
+ indexedBy(index: IndexData): Select<unknown>;
212
+ leftJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): Select<Row>;
213
+ innerJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): Select<Row>;
214
+ select<X extends Selection>(selection: X): Select<Selection.Infer<X>>;
215
+ count(): SelectFirst<number>;
216
+ orderBy(...orderBy: Array<Expr<any> | OrderBy>): Select<Row>;
217
+ groupBy(...groupBy: Array<Expr<any>>): Select<Row>;
218
+ maybeFirst(): SelectFirst<Row | null>;
219
+ first(): SelectFirst<Row>;
220
+ where(...where: Array<EV<boolean>>): Select<Row>;
221
+ take(limit: number | undefined): Select<Row>;
222
+ skip(offset: number | undefined): Select<Row>;
223
+ [Expr.ToExpr](): Expr<Row>;
224
+ }
225
+ export declare class SelectFirst<Row> extends Query<Row> {
226
+ [Query.Data]: QueryData.Select;
227
+ constructor(query: QueryData.Select);
228
+ from(table: Table<any>): Select<Row>;
229
+ leftJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): SelectFirst<Row>;
230
+ innerJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): SelectFirst<Row>;
231
+ select<X extends Selection>(selection: X): SelectFirst<Selection.Infer<X>>;
232
+ orderBy(...orderBy: Array<OrderBy>): SelectFirst<Row>;
233
+ groupBy(...groupBy: Array<Expr<any>>): SelectFirst<Row>;
234
+ where(...where: Array<EV<boolean>>): SelectFirst<Row>;
235
+ take(limit: number | undefined): SelectFirst<Row>;
236
+ skip(offset: number | undefined): SelectFirst<Row>;
237
+ all(): Select<Row>;
238
+ [Expr.ToExpr](): Expr<Row>;
239
+ }
240
+ export declare class TableSelect<Definition> extends Select<Table.Select<Definition>> {
241
+ protected table: TableData;
242
+ [Query.Data]: QueryData.Select;
243
+ constructor(table: TableData, conditions?: Array<EV<boolean>>);
244
+ as(alias: string): Table<Definition>;
245
+ create(): CreateTable;
246
+ insert(query: Select<Table.Insert<Definition>>): Insert;
247
+ insert(rows: Array<Table.Insert<Definition>>): Insert;
248
+ insert(row: Table.Insert<Definition>): InsertOne<Table.Select<Definition>>;
249
+ insertSelect(query: Select<Table.Insert<Definition>>): Insert<{
250
+ rowsAffected: number;
251
+ }>;
252
+ insertOne(record: Table.Insert<Definition>): InsertOne<{ [K in keyof Definition as Definition[K] extends import("./Column.js").Column<any> ? K : never]: Definition[K] extends import("./Column.js").Column<infer T> ? T : never; }>;
253
+ insertAll(data: Array<Table.Insert<Definition>>): Insert<{
254
+ rowsAffected: number;
255
+ }>;
256
+ set(data: Table.Update<Definition>): Update<Definition>;
257
+ delete(): Delete;
258
+ get(name: string): Expr<any>;
259
+ }
260
+ export declare class Update<Definition> extends Query<{
261
+ rowsAffected: number;
262
+ }> {
263
+ [Query.Data]: QueryData.Update;
264
+ set(set: Table.Update<Definition>): Update<Definition>;
265
+ where(...where: Array<EV<boolean>>): Update<Definition>;
266
+ take(limit: number | undefined): Update<Definition>;
267
+ skip(offset: number | undefined): Update<Definition>;
268
+ }
@@ -1,5 +1,14 @@
1
- import { Expr } from "./Expr.js";
2
- const { assign } = Object;
1
+ import { randomAlias } from "../util/Alias.js";
2
+ import { Expr, ExprData, ExprType } from "./Expr.js";
3
+ import { Functions } from "./Functions.js";
4
+ import { Schema } from "./Schema.js";
5
+ import { Table, createTable } from "./Table.js";
6
+ import { Target, TargetType } from "./Target.js";
7
+ import {
8
+ VirtualTable,
9
+ createVirtualTable
10
+ } from "./VirtualTable.js";
11
+ const { keys, assign, fromEntries } = Object;
3
12
  var QueryType = /* @__PURE__ */ ((QueryType2) => {
4
13
  QueryType2["Insert"] = "QueryData.Insert";
5
14
  QueryType2["Select"] = "QueryData.Select";
@@ -33,30 +42,30 @@ var QueryData;
33
42
  UnionOperation2["Intersect"] = "Intersect";
34
43
  UnionOperation2["Except"] = "Except";
35
44
  })(UnionOperation = QueryData2.UnionOperation || (QueryData2.UnionOperation = {}));
36
- class Union extends Data {
45
+ class Union2 extends Data {
37
46
  type = "QueryData.Union" /* Union */;
38
47
  }
39
- QueryData2.Union = Union;
40
- class Select extends Data {
48
+ QueryData2.Union = Union2;
49
+ class Select2 extends Data {
41
50
  type = "QueryData.Select" /* Select */;
42
51
  }
43
- QueryData2.Select = Select;
44
- class Insert extends Data {
52
+ QueryData2.Select = Select2;
53
+ class Insert2 extends Data {
45
54
  type = "QueryData.Insert" /* Insert */;
46
55
  }
47
- QueryData2.Insert = Insert;
48
- class Update extends Data {
56
+ QueryData2.Insert = Insert2;
57
+ class Update2 extends Data {
49
58
  type = "QueryData.Update" /* Update */;
50
59
  }
51
- QueryData2.Update = Update;
52
- class Delete extends Data {
60
+ QueryData2.Update = Update2;
61
+ class Delete2 extends Data {
53
62
  type = "QueryData.Delete" /* Delete */;
54
63
  }
55
- QueryData2.Delete = Delete;
56
- class CreateTable extends Data {
64
+ QueryData2.Delete = Delete2;
65
+ class CreateTable2 extends Data {
57
66
  type = "QueryData.CreateTable" /* CreateTable */;
58
67
  }
59
- QueryData2.CreateTable = CreateTable;
68
+ QueryData2.CreateTable = CreateTable2;
60
69
  class AlterTable extends Data {
61
70
  type = "QueryData.AlterTable" /* AlterTable */;
62
71
  }
@@ -73,10 +82,10 @@ var QueryData;
73
82
  type = "QueryData.DropIndex" /* DropIndex */;
74
83
  }
75
84
  QueryData2.DropIndex = DropIndex;
76
- class Batch extends Data {
85
+ class Batch2 extends Data {
77
86
  type = "QueryData.Batch" /* Batch */;
78
87
  }
79
- QueryData2.Batch = Batch;
88
+ QueryData2.Batch = Batch2;
80
89
  let TransactionOperation;
81
90
  ((TransactionOperation2) => {
82
91
  TransactionOperation2["Begin"] = "Begin";
@@ -134,8 +143,454 @@ class Query {
134
143
  }
135
144
  Query2.isQuery = isQuery;
136
145
  })(Query || (Query = {}));
146
+ class Batch extends Query {
147
+ constructor(queries) {
148
+ super(new QueryData.Batch({ queries }));
149
+ this.queries = queries;
150
+ }
151
+ next(cursor) {
152
+ return new Query(
153
+ new QueryData.Batch({
154
+ queries: [...this[Query.Data].queries, cursor[Query.Data]]
155
+ })
156
+ );
157
+ }
158
+ }
159
+ class CreateTable extends Query {
160
+ constructor(table) {
161
+ super(Schema.create(table));
162
+ this.table = table;
163
+ }
164
+ }
165
+ class Delete extends Query {
166
+ constructor(query) {
167
+ super(query);
168
+ }
169
+ where(...where) {
170
+ return new Delete(this.addWhere(where));
171
+ }
172
+ orderBy(...orderBy) {
173
+ return new Delete(this[Query.Data].with({ orderBy }));
174
+ }
175
+ take(limit) {
176
+ return new Delete(this[Query.Data].with({ limit }));
177
+ }
178
+ skip(offset) {
179
+ return new Delete(this[Query.Data].with({ offset }));
180
+ }
181
+ }
182
+ class Insert extends Query {
183
+ constructor(query) {
184
+ super(query);
185
+ }
186
+ returning(selection) {
187
+ return new Insert(
188
+ new QueryData.Insert({
189
+ ...this[Query.Data],
190
+ selection: ExprData.create(selection)
191
+ })
192
+ );
193
+ }
194
+ }
195
+ class InsertOne extends Query {
196
+ constructor(query) {
197
+ super(query);
198
+ }
199
+ returning(selection) {
200
+ return new Insert(
201
+ new QueryData.Insert({
202
+ ...this[Query.Data],
203
+ selection: ExprData.create(selection),
204
+ singleResult: true
205
+ })
206
+ );
207
+ }
208
+ }
209
+ class InsertInto {
210
+ constructor(into) {
211
+ this.into = into;
212
+ }
213
+ selection(query) {
214
+ return new Insert(
215
+ new QueryData.Insert({ into: this.into, select: query[Query.Data] })
216
+ );
217
+ }
218
+ values(...data) {
219
+ return new Insert(new QueryData.Insert({ into: this.into, data }));
220
+ }
221
+ }
222
+ function joinTarget(joinType, query, to, on) {
223
+ const toQuery = Query.isQuery(to) ? to[Query.Data] : void 0;
224
+ const target = toQuery ? toQuery.from : new Target.Table(to[Table.Data]);
225
+ if (!query.from || !target)
226
+ throw new Error("No from clause");
227
+ const conditions = [...on];
228
+ if (toQuery) {
229
+ const where = toQuery.where;
230
+ if (where)
231
+ conditions.push(new Expr(where));
232
+ }
233
+ return new Target.Join(
234
+ query.from,
235
+ target,
236
+ joinType,
237
+ Expr.and(...conditions)[Expr.Data]
238
+ );
239
+ }
240
+ function columnsOf(expr) {
241
+ switch (expr.type) {
242
+ case ExprType.Record:
243
+ return keys(expr.fields);
244
+ case ExprType.Row:
245
+ switch (expr.target.type) {
246
+ case TargetType.Table:
247
+ return keys(expr.target.table.columns);
248
+ default:
249
+ throw new Error("Could not retrieve CTE columns");
250
+ }
251
+ default:
252
+ throw new Error("Could not retrieve CTE columns");
253
+ }
254
+ }
255
+ function makeRecursiveUnion(initial, createUnion, operator) {
256
+ const name = randomAlias();
257
+ const cols = columnsOf(initial.selection);
258
+ const union = new QueryData.Union({
259
+ a: initial,
260
+ operator,
261
+ b: () => createUnion()[Query.Data]
262
+ });
263
+ const target = new Target.CTE(name, union);
264
+ const row = new ExprData.Row(target);
265
+ const selection = new ExprData.Record(
266
+ fromEntries(cols.map((col) => [col, new ExprData.Field(row, col)]))
267
+ );
268
+ const select = (conditions) => {
269
+ const where = Expr.and(...conditions)[Expr.Data];
270
+ return new Select(
271
+ new QueryData.Select({
272
+ selection,
273
+ from: target,
274
+ where
275
+ })
276
+ );
277
+ };
278
+ const cte = createVirtualTable({
279
+ name,
280
+ target,
281
+ select
282
+ });
283
+ return cte;
284
+ }
285
+ class RecursiveUnion {
286
+ constructor(initialSelect) {
287
+ this.initialSelect = initialSelect;
288
+ }
289
+ union(create) {
290
+ return makeRecursiveUnion(
291
+ this.initialSelect,
292
+ create,
293
+ "Union" /* Union */
294
+ );
295
+ }
296
+ unionAll(create) {
297
+ return makeRecursiveUnion(
298
+ this.initialSelect,
299
+ create,
300
+ "UnionAll" /* UnionAll */
301
+ );
302
+ }
303
+ }
304
+ class Union extends Query {
305
+ constructor(query) {
306
+ super(query);
307
+ }
308
+ union(query) {
309
+ return new Union(
310
+ new QueryData.Union({
311
+ a: this[Query.Data],
312
+ operator: "Union" /* Union */,
313
+ b: query[Query.Data]
314
+ })
315
+ );
316
+ }
317
+ unionAll(query) {
318
+ return new Union(
319
+ new QueryData.Union({
320
+ a: this[Query.Data],
321
+ operator: "UnionAll" /* UnionAll */,
322
+ b: query[Query.Data]
323
+ })
324
+ );
325
+ }
326
+ except(query) {
327
+ return new Union(
328
+ new QueryData.Union({
329
+ a: this[Query.Data],
330
+ operator: "Except" /* Except */,
331
+ b: query[Query.Data]
332
+ })
333
+ );
334
+ }
335
+ intersect(query) {
336
+ return new Union(
337
+ new QueryData.Union({
338
+ a: this[Query.Data],
339
+ operator: "Intersect" /* Intersect */,
340
+ b: query[Query.Data]
341
+ })
342
+ );
343
+ }
344
+ }
345
+ class Select extends Union {
346
+ constructor(query) {
347
+ super(query);
348
+ }
349
+ from(table) {
350
+ const virtual = table[VirtualTable.Data];
351
+ return new Select(
352
+ this[Query.Data].with({ from: virtual?.target || new Target.Table(table) })
353
+ );
354
+ }
355
+ indexedBy(index) {
356
+ const from = this[Query.Data].from;
357
+ switch (from?.type) {
358
+ case TargetType.Table:
359
+ return new Select(
360
+ this[Query.Data].with({
361
+ from: new Target.Table(from.table, index)
362
+ })
363
+ );
364
+ default:
365
+ throw new Error("Cannot index by without table target");
366
+ }
367
+ }
368
+ leftJoin(that, ...on) {
369
+ const query = this[Query.Data];
370
+ return new Select(
371
+ this[Query.Data].with({
372
+ from: joinTarget("left", query, that, on)
373
+ })
374
+ );
375
+ }
376
+ innerJoin(that, ...on) {
377
+ const query = this[Query.Data];
378
+ return new Select(
379
+ this[Query.Data].with({
380
+ from: joinTarget("inner", query, that, on)
381
+ })
382
+ );
383
+ }
384
+ select(selection) {
385
+ return new Select(
386
+ this[Query.Data].with({
387
+ selection: ExprData.create(selection)
388
+ })
389
+ );
390
+ }
391
+ count() {
392
+ return new SelectFirst(
393
+ this[Query.Data].with({
394
+ selection: Functions.count()[Expr.Data],
395
+ singleResult: true
396
+ })
397
+ );
398
+ }
399
+ orderBy(...orderBy) {
400
+ return new Select(
401
+ this[Query.Data].with({
402
+ orderBy: orderBy.map((e) => {
403
+ return Expr.isExpr(e) ? e.asc() : e;
404
+ })
405
+ })
406
+ );
407
+ }
408
+ groupBy(...groupBy) {
409
+ return new Select(
410
+ this[Query.Data].with({
411
+ groupBy: groupBy.map(ExprData.create)
412
+ })
413
+ );
414
+ }
415
+ maybeFirst() {
416
+ return new SelectFirst(this[Query.Data].with({ singleResult: true }));
417
+ }
418
+ first() {
419
+ return new SelectFirst(
420
+ this[Query.Data].with({
421
+ singleResult: true,
422
+ validate: true
423
+ })
424
+ );
425
+ }
426
+ where(...where) {
427
+ return new Select(this.addWhere(where));
428
+ }
429
+ take(limit) {
430
+ return new Select(this[Query.Data].with({ limit }));
431
+ }
432
+ skip(offset) {
433
+ return new Select(this[Query.Data].with({ offset }));
434
+ }
435
+ [Expr.ToExpr]() {
436
+ return new Expr(new ExprData.Query(this[Query.Data]));
437
+ }
438
+ }
439
+ class SelectFirst extends Query {
440
+ constructor(query) {
441
+ super(query);
442
+ }
443
+ from(table) {
444
+ return new Select(this[Query.Data].with({ from: new Target.Table(table) }));
445
+ }
446
+ leftJoin(that, ...on) {
447
+ const query = this[Query.Data];
448
+ return new SelectFirst(
449
+ this[Query.Data].with({
450
+ from: joinTarget("left", query, that, on)
451
+ })
452
+ );
453
+ }
454
+ innerJoin(that, ...on) {
455
+ const query = this[Query.Data];
456
+ return new SelectFirst(
457
+ this[Query.Data].with({
458
+ from: joinTarget("inner", query, that, on)
459
+ })
460
+ );
461
+ }
462
+ select(selection) {
463
+ return new SelectFirst(
464
+ this[Query.Data].with({
465
+ selection: ExprData.create(selection)
466
+ })
467
+ );
468
+ }
469
+ orderBy(...orderBy) {
470
+ return new SelectFirst(
471
+ this[Query.Data].with({
472
+ orderBy
473
+ })
474
+ );
475
+ }
476
+ groupBy(...groupBy) {
477
+ return new SelectFirst(
478
+ this[Query.Data].with({
479
+ groupBy: groupBy.map(ExprData.create)
480
+ })
481
+ );
482
+ }
483
+ where(...where) {
484
+ return new SelectFirst(this.addWhere(where));
485
+ }
486
+ take(limit) {
487
+ return new SelectFirst(this[Query.Data].with({ limit }));
488
+ }
489
+ skip(offset) {
490
+ return new SelectFirst(this[Query.Data].with({ offset }));
491
+ }
492
+ all() {
493
+ return new Select(this[Query.Data].with({ singleResult: false }));
494
+ }
495
+ [Expr.ToExpr]() {
496
+ return new Expr(new ExprData.Query(this[Query.Data]));
497
+ }
498
+ }
499
+ class TableSelect extends Select {
500
+ constructor(table, conditions = []) {
501
+ const target = new Target.Table(table);
502
+ super(
503
+ new QueryData.Select({
504
+ from: target,
505
+ selection: new ExprData.Row(target),
506
+ where: Expr.and(...conditions)[Expr.Data]
507
+ })
508
+ );
509
+ this.table = table;
510
+ }
511
+ as(alias) {
512
+ return createTable({ ...this.table, alias });
513
+ }
514
+ create() {
515
+ return new CreateTable(this.table);
516
+ }
517
+ insert(input) {
518
+ if (input instanceof Select) {
519
+ return this.insertSelect(input);
520
+ } else if (Array.isArray(input)) {
521
+ return this.insertAll(input);
522
+ } else {
523
+ return this.insertOne(input);
524
+ }
525
+ }
526
+ insertSelect(query) {
527
+ return new Insert(
528
+ new QueryData.Insert({ into: this.table, select: query[Query.Data] })
529
+ );
530
+ }
531
+ insertOne(record) {
532
+ return new InsertOne(
533
+ new QueryData.Insert({
534
+ into: this.table,
535
+ data: [record],
536
+ selection: new ExprData.Row(new Target.Table(this.table)),
537
+ singleResult: true
538
+ })
539
+ );
540
+ }
541
+ insertAll(data) {
542
+ return new InsertInto(this.table).values(...data);
543
+ }
544
+ set(data) {
545
+ return new Update(
546
+ new QueryData.Update({
547
+ table: this.table,
548
+ where: this[Query.Data].where
549
+ })
550
+ ).set(data);
551
+ }
552
+ delete() {
553
+ return new Delete(
554
+ new QueryData.Delete({
555
+ table: this.table,
556
+ where: this[Query.Data].where
557
+ })
558
+ );
559
+ }
560
+ get(name) {
561
+ return new Expr(
562
+ new ExprData.Field(new ExprData.Row(new Target.Table(this.table)), name)
563
+ );
564
+ }
565
+ }
566
+ class Update extends Query {
567
+ set(set) {
568
+ return new Update(this[Query.Data].with({ set }));
569
+ }
570
+ where(...where) {
571
+ return new Update(this.addWhere(where));
572
+ }
573
+ take(limit) {
574
+ return new Update(this[Query.Data].with({ limit }));
575
+ }
576
+ skip(offset) {
577
+ return new Update(this[Query.Data].with({ offset }));
578
+ }
579
+ }
137
580
  export {
581
+ Batch,
582
+ CreateTable,
583
+ Delete,
584
+ Insert,
585
+ InsertInto,
586
+ InsertOne,
138
587
  Query,
139
588
  QueryData,
140
- QueryType
589
+ QueryType,
590
+ RecursiveUnion,
591
+ Select,
592
+ SelectFirst,
593
+ TableSelect,
594
+ Union,
595
+ Update
141
596
  };
@@ -1,6 +1,6 @@
1
1
  import type { Column } from './Column.js';
2
2
  import type { Expr } from './Expr.js';
3
- import type { Select, SelectFirst } from './query/Select.js';
3
+ import type { Select, SelectFirst } from './Query.js';
4
4
  type SelectionBase = unknown | (() => any) | Expr<any> | Select<any> | SelectFirst<any>;
5
5
  interface SelectionRecord extends Record<string, Selection> {
6
6
  }