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.
- package/dist/define/CTE.d.ts +2 -0
- package/dist/define/CTE.js +51 -0
- package/dist/define/Expr.d.ts +5 -4
- package/dist/define/Fields.d.ts +2 -2
- package/dist/define/Functions.js +4 -2
- package/dist/define/Ops.d.ts +11 -7
- package/dist/define/Ops.js +11 -6
- package/dist/define/Query.d.ts +24 -95
- package/dist/define/Query.js +28 -310
- package/dist/define/Selection.d.ts +2 -2
- package/dist/define/Table.d.ts +9 -7
- package/dist/define/Table.js +41 -3
- package/dist/define/Target.d.ts +8 -1
- package/dist/define/Target.js +9 -0
- package/dist/define/query/Batch.d.ts +7 -0
- package/dist/define/query/Batch.js +18 -0
- package/dist/define/query/CreateTable.d.ts +6 -0
- package/dist/define/query/CreateTable.js +12 -0
- package/dist/define/query/Delete.d.ts +11 -0
- package/dist/define/query/Delete.js +19 -0
- package/dist/define/query/Insert.d.ts +19 -0
- package/dist/define/query/Insert.js +36 -0
- package/dist/define/query/Select.d.ts +41 -0
- package/dist/define/query/Select.js +190 -0
- package/dist/define/query/TableSelect.d.ts +21 -0
- package/dist/define/query/TableSelect.js +71 -0
- package/dist/define/query/Union.d.ts +10 -0
- package/dist/define/query/Union.js +46 -0
- package/dist/define/query/Update.d.ts +12 -0
- package/dist/define/query/Update.js +19 -0
- package/dist/driver/bun-sqlite.js +3 -2
- package/dist/driver/sql.js.d.ts +2 -2
- package/dist/driver/sql.js.js +2 -2
- package/dist/lib/Driver.d.ts +3 -16
- package/dist/lib/Driver.js +2 -30
- package/dist/lib/Formatter.d.ts +1 -0
- package/dist/lib/Formatter.js +42 -14
- package/dist/sqlite/SqliteSchema.js +3 -3
- 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 {
|
|
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
|
|
38
|
+
return new SelectSingle(
|
|
38
39
|
new QueryData.Raw({
|
|
39
40
|
expectedReturn: "row",
|
|
40
41
|
strings: ["SELECT changes() as rowsAffected"],
|
package/dist/driver/sql.js.d.ts
CHANGED
|
@@ -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
|
|
9
|
-
indexData
|
|
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;
|
package/dist/driver/sql.js.js
CHANGED
|
@@ -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);
|
package/dist/lib/Driver.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 {
|
package/dist/lib/Driver.js
CHANGED
|
@@ -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]),
|
package/dist/lib/Formatter.d.ts
CHANGED
|
@@ -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;
|
package/dist/lib/Formatter.js
CHANGED
|
@@ -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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
this.
|
|
96
|
-
|
|
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
|
}
|