rado 0.2.23 → 0.2.25

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 (39) hide show
  1. package/dist/define/CTE.d.ts +2 -0
  2. package/dist/define/CTE.js +51 -0
  3. package/dist/define/Expr.d.ts +5 -4
  4. package/dist/define/Fields.d.ts +2 -2
  5. package/dist/define/Functions.js +4 -2
  6. package/dist/define/Ops.d.ts +11 -7
  7. package/dist/define/Ops.js +11 -6
  8. package/dist/define/Query.d.ts +24 -95
  9. package/dist/define/Query.js +28 -310
  10. package/dist/define/Selection.d.ts +2 -2
  11. package/dist/define/Table.d.ts +9 -7
  12. package/dist/define/Table.js +41 -3
  13. package/dist/define/Target.d.ts +8 -1
  14. package/dist/define/Target.js +9 -0
  15. package/dist/define/query/Batch.d.ts +7 -0
  16. package/dist/define/query/Batch.js +18 -0
  17. package/dist/define/query/CreateTable.d.ts +6 -0
  18. package/dist/define/query/CreateTable.js +12 -0
  19. package/dist/define/query/Delete.d.ts +11 -0
  20. package/dist/define/query/Delete.js +19 -0
  21. package/dist/define/query/Insert.d.ts +19 -0
  22. package/dist/define/query/Insert.js +36 -0
  23. package/dist/define/query/Select.d.ts +41 -0
  24. package/dist/define/query/Select.js +190 -0
  25. package/dist/define/query/TableSelect.d.ts +21 -0
  26. package/dist/define/query/TableSelect.js +71 -0
  27. package/dist/define/query/Union.d.ts +10 -0
  28. package/dist/define/query/Union.js +46 -0
  29. package/dist/define/query/Update.d.ts +12 -0
  30. package/dist/define/query/Update.js +19 -0
  31. package/dist/driver/bun-sqlite.js +3 -2
  32. package/dist/driver/sql.js.d.ts +2 -2
  33. package/dist/driver/sql.js.js +2 -2
  34. package/dist/lib/Driver.d.ts +3 -16
  35. package/dist/lib/Driver.js +2 -30
  36. package/dist/lib/Formatter.d.ts +1 -0
  37. package/dist/lib/Formatter.js +42 -14
  38. package/dist/sqlite/SqliteSchema.js +3 -3
  39. package/package.json +1 -1
@@ -0,0 +1,41 @@
1
+ import { EV, Expr } from '../Expr';
2
+ import { OrderBy } from '../OrderBy';
3
+ import { Query, QueryData } from '../Query';
4
+ import { Selection } from '../Selection';
5
+ import { Table } from '../Table';
6
+ import { TableSelect } from './TableSelect';
7
+ import { Union } from './Union';
8
+ export declare class SelectMultiple<Row> extends Union<Row> {
9
+ [Query.Data]: QueryData.Select;
10
+ constructor(query: QueryData.Select);
11
+ from(table: Table<any>): SelectMultiple<Row>;
12
+ leftJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectMultiple<Row>;
13
+ innerJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectMultiple<Row>;
14
+ select<X extends Selection>(selection: X): SelectMultiple<Selection.Infer<X>>;
15
+ count(): SelectSingle<number>;
16
+ orderBy(...orderBy: Array<Expr<any> | OrderBy>): SelectMultiple<Row>;
17
+ groupBy(...groupBy: Array<Expr<any>>): SelectMultiple<Row>;
18
+ maybeFirst(): SelectSingle<Row | undefined>;
19
+ first(): SelectSingle<Row>;
20
+ where(...where: Array<EV<boolean>>): SelectMultiple<Row>;
21
+ take(limit: number | undefined): SelectMultiple<Row>;
22
+ skip(offset: number | undefined): SelectMultiple<Row>;
23
+ recursiveUnion<T extends {}>(this: SelectMultiple<T>, create: (fields: Record<string, Table.Of<T>>) => SelectMultiple<T> | Union<T>): SelectMultiple<T>;
24
+ recursiveUnionAll<T extends {}>(this: SelectMultiple<T>, create: (fields: Record<string, Table.Of<T>>) => SelectMultiple<T> | Union<T>): SelectMultiple<T>;
25
+ [Expr.ToExpr](): Expr<Row>;
26
+ }
27
+ export declare class SelectSingle<Row> extends Query<Row> {
28
+ [Query.Data]: QueryData.Select;
29
+ constructor(query: QueryData.Select);
30
+ from(table: Table<any>): SelectMultiple<Row>;
31
+ leftJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectSingle<Row>;
32
+ innerJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectSingle<Row>;
33
+ select<X extends Selection>(selection: X): SelectSingle<Selection.Infer<X>>;
34
+ orderBy(...orderBy: Array<OrderBy>): SelectSingle<Row>;
35
+ groupBy(...groupBy: Array<Expr<any>>): SelectSingle<Row>;
36
+ where(...where: Array<EV<boolean>>): SelectSingle<Row>;
37
+ take(limit: number | undefined): SelectSingle<Row>;
38
+ skip(offset: number | undefined): SelectSingle<Row>;
39
+ all(): SelectMultiple<Row>;
40
+ [Expr.ToExpr](): Expr<Row>;
41
+ }
@@ -0,0 +1,190 @@
1
+ // src/define/query/Select.ts
2
+ import { makeRecursiveUnion } from "../CTE.js";
3
+ import { Expr, ExprData } from "../Expr.js";
4
+ import { Functions } from "../Functions.js";
5
+ import { Query, QueryData } from "../Query.js";
6
+ import { Table } from "../Table.js";
7
+ import { Target } from "../Target.js";
8
+ import { Union } from "./Union.js";
9
+ function joinTarget(joinType, query, to, on) {
10
+ const toQuery = Query.isQuery(to) ? to[Query.Data] : void 0;
11
+ const target = toQuery ? toQuery.from : new Target.Table(to[Table.Data]);
12
+ if (!query.from || !target)
13
+ throw new Error("No from clause");
14
+ const conditions = [...on];
15
+ if (toQuery) {
16
+ const where = toQuery.where;
17
+ if (where)
18
+ conditions.push(new Expr(where));
19
+ }
20
+ return new Target.Join(
21
+ query.from,
22
+ target,
23
+ joinType,
24
+ Expr.and(...conditions)[Expr.Data]
25
+ );
26
+ }
27
+ var SelectMultiple = class extends Union {
28
+ constructor(query) {
29
+ super(query);
30
+ }
31
+ from(table) {
32
+ return new SelectMultiple(
33
+ this[Query.Data].with({ from: new Target.Table(table) })
34
+ );
35
+ }
36
+ leftJoin(that, ...on) {
37
+ const query = this[Query.Data];
38
+ return new SelectMultiple(
39
+ this[Query.Data].with({
40
+ from: joinTarget("left", query, that, on)
41
+ })
42
+ );
43
+ }
44
+ innerJoin(that, ...on) {
45
+ const query = this[Query.Data];
46
+ return new SelectMultiple(
47
+ this[Query.Data].with({
48
+ from: joinTarget("inner", query, that, on)
49
+ })
50
+ );
51
+ }
52
+ select(selection) {
53
+ return new SelectMultiple(
54
+ this[Query.Data].with({
55
+ selection: ExprData.create(selection)
56
+ })
57
+ );
58
+ }
59
+ count() {
60
+ return new SelectSingle(
61
+ this[Query.Data].with({
62
+ selection: Functions.count()[Expr.Data],
63
+ singleResult: true
64
+ })
65
+ );
66
+ }
67
+ orderBy(...orderBy) {
68
+ return new SelectMultiple(
69
+ this[Query.Data].with({
70
+ orderBy: orderBy.map((e) => {
71
+ return Expr.isExpr(e) ? e.asc() : e;
72
+ })
73
+ })
74
+ );
75
+ }
76
+ groupBy(...groupBy) {
77
+ return new SelectMultiple(
78
+ this[Query.Data].with({
79
+ groupBy: groupBy.map(ExprData.create)
80
+ })
81
+ );
82
+ }
83
+ maybeFirst() {
84
+ return new SelectSingle(this[Query.Data].with({ singleResult: true }));
85
+ }
86
+ first() {
87
+ return new SelectSingle(
88
+ this[Query.Data].with({
89
+ singleResult: true,
90
+ validate: true
91
+ })
92
+ );
93
+ }
94
+ where(...where) {
95
+ return new SelectMultiple(this.addWhere(where));
96
+ }
97
+ take(limit) {
98
+ return new SelectMultiple(this[Query.Data].with({ limit }));
99
+ }
100
+ skip(offset) {
101
+ return new SelectMultiple(this[Query.Data].with({ offset }));
102
+ }
103
+ recursiveUnion(create) {
104
+ return new SelectMultiple(
105
+ makeRecursiveUnion(
106
+ this[Query.Data],
107
+ create,
108
+ QueryData.UnionOperation.Union
109
+ )
110
+ );
111
+ }
112
+ recursiveUnionAll(create) {
113
+ return new SelectMultiple(
114
+ makeRecursiveUnion(
115
+ this[Query.Data],
116
+ create,
117
+ QueryData.UnionOperation.UnionAll
118
+ )
119
+ );
120
+ }
121
+ [Expr.ToExpr]() {
122
+ return new Expr(new ExprData.Query(this[Query.Data]));
123
+ }
124
+ };
125
+ var SelectSingle = class extends Query {
126
+ constructor(query) {
127
+ super(query);
128
+ }
129
+ from(table) {
130
+ return new SelectMultiple(
131
+ this[Query.Data].with({ from: new Target.Table(table) })
132
+ );
133
+ }
134
+ leftJoin(that, ...on) {
135
+ const query = this[Query.Data];
136
+ return new SelectSingle(
137
+ this[Query.Data].with({
138
+ from: joinTarget("left", query, that, on)
139
+ })
140
+ );
141
+ }
142
+ innerJoin(that, ...on) {
143
+ const query = this[Query.Data];
144
+ return new SelectSingle(
145
+ this[Query.Data].with({
146
+ from: joinTarget("inner", query, that, on)
147
+ })
148
+ );
149
+ }
150
+ select(selection) {
151
+ return new SelectSingle(
152
+ this[Query.Data].with({
153
+ selection: ExprData.create(selection)
154
+ })
155
+ );
156
+ }
157
+ orderBy(...orderBy) {
158
+ return new SelectSingle(
159
+ this[Query.Data].with({
160
+ orderBy
161
+ })
162
+ );
163
+ }
164
+ groupBy(...groupBy) {
165
+ return new SelectSingle(
166
+ this[Query.Data].with({
167
+ groupBy: groupBy.map(ExprData.create)
168
+ })
169
+ );
170
+ }
171
+ where(...where) {
172
+ return new SelectSingle(this.addWhere(where));
173
+ }
174
+ take(limit) {
175
+ return new SelectSingle(this[Query.Data].with({ limit }));
176
+ }
177
+ skip(offset) {
178
+ return new SelectSingle(this[Query.Data].with({ offset }));
179
+ }
180
+ all() {
181
+ return new SelectMultiple(this[Query.Data].with({ singleResult: false }));
182
+ }
183
+ [Expr.ToExpr]() {
184
+ return new Expr(new ExprData.Query(this[Query.Data]));
185
+ }
186
+ };
187
+ export {
188
+ SelectMultiple,
189
+ SelectSingle
190
+ };
@@ -0,0 +1,21 @@
1
+ import { EV, Expr } from '../Expr';
2
+ import { Query, QueryData } from '../Query';
3
+ import { Table, TableData } from '../Table';
4
+ import { CreateTable } from './CreateTable';
5
+ import { Delete } from './Delete';
6
+ import { Inserted } from './Insert';
7
+ import { SelectMultiple } from './Select';
8
+ import { Update } from './Update';
9
+ export declare class TableSelect<Definition> extends SelectMultiple<Table.Select<Definition>> {
10
+ protected table: TableData;
11
+ [Query.Data]: QueryData.Select;
12
+ constructor(table: TableData, conditions?: Array<EV<boolean>>);
13
+ as(alias: string): Table<Definition>;
14
+ create(): CreateTable;
15
+ insertSelect(query: SelectMultiple<Table.Insert<Definition>>): Inserted;
16
+ insertOne(record: Table.Insert<Definition>): Query<Table.Select<Definition>>;
17
+ insertAll(data: Array<Table.Insert<Definition>>): Inserted;
18
+ set(data: Table.Update<Definition>): Update<Definition>;
19
+ delete(): Delete;
20
+ get(name: string): Expr<any>;
21
+ }
@@ -0,0 +1,71 @@
1
+ // src/define/query/TableSelect.ts
2
+ import { Expr, ExprData } from "../Expr.js";
3
+ import { Query, QueryData } from "../Query.js";
4
+ import { createTable } from "../Table.js";
5
+ import { Target } from "../Target.js";
6
+ import { CreateTable } from "./CreateTable.js";
7
+ import { Delete } from "./Delete.js";
8
+ import { Insert, Inserted } from "./Insert.js";
9
+ import { SelectMultiple } from "./Select.js";
10
+ import { Update } from "./Update.js";
11
+ var TableSelect = class extends SelectMultiple {
12
+ constructor(table, conditions = []) {
13
+ const target = new Target.Table(table);
14
+ super(
15
+ new QueryData.Select({
16
+ from: target,
17
+ selection: new ExprData.Row(target),
18
+ where: Expr.and(...conditions)[Expr.Data]
19
+ })
20
+ );
21
+ this.table = table;
22
+ }
23
+ as(alias) {
24
+ return createTable({ ...this.table, alias });
25
+ }
26
+ create() {
27
+ return new CreateTable(this.table);
28
+ }
29
+ insertSelect(query) {
30
+ return new Inserted(
31
+ new QueryData.Insert({ into: this.table, select: query[Query.Data] })
32
+ );
33
+ }
34
+ insertOne(record) {
35
+ return new Query(
36
+ new QueryData.Insert({
37
+ into: this.table,
38
+ data: [record],
39
+ selection: new ExprData.Row(new Target.Table(this.table)),
40
+ singleResult: true
41
+ })
42
+ );
43
+ }
44
+ insertAll(data) {
45
+ return new Insert(this.table).values(...data);
46
+ }
47
+ set(data) {
48
+ return new Update(
49
+ new QueryData.Update({
50
+ table: this.table,
51
+ where: this[Query.Data].where
52
+ })
53
+ ).set(data);
54
+ }
55
+ delete() {
56
+ return new Delete(
57
+ new QueryData.Delete({
58
+ table: this.table,
59
+ where: this[Query.Data].where
60
+ })
61
+ );
62
+ }
63
+ get(name) {
64
+ return new Expr(
65
+ new ExprData.Field(new ExprData.Row(new Target.Table(this.table)), name)
66
+ );
67
+ }
68
+ };
69
+ export {
70
+ TableSelect
71
+ };
@@ -0,0 +1,10 @@
1
+ import { Query, QueryData } from '../Query';
2
+ import { SelectMultiple } from './Select';
3
+ export declare class Union<Row> extends Query<Array<Row>> {
4
+ [Query.Data]: QueryData.Union | QueryData.Select;
5
+ constructor(query: QueryData.Union | QueryData.Select);
6
+ union(query: SelectMultiple<Row> | Union<Row>): Union<Row>;
7
+ unionAll(query: SelectMultiple<Row> | Union<Row>): Union<Row>;
8
+ except(query: SelectMultiple<Row> | Union<Row>): Union<Row>;
9
+ intersect(query: SelectMultiple<Row> | Union<Row>): Union<Row>;
10
+ }
@@ -0,0 +1,46 @@
1
+ // src/define/query/Union.ts
2
+ import { Query, QueryData } from "../Query.js";
3
+ var Union = class extends Query {
4
+ constructor(query) {
5
+ super(query);
6
+ }
7
+ union(query) {
8
+ return new Union(
9
+ new QueryData.Union({
10
+ a: this[Query.Data],
11
+ operator: QueryData.UnionOperation.Union,
12
+ b: query[Query.Data]
13
+ })
14
+ );
15
+ }
16
+ unionAll(query) {
17
+ return new Union(
18
+ new QueryData.Union({
19
+ a: this[Query.Data],
20
+ operator: QueryData.UnionOperation.UnionAll,
21
+ b: query[Query.Data]
22
+ })
23
+ );
24
+ }
25
+ except(query) {
26
+ return new Union(
27
+ new QueryData.Union({
28
+ a: this[Query.Data],
29
+ operator: QueryData.UnionOperation.Except,
30
+ b: query[Query.Data]
31
+ })
32
+ );
33
+ }
34
+ intersect(query) {
35
+ return new Union(
36
+ new QueryData.Union({
37
+ a: this[Query.Data],
38
+ operator: QueryData.UnionOperation.Intersect,
39
+ b: query[Query.Data]
40
+ })
41
+ );
42
+ }
43
+ };
44
+ export {
45
+ Union
46
+ };
@@ -0,0 +1,12 @@
1
+ import { EV } from '../Expr';
2
+ import { Query, QueryData } from '../Query';
3
+ import { Table } from '../Table';
4
+ export declare class Update<Definition> extends Query<{
5
+ rowsAffected: number;
6
+ }> {
7
+ [Query.Data]: QueryData.Update;
8
+ set(set: Table.Update<Definition>): Update<Definition>;
9
+ where(...where: Array<EV<boolean>>): Update<Definition>;
10
+ take(limit: number | undefined): Update<Definition>;
11
+ skip(offset: number | undefined): Update<Definition>;
12
+ }
@@ -0,0 +1,19 @@
1
+ // src/define/query/Update.ts
2
+ import { Query } from "../Query.js";
3
+ var Update = class extends Query {
4
+ set(set) {
5
+ return new Update(this[Query.Data].with({ set }));
6
+ }
7
+ where(...where) {
8
+ return new Update(this.addWhere(where));
9
+ }
10
+ take(limit) {
11
+ return new Update(this[Query.Data].with({ limit }));
12
+ }
13
+ skip(offset) {
14
+ return new Update(this[Query.Data].with({ offset }));
15
+ }
16
+ };
17
+ export {
18
+ Update
19
+ };
@@ -1,5 +1,6 @@
1
1
  // src/driver/bun-sqlite.ts
2
- import { Query, QueryData } from "../define/Query.js";
2
+ import { QueryData } from "../define/Query.js";
3
+ import { SelectSingle } from "../define/query/Select.js";
3
4
  import { Driver } from "../lib/Driver.js";
4
5
  import { SqlError } from "../lib/SqlError.js";
5
6
  import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
@@ -34,7 +35,7 @@ var BunSqliteDriver = class extends Driver.Sync {
34
35
  this.tableData = this.prepare(SqliteSchema.tableData);
35
36
  this.indexData = this.prepare(SqliteSchema.indexData);
36
37
  this.lastChanges = this.prepare(() => {
37
- return new Query.SelectSingle(
38
+ return new SelectSingle(
38
39
  new QueryData.Raw({
39
40
  expectedReturn: "row",
40
41
  strings: ["SELECT changes() as rowsAffected"],
@@ -5,8 +5,8 @@ import { Statement } from '../lib/Statement';
5
5
  import { SqliteSchema } from '../sqlite/SqliteSchema';
6
6
  export declare class SqlJsDriver extends Driver.Sync {
7
7
  db: Database;
8
- tableData: (tableName: string) => Array<SqliteSchema.Column>;
9
- indexData: (tableName: string) => Array<SqliteSchema.Index>;
8
+ tableData?: (tableName: string) => Array<SqliteSchema.Column>;
9
+ indexData?: (tableName: string) => Array<SqliteSchema.Index>;
10
10
  constructor(db: Database);
11
11
  prepareStatement(stmt: Statement, discardAfter: boolean): Driver.Sync.PreparedStatement;
12
12
  schemaInstructions(tableName: string): SchemaInstructions | undefined;
@@ -38,8 +38,6 @@ var SqlJsDriver = class extends Driver.Sync {
38
38
  constructor(db) {
39
39
  super(new SqliteFormatter());
40
40
  this.db = db;
41
- this.tableData = this.prepare(SqliteSchema.tableData);
42
- this.indexData = this.prepare(SqliteSchema.indexData);
43
41
  }
44
42
  tableData;
45
43
  indexData;
@@ -55,6 +53,8 @@ var SqlJsDriver = class extends Driver.Sync {
55
53
  }
56
54
  }
57
55
  schemaInstructions(tableName) {
56
+ this.tableData = this.tableData || (this.tableData = this.prepare(SqliteSchema.tableData));
57
+ this.indexData = this.indexData || (this.indexData = this.prepare(SqliteSchema.indexData));
58
58
  const columnData = this.tableData(tableName);
59
59
  const indexData = this.indexData(tableName);
60
60
  return SqliteSchema.createInstructions(columnData, indexData);
@@ -2,6 +2,7 @@ import { Expr } from '../define/Expr';
2
2
  import { Query, QueryData } from '../define/Query';
3
3
  import { SchemaInstructions } from '../define/Schema';
4
4
  import { Table } from '../define/Table';
5
+ import { SelectMultiple } from '../define/query/Select';
5
6
  import { Callable } from '../util/Callable';
6
7
  import { Formatter } from './Formatter';
7
8
  import { Statement } from './Statement';
@@ -9,8 +10,6 @@ declare abstract class DriverBase extends Callable {
9
10
  formatter: Formatter;
10
11
  constructor(formatter: Formatter);
11
12
  compile<T extends Array<Expr<any>>, R>(create: (...params: T) => Query<R>): [QueryData, Statement];
12
- all(...args: Array<any>): any;
13
- get(...args: Array<any>): any;
14
13
  executeTemplate(expectedReturn: QueryData.RawReturn, strings: TemplateStringsArray, ...params: Array<any>): any;
15
14
  abstract executeQuery(query: QueryData): any;
16
15
  }
@@ -32,13 +31,7 @@ declare abstract class SyncDriver extends DriverBase {
32
31
  prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Query<R>): (...params: ParamTypes<T>) => R;
33
32
  migrateSchema(...tables: Array<Table<any>>): unknown;
34
33
  executeQuery(query: QueryData, stmt?: SyncPreparedStatement, params?: Array<any>): unknown;
35
- all<T>(cursor: Query.SelectSingle<T>): Array<T>;
36
- all<T>(cursor: Query<T>): T;
37
- all<T>(strings: TemplateStringsArray, ...params: Array<any>): Array<T>;
38
- get<T>(cursor: Query.SelectMultiple<T>): T | null;
39
- get<T>(cursor: Query<T>): T;
40
- get<T>(strings: TemplateStringsArray, ...params: Array<any>): T;
41
- iterate<T>(cursor: Query.SelectMultiple<T>): Iterable<T>;
34
+ iterate<T>(cursor: SelectMultiple<T>): Iterable<T>;
42
35
  transaction<T>(run: (query: SyncDriver) => T): T;
43
36
  toAsync(): SyncWrapper;
44
37
  }
@@ -65,13 +58,7 @@ declare abstract class AsyncDriver extends DriverBase {
65
58
  prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Query<R>): (...params: ParamTypes<T>) => Promise<R>;
66
59
  migrateSchema(...tables: Array<Table<any>>): Promise<unknown>;
67
60
  executeQuery(query: QueryData, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<unknown>;
68
- all<T>(cursor: Query.SelectSingle<T>): Promise<Array<T>>;
69
- all<T>(cursor: Query<T>): Promise<T>;
70
- all<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<Array<T>>;
71
- get<T>(cursor: Query.SelectMultiple<T>): Promise<T | null>;
72
- get<T>(cursor: Query<T>): Promise<T>;
73
- get<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<T>;
74
- iterate<T>(cursor: Query.SelectMultiple<T>): AsyncIterable<T>;
61
+ iterate<T>(cursor: SelectMultiple<T>): AsyncIterable<T>;
75
62
  transaction<T>(run: (query: AsyncDriver) => T): Promise<T>;
76
63
  }
77
64
  declare class SyncWrapper extends AsyncDriver {
@@ -34,22 +34,6 @@ var DriverBase = class extends Callable {
34
34
  const query = cursor[Query.Data];
35
35
  return [query, this.formatter.compile(query)];
36
36
  }
37
- all(...args) {
38
- const [input, ...rest] = args;
39
- if (Query.isSingle(input))
40
- return this.executeQuery(input.all()[Query.Data]);
41
- if (Query.isQuery(input))
42
- return this.executeQuery(input[Query.Data]);
43
- return this.executeTemplate("rows", input, ...rest);
44
- }
45
- get(...args) {
46
- const [input, ...rest] = args;
47
- if (Query.isMultiple(input))
48
- return this.executeQuery(input.maybeFirst()[Query.Data]);
49
- if (Query.isQuery(input))
50
- return this.executeQuery(input[Query.Data]);
51
- return this.executeTemplate("row", input, ...rest);
52
- }
53
37
  executeTemplate(expectedReturn, strings, ...params) {
54
38
  return this.executeQuery(
55
39
  new QueryData.Raw({ strings, params, expectedReturn })
@@ -109,7 +93,7 @@ var SyncDriver = class extends DriverBase {
109
93
  const compiled = stmt ? void 0 : this.formatter.compile(query);
110
94
  stmt = stmt || this.prepareStatement(compiled, true);
111
95
  params = params || compiled.params();
112
- if ("selection" in query) {
96
+ if ("selection" in query || query.type === QueryType.Union) {
113
97
  const res = stmt.all(params).map((row) => JSON.parse(row.result).result);
114
98
  if (query.singleResult) {
115
99
  const row = res[0];
@@ -133,12 +117,6 @@ var SyncDriver = class extends DriverBase {
133
117
  }
134
118
  }
135
119
  }
136
- all(...args) {
137
- return super.all(...args);
138
- }
139
- get(...args) {
140
- return super.get(...args);
141
- }
142
120
  *iterate(cursor) {
143
121
  const stmt = this.prepareStatement(
144
122
  this.formatter.compile(cursor[Query.Data]),
@@ -229,7 +207,7 @@ var AsyncDriver = class extends DriverBase {
229
207
  const compiled = stmt ? void 0 : this.formatter.compile(query);
230
208
  stmt = stmt || this.prepareStatement(compiled, true);
231
209
  params = params || compiled.params();
232
- if ("selection" in query) {
210
+ if ("selection" in query || query.type === QueryType.Union) {
233
211
  const res = (await stmt.all(params)).map(
234
212
  (item) => JSON.parse(item.result).result
235
213
  );
@@ -255,12 +233,6 @@ var AsyncDriver = class extends DriverBase {
255
233
  }
256
234
  }
257
235
  }
258
- all(...args) {
259
- return super.all(...args);
260
- }
261
- get(...args) {
262
- return super.get(...args);
263
- }
264
236
  async *iterate(cursor) {
265
237
  const stmt = this.prepareStatement(
266
238
  this.formatter.compile(cursor[Query.Data]),
@@ -49,6 +49,7 @@ export declare abstract class Formatter implements Sanitizer {
49
49
  };
50
50
  format(ctx: FormatContext, query: QueryData): Statement;
51
51
  formatSelect({ topLevel, ...ctx }: FormatContext, query: QueryData.Select): Statement;
52
+ formatUnion(ctx: FormatContext, { a, operator, b }: QueryData.Union): Statement;
52
53
  formatInsert(ctx: FormatContext, query: QueryData.Insert): Statement;
53
54
  formatUpdate(ctx: FormatContext, query: QueryData.Update): Statement;
54
55
  formatDelete(ctx: FormatContext, query: QueryData.Delete): Statement;
@@ -31,6 +31,12 @@ var joins = {
31
31
  left: "LEFT",
32
32
  inner: "INNER"
33
33
  };
34
+ var unions = {
35
+ [QueryData.UnionOperation.Union]: "UNION",
36
+ [QueryData.UnionOperation.UnionAll]: "UNION ALL",
37
+ [QueryData.UnionOperation.Intersect]: "INTERSECT",
38
+ [QueryData.UnionOperation.Except]: "EXCEPT"
39
+ };
34
40
  function formatAsResultObject(stmt, mkSubject) {
35
41
  stmt.raw("json_object('result', ");
36
42
  mkSubject();
@@ -53,6 +59,8 @@ var Formatter = class {
53
59
  switch (query.type) {
54
60
  case QueryType.Select:
55
61
  return this.formatSelect(ctx, query);
62
+ case QueryType.Union:
63
+ return this.formatUnion(ctx, query);
56
64
  case QueryType.Insert:
57
65
  return this.formatInsert(ctx, query);
58
66
  case QueryType.Update:
@@ -79,21 +87,38 @@ var Formatter = class {
79
87
  }
80
88
  formatSelect({ topLevel, ...ctx }, query) {
81
89
  const { stmt } = ctx;
82
- stmt.raw("SELECT").space();
83
- this.formatSelection(
84
- ctx,
85
- query.selection,
86
- topLevel ? formatAsResultObject : void 0
87
- );
88
- if (query.from) {
89
- stmt.addLine("FROM").space();
90
- this.formatTarget(ctx, query.from);
90
+ switch (query.from?.type) {
91
+ case TargetType.CTE:
92
+ stmt.add("WITH RECURSIVE").addIdentifier(query.from.name).add("AS").space().openParenthesis();
93
+ this.formatUnion(
94
+ { ...ctx, topLevel: false, selectAsColumns: true },
95
+ query.from.union
96
+ );
97
+ stmt.closeParenthesis().space();
98
+ default:
99
+ stmt.raw("SELECT").space();
100
+ this.formatSelection(
101
+ ctx,
102
+ query.selection,
103
+ topLevel ? formatAsResultObject : void 0
104
+ );
105
+ if (query.from) {
106
+ stmt.addLine("FROM").space();
107
+ this.formatTarget(ctx, query.from);
108
+ }
109
+ this.formatWhere(ctx, query.where);
110
+ this.formatGroupBy(ctx, query.groupBy);
111
+ this.formatHaving(ctx, query.having);
112
+ this.formatOrderBy(ctx, query.orderBy);
113
+ this.formatLimit(ctx, query);
114
+ return stmt;
91
115
  }
92
- this.formatWhere(ctx, query.where);
93
- this.formatGroupBy(ctx, query.groupBy);
94
- this.formatHaving(ctx, query.having);
95
- this.formatOrderBy(ctx, query.orderBy);
96
- this.formatLimit(ctx, query);
116
+ }
117
+ formatUnion(ctx, { a, operator, b }) {
118
+ const { stmt } = ctx;
119
+ this.format(ctx, a);
120
+ stmt.add(unions[operator]).space();
121
+ this.format(ctx, b);
97
122
  return stmt;
98
123
  }
99
124
  formatInsert(ctx, query) {
@@ -377,6 +402,8 @@ var Formatter = class {
377
402
  if (target.alias)
378
403
  stmt.add("AS").addIdentifier(target.alias);
379
404
  return stmt;
405
+ case TargetType.CTE:
406
+ return stmt.addIdentifier(target.name);
380
407
  case TargetType.Expr:
381
408
  throw new Error("Cannot format expression as target");
382
409
  }
@@ -685,6 +712,7 @@ var Formatter = class {
685
712
  const inner = { ...ctx, selectAsColumns: false };
686
713
  for (const [key, value] of stmt.separate(Object.entries(expr.fields))) {
687
714
  this.formatExprJson(inner, value);
715
+ stmt.add("AS").addIdentifier(key);
688
716
  }
689
717
  return stmt;
690
718
  }