rado 0.3.3 → 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.
- package/README.md +277 -277
- package/dist/define/CTE.d.ts +2 -0
- package/dist/define/CTE.js +51 -0
- package/dist/define/Cursor.d.ts +108 -0
- package/dist/define/Cursor.js +338 -0
- package/dist/define/Table.d.ts +5 -1
- package/dist/define/Table.js +5 -0
- package/dist/define/Update.d.ts +4 -0
- package/dist/define/Update.js +0 -0
- package/dist/define/query/Batch.d.ts +7 -0
- package/dist/define/query/Batch.js +17 -0
- package/dist/define/query/CreateTable.d.ts +6 -0
- package/dist/define/query/CreateTable.js +11 -0
- package/dist/define/query/Delete.d.ts +11 -0
- package/dist/define/query/Delete.js +18 -0
- package/dist/define/query/Insert.d.ts +22 -0
- package/dist/define/query/Insert.js +47 -0
- package/dist/define/query/Select.d.ts +39 -0
- package/dist/define/query/Select.js +170 -0
- package/dist/define/query/TableSelect.d.ts +28 -0
- package/dist/define/query/TableSelect.js +79 -0
- package/dist/define/query/Union.d.ts +17 -0
- package/dist/define/query/Union.js +116 -0
- package/dist/define/query/Update.d.ts +12 -0
- package/dist/define/query/Update.js +18 -0
- package/dist/deno/driver/better-sqlite3.js +57 -0
- package/dist/deno/driver/bun-sqlite.js +69 -0
- package/dist/deno/driver/sql.js.js +72 -0
- package/dist/deno/driver/sqlite3.js +123 -0
- package/dist/deno/index.js +14 -0
- package/dist/deno/lib/Driver.js +330 -0
- package/dist/deno/lib/Formatter.js +715 -0
- package/dist/deno/lib/Sanitizer.js +0 -0
- package/dist/deno/lib/SqlError.js +11 -0
- package/dist/deno/lib/Statement.js +108 -0
- package/dist/deno/sqlite/SqliteFormatter.js +70 -0
- package/dist/deno/sqlite/SqliteFunctions.js +150 -0
- package/dist/deno/sqlite/SqliteSchema.js +47 -0
- package/dist/deno/sqlite.js +3 -0
- package/dist/deno/util/Callable.js +15 -0
- package/dist/lib/Formatter.js +17 -3
- package/dist/sqlite/index.d.ts +2 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/src/driver/better-sqlite3.js +49 -0
- package/dist/src/driver/sql.js.js +66 -0
- package/dist/src/driver/sqlite3.js +87 -0
- package/dist/src/index.js +24 -0
- package/dist/src/lib/Column.js +63 -0
- package/dist/src/lib/Cursor.js +231 -0
- package/dist/src/lib/Driver.js +316 -0
- package/dist/src/lib/Expr.js +284 -0
- package/dist/src/lib/Fields.js +0 -0
- package/dist/src/lib/Formatter.js +625 -0
- package/dist/src/lib/Functions.js +11 -0
- package/dist/src/lib/Id.js +0 -0
- package/dist/src/lib/Index.js +20 -0
- package/dist/src/lib/Ops.js +45 -0
- package/dist/src/lib/OrderBy.js +9 -0
- package/dist/src/lib/Param.js +27 -0
- package/dist/src/lib/Query.js +74 -0
- package/dist/src/lib/Sanitizer.js +0 -0
- package/dist/src/lib/Schema.js +67 -0
- package/dist/src/lib/Selection.js +7 -0
- package/dist/src/lib/Statement.js +103 -0
- package/dist/src/lib/Table.js +130 -0
- package/dist/src/lib/Target.js +37 -0
- package/dist/src/lib/Update.js +0 -0
- package/dist/src/sqlite/SqliteFormatter.js +67 -0
- package/dist/src/sqlite/SqliteFunctions.js +146 -0
- package/dist/src/sqlite/SqliteSchema.js +47 -0
- package/dist/src/sqlite.js +3 -0
- package/dist/test/DbSuite.js +28 -0
- package/dist/test/TSTestTypes.js +6 -0
- package/dist/test/TestBasic.js +172 -0
- package/dist/test/TestExtend.js +68 -0
- package/dist/test/TestFts5.js +34 -0
- package/dist/test/TestFunctions.js +28 -0
- package/dist/test/TestJoins.js +34 -0
- package/dist/test/TestJson.js +33 -0
- package/dist/test/TestPrepare.js +27 -0
- package/dist/test/TestRawSql.js +31 -0
- package/dist/test/TestSchema.js +69 -0
- package/dist/test/TestSubQueries.js +79 -0
- package/dist/test/TestTransaction.js +54 -0
- package/dist/test/TestUpdate.js +95 -0
- package/dist/test/index.js +14 -0
- package/package.json +74 -74
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Driver } from '../lib/Driver';
|
|
2
|
+
import { CompileOptions } from '../lib/Formatter';
|
|
3
|
+
import { EV, Expr } from './Expr';
|
|
4
|
+
import { OrderBy } from './OrderBy';
|
|
5
|
+
import { Query } from './Query';
|
|
6
|
+
import { Selection } from './Selection';
|
|
7
|
+
import { Table, TableData } from './Table';
|
|
8
|
+
declare const QUERY: unique symbol;
|
|
9
|
+
export declare class Cursor<T> {
|
|
10
|
+
[Selection.CursorType]: () => T;
|
|
11
|
+
[QUERY]: Query<T>;
|
|
12
|
+
static Query: typeof QUERY;
|
|
13
|
+
constructor(query: Query<T>);
|
|
14
|
+
static all(strings: TemplateStringsArray, ...params: Array<any>): Cursor<any>;
|
|
15
|
+
next<T>(cursor: Cursor<T>): Cursor<T>;
|
|
16
|
+
on(driver: Driver.Sync): T;
|
|
17
|
+
on(driver: Driver.Async): Promise<T>;
|
|
18
|
+
toSql(driver: Driver, options?: CompileOptions): string;
|
|
19
|
+
toJSON(): Query<T>;
|
|
20
|
+
}
|
|
21
|
+
export declare namespace Cursor {
|
|
22
|
+
class Delete extends Cursor<{
|
|
23
|
+
rowsAffected: number;
|
|
24
|
+
}> {
|
|
25
|
+
query(): Query.Delete;
|
|
26
|
+
where(...where: Array<EV<boolean>>): Delete;
|
|
27
|
+
take(limit: number | undefined): Delete;
|
|
28
|
+
skip(offset: number | undefined): Delete;
|
|
29
|
+
}
|
|
30
|
+
class Update<Definition> extends Cursor<{
|
|
31
|
+
rowsAffected: number;
|
|
32
|
+
}> {
|
|
33
|
+
[QUERY]: Query.Update;
|
|
34
|
+
set(set: Table.Update<Definition>): Update<Definition>;
|
|
35
|
+
where(...where: Array<EV<boolean>>): Update<Definition>;
|
|
36
|
+
take(limit: number | undefined): Update<Definition>;
|
|
37
|
+
skip(offset: number | undefined): Update<Definition>;
|
|
38
|
+
}
|
|
39
|
+
class InsertValuesReturning<T> extends Cursor<T> {
|
|
40
|
+
}
|
|
41
|
+
class Inserted extends Cursor<{
|
|
42
|
+
rowsAffected: number;
|
|
43
|
+
}> {
|
|
44
|
+
[QUERY]: Query.Insert;
|
|
45
|
+
constructor(query: Query.Insert);
|
|
46
|
+
returning<X extends Selection>(selection: X): InsertValuesReturning<Selection.Infer<X>>;
|
|
47
|
+
}
|
|
48
|
+
class Insert<Definition> {
|
|
49
|
+
protected into: TableData;
|
|
50
|
+
constructor(into: TableData);
|
|
51
|
+
selection(query: Cursor.SelectMultiple<Table.Select<Definition>>): Inserted;
|
|
52
|
+
values(...data: Array<Table.Insert<Definition>>): Inserted;
|
|
53
|
+
}
|
|
54
|
+
class CreateTable extends Cursor<void> {
|
|
55
|
+
protected table: TableData;
|
|
56
|
+
constructor(table: TableData);
|
|
57
|
+
}
|
|
58
|
+
class Batch<T = void> extends Cursor<T> {
|
|
59
|
+
protected queries: Array<Query>;
|
|
60
|
+
[QUERY]: Query.Batch;
|
|
61
|
+
constructor(queries: Array<Query>);
|
|
62
|
+
next<T>(cursor: Cursor<T>): Cursor<T>;
|
|
63
|
+
}
|
|
64
|
+
class SelectMultiple<Row> extends Cursor<Array<Row>> {
|
|
65
|
+
[QUERY]: Query.Select;
|
|
66
|
+
constructor(query: Query.Select);
|
|
67
|
+
leftJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectMultiple<Row>;
|
|
68
|
+
innerJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectMultiple<Row>;
|
|
69
|
+
select<X extends Selection>(selection: X): SelectMultiple<Selection.Infer<X>>;
|
|
70
|
+
count(): SelectSingle<number>;
|
|
71
|
+
orderBy(...orderBy: Array<Expr<any> | OrderBy>): SelectMultiple<Row>;
|
|
72
|
+
groupBy(...groupBy: Array<Expr<any>>): SelectMultiple<Row>;
|
|
73
|
+
first(): SelectSingle<Row | undefined>;
|
|
74
|
+
sure(): SelectSingle<Row>;
|
|
75
|
+
where(...where: Array<EV<boolean>>): SelectMultiple<Row>;
|
|
76
|
+
take(limit: number | undefined): SelectMultiple<Row>;
|
|
77
|
+
skip(offset: number | undefined): SelectMultiple<Row>;
|
|
78
|
+
[Expr.ToExpr](): Expr<Row>;
|
|
79
|
+
}
|
|
80
|
+
class TableSelect<Definition> extends SelectMultiple<Table.Select<Definition>> {
|
|
81
|
+
protected table: TableData;
|
|
82
|
+
[QUERY]: Query.Select;
|
|
83
|
+
constructor(table: TableData, conditions?: Array<EV<boolean>>);
|
|
84
|
+
as(alias: string): Table<Definition>;
|
|
85
|
+
create(): CreateTable;
|
|
86
|
+
insertSelect(query: SelectMultiple<Table.Insert<Definition>>): Inserted;
|
|
87
|
+
insertOne(record: Table.Insert<Definition>): Cursor<Table.Select<Definition>>;
|
|
88
|
+
insertAll(data: Array<Table.Insert<Definition>>): Inserted;
|
|
89
|
+
set(data: Table.Update<Definition>): Update<Definition>;
|
|
90
|
+
delete(): Delete;
|
|
91
|
+
get(name: string): Expr<any>;
|
|
92
|
+
}
|
|
93
|
+
class SelectSingle<Row> extends Cursor<Row> {
|
|
94
|
+
[QUERY]: Query.Select;
|
|
95
|
+
constructor(query: Query.Select);
|
|
96
|
+
leftJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectSingle<Row>;
|
|
97
|
+
innerJoin<C>(that: Table<C> | TableSelect<C>, ...on: Array<EV<boolean>>): SelectSingle<Row>;
|
|
98
|
+
select<X extends Selection>(selection: X): SelectSingle<Selection.Infer<X>>;
|
|
99
|
+
orderBy(...orderBy: Array<OrderBy>): SelectSingle<Row>;
|
|
100
|
+
groupBy(...groupBy: Array<Expr<any>>): SelectSingle<Row>;
|
|
101
|
+
where(...where: Array<EV<boolean>>): SelectSingle<Row>;
|
|
102
|
+
take(limit: number | undefined): SelectSingle<Row>;
|
|
103
|
+
skip(offset: number | undefined): SelectSingle<Row>;
|
|
104
|
+
all(): SelectMultiple<Row>;
|
|
105
|
+
[Expr.ToExpr](): Expr<Row>;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export {};
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
// src/define/Cursor.ts
|
|
9
|
+
import { Expr, ExprData } from "./Expr.js";
|
|
10
|
+
import { Functions } from "./Functions.js";
|
|
11
|
+
import { Query } from "./Query.js";
|
|
12
|
+
import { Schema } from "./Schema.js";
|
|
13
|
+
import { Selection } from "./Selection.js";
|
|
14
|
+
import { Table, createTable } from "./Table.js";
|
|
15
|
+
import { Target } from "./Target.js";
|
|
16
|
+
var QUERY = Symbol("Cursor.Query");
|
|
17
|
+
var _Cursor = class {
|
|
18
|
+
[(Selection.CursorType, QUERY)];
|
|
19
|
+
constructor(query) {
|
|
20
|
+
this[QUERY] = query;
|
|
21
|
+
}
|
|
22
|
+
static all(strings, ...params) {
|
|
23
|
+
return new _Cursor(Query.Raw({ expectedReturn: "rows", strings, params }));
|
|
24
|
+
}
|
|
25
|
+
next(cursor) {
|
|
26
|
+
return new _Cursor(
|
|
27
|
+
Query.Batch({
|
|
28
|
+
queries: [this[QUERY], cursor[QUERY]]
|
|
29
|
+
})
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
on(driver) {
|
|
33
|
+
return driver.executeQuery(this[QUERY]);
|
|
34
|
+
}
|
|
35
|
+
toSql(driver, options = { forceInline: true }) {
|
|
36
|
+
return driver.formatter.compile(this[QUERY], options).sql;
|
|
37
|
+
}
|
|
38
|
+
toJSON() {
|
|
39
|
+
return this[QUERY];
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var Cursor = _Cursor;
|
|
43
|
+
__publicField(Cursor, "Query", QUERY);
|
|
44
|
+
function addWhere(query, where) {
|
|
45
|
+
const conditions = where.slice();
|
|
46
|
+
if (query.where)
|
|
47
|
+
conditions.push(new Expr(query.where));
|
|
48
|
+
return {
|
|
49
|
+
...query,
|
|
50
|
+
where: Expr.and(...conditions)[Expr.Data]
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
((Cursor2) => {
|
|
54
|
+
class Delete extends Cursor2 {
|
|
55
|
+
query() {
|
|
56
|
+
return super[QUERY];
|
|
57
|
+
}
|
|
58
|
+
where(...where) {
|
|
59
|
+
return new Delete(addWhere(this[QUERY], where));
|
|
60
|
+
}
|
|
61
|
+
take(limit) {
|
|
62
|
+
return new Delete({ ...this[QUERY], limit });
|
|
63
|
+
}
|
|
64
|
+
skip(offset) {
|
|
65
|
+
return new Delete({ ...this[QUERY], offset });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
Cursor2.Delete = Delete;
|
|
69
|
+
const _Update = class extends Cursor2 {
|
|
70
|
+
set(set) {
|
|
71
|
+
return new _Update({ ...this[QUERY], set });
|
|
72
|
+
}
|
|
73
|
+
where(...where) {
|
|
74
|
+
return new _Update(addWhere(this[QUERY], where));
|
|
75
|
+
}
|
|
76
|
+
take(limit) {
|
|
77
|
+
return new _Update({ ...this[QUERY], limit });
|
|
78
|
+
}
|
|
79
|
+
skip(offset) {
|
|
80
|
+
return new _Update({ ...this[QUERY], offset });
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
let Update = _Update;
|
|
84
|
+
QUERY;
|
|
85
|
+
Cursor2.Update = Update;
|
|
86
|
+
class InsertValuesReturning extends Cursor2 {
|
|
87
|
+
}
|
|
88
|
+
Cursor2.InsertValuesReturning = InsertValuesReturning;
|
|
89
|
+
class Inserted extends Cursor2 {
|
|
90
|
+
constructor(query) {
|
|
91
|
+
super(query);
|
|
92
|
+
}
|
|
93
|
+
returning(selection) {
|
|
94
|
+
return new InsertValuesReturning(
|
|
95
|
+
Query.Insert({ ...this[QUERY], selection: ExprData.create(selection) })
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
QUERY;
|
|
100
|
+
Cursor2.Inserted = Inserted;
|
|
101
|
+
class Insert {
|
|
102
|
+
constructor(into) {
|
|
103
|
+
this.into = into;
|
|
104
|
+
}
|
|
105
|
+
selection(query) {
|
|
106
|
+
return new Inserted(Query.Insert({ into: this.into, select: query[QUERY] }));
|
|
107
|
+
}
|
|
108
|
+
values(...data) {
|
|
109
|
+
return new Inserted(Query.Insert({ into: this.into, data }));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
Cursor2.Insert = Insert;
|
|
113
|
+
class CreateTable extends Cursor2 {
|
|
114
|
+
constructor(table) {
|
|
115
|
+
super(Schema.create(table));
|
|
116
|
+
this.table = table;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
Cursor2.CreateTable = CreateTable;
|
|
120
|
+
class Batch extends Cursor2 {
|
|
121
|
+
constructor(queries) {
|
|
122
|
+
super(Query.Batch({ queries }));
|
|
123
|
+
this.queries = queries;
|
|
124
|
+
}
|
|
125
|
+
next(cursor) {
|
|
126
|
+
return new Cursor2(
|
|
127
|
+
Query.Batch({
|
|
128
|
+
queries: [...this[QUERY].queries, cursor[QUERY]]
|
|
129
|
+
})
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
QUERY;
|
|
134
|
+
Cursor2.Batch = Batch;
|
|
135
|
+
function joinTarget(joinType, query, to, on) {
|
|
136
|
+
const toQuery = to instanceof Cursor2 ? to[QUERY] : void 0;
|
|
137
|
+
const target = toQuery ? toQuery.from : Target.Table(to[Table.Data]);
|
|
138
|
+
if (!query.from || !target)
|
|
139
|
+
throw new Error("No from clause");
|
|
140
|
+
const conditions = [...on];
|
|
141
|
+
if (toQuery) {
|
|
142
|
+
const where = toQuery.where;
|
|
143
|
+
if (where)
|
|
144
|
+
conditions.push(new Expr(where));
|
|
145
|
+
}
|
|
146
|
+
return Target.Join(
|
|
147
|
+
query.from,
|
|
148
|
+
target,
|
|
149
|
+
joinType,
|
|
150
|
+
Expr.and(...conditions)[Expr.Data]
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
class SelectMultiple extends Cursor2 {
|
|
154
|
+
constructor(query) {
|
|
155
|
+
super(query);
|
|
156
|
+
}
|
|
157
|
+
leftJoin(that, ...on) {
|
|
158
|
+
const query = this[QUERY];
|
|
159
|
+
return new SelectMultiple({
|
|
160
|
+
...query,
|
|
161
|
+
from: joinTarget("left", query, that, on)
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
innerJoin(that, ...on) {
|
|
165
|
+
const query = this[QUERY];
|
|
166
|
+
return new SelectMultiple({
|
|
167
|
+
...query,
|
|
168
|
+
from: joinTarget("inner", query, that, on)
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
select(selection) {
|
|
172
|
+
return new SelectMultiple({
|
|
173
|
+
...this[QUERY],
|
|
174
|
+
selection: ExprData.create(selection)
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
count() {
|
|
178
|
+
return new SelectSingle({
|
|
179
|
+
...this[QUERY],
|
|
180
|
+
selection: Functions.count()[Expr.Data],
|
|
181
|
+
singleResult: true
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
orderBy(...orderBy) {
|
|
185
|
+
return new SelectMultiple({
|
|
186
|
+
...this[QUERY],
|
|
187
|
+
orderBy: orderBy.map((e) => {
|
|
188
|
+
return Expr.isExpr(e) ? e.asc() : e;
|
|
189
|
+
})
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
groupBy(...groupBy) {
|
|
193
|
+
return new SelectMultiple({
|
|
194
|
+
...this[QUERY],
|
|
195
|
+
groupBy: groupBy.map(ExprData.create)
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
first() {
|
|
199
|
+
return new SelectSingle({ ...this[QUERY], singleResult: true });
|
|
200
|
+
}
|
|
201
|
+
sure() {
|
|
202
|
+
return new SelectSingle({
|
|
203
|
+
...this[QUERY],
|
|
204
|
+
singleResult: true,
|
|
205
|
+
validate: true
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
where(...where) {
|
|
209
|
+
return new SelectMultiple(addWhere(this[QUERY], where));
|
|
210
|
+
}
|
|
211
|
+
take(limit) {
|
|
212
|
+
return new SelectMultiple({ ...this[QUERY], limit });
|
|
213
|
+
}
|
|
214
|
+
skip(offset) {
|
|
215
|
+
return new SelectMultiple({ ...this[QUERY], offset });
|
|
216
|
+
}
|
|
217
|
+
[(QUERY, Expr.ToExpr)]() {
|
|
218
|
+
return new Expr(ExprData.Query(this[QUERY]));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
Cursor2.SelectMultiple = SelectMultiple;
|
|
222
|
+
class TableSelect extends SelectMultiple {
|
|
223
|
+
constructor(table, conditions = []) {
|
|
224
|
+
const target = Target.Table(table);
|
|
225
|
+
super(
|
|
226
|
+
Query.Select({
|
|
227
|
+
from: target,
|
|
228
|
+
selection: ExprData.Row(target),
|
|
229
|
+
where: Expr.and(...conditions)[Expr.Data]
|
|
230
|
+
})
|
|
231
|
+
);
|
|
232
|
+
this.table = table;
|
|
233
|
+
}
|
|
234
|
+
as(alias) {
|
|
235
|
+
return createTable({ ...this.table, alias });
|
|
236
|
+
}
|
|
237
|
+
create() {
|
|
238
|
+
return new Cursor2.CreateTable(this.table);
|
|
239
|
+
}
|
|
240
|
+
insertSelect(query) {
|
|
241
|
+
return new Cursor2.Inserted(
|
|
242
|
+
Query.Insert({ into: this.table, select: query[QUERY] })
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
insertOne(record) {
|
|
246
|
+
return new Cursor2(
|
|
247
|
+
Query.Insert({
|
|
248
|
+
into: this.table,
|
|
249
|
+
data: [record],
|
|
250
|
+
selection: ExprData.Row(Target.Table(this.table)),
|
|
251
|
+
singleResult: true
|
|
252
|
+
})
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
insertAll(data) {
|
|
256
|
+
return new Cursor2.Insert(this.table).values(...data);
|
|
257
|
+
}
|
|
258
|
+
set(data) {
|
|
259
|
+
return new Cursor2.Update(
|
|
260
|
+
Query.Update({
|
|
261
|
+
table: this.table,
|
|
262
|
+
where: this[QUERY].where
|
|
263
|
+
})
|
|
264
|
+
).set(data);
|
|
265
|
+
}
|
|
266
|
+
delete() {
|
|
267
|
+
return new Cursor2.Delete(
|
|
268
|
+
Query.Delete({
|
|
269
|
+
table: this.table,
|
|
270
|
+
where: this[QUERY].where
|
|
271
|
+
})
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
get(name) {
|
|
275
|
+
return new Expr(
|
|
276
|
+
ExprData.Field(ExprData.Row(Target.Table(this.table)), name)
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
QUERY;
|
|
281
|
+
Cursor2.TableSelect = TableSelect;
|
|
282
|
+
class SelectSingle extends Cursor2 {
|
|
283
|
+
constructor(query) {
|
|
284
|
+
super(query);
|
|
285
|
+
}
|
|
286
|
+
leftJoin(that, ...on) {
|
|
287
|
+
const query = this[QUERY];
|
|
288
|
+
return new SelectSingle({
|
|
289
|
+
...query,
|
|
290
|
+
from: joinTarget("left", query, that, on)
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
innerJoin(that, ...on) {
|
|
294
|
+
const query = this[QUERY];
|
|
295
|
+
return new SelectSingle({
|
|
296
|
+
...query,
|
|
297
|
+
from: joinTarget("inner", query, that, on)
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
select(selection) {
|
|
301
|
+
return new SelectSingle({
|
|
302
|
+
...this[QUERY],
|
|
303
|
+
selection: ExprData.create(selection)
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
orderBy(...orderBy) {
|
|
307
|
+
return new SelectSingle({
|
|
308
|
+
...this[QUERY],
|
|
309
|
+
orderBy
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
groupBy(...groupBy) {
|
|
313
|
+
return new SelectSingle({
|
|
314
|
+
...this[QUERY],
|
|
315
|
+
groupBy: groupBy.map(ExprData.create)
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
where(...where) {
|
|
319
|
+
return new SelectSingle(addWhere(this[QUERY], where));
|
|
320
|
+
}
|
|
321
|
+
take(limit) {
|
|
322
|
+
return new SelectSingle({ ...this[QUERY], limit });
|
|
323
|
+
}
|
|
324
|
+
skip(offset) {
|
|
325
|
+
return new SelectSingle({ ...this[QUERY], offset });
|
|
326
|
+
}
|
|
327
|
+
all() {
|
|
328
|
+
return new SelectMultiple({ ...this[QUERY], singleResult: false });
|
|
329
|
+
}
|
|
330
|
+
[(QUERY, Expr.ToExpr)]() {
|
|
331
|
+
return new Expr(ExprData.Query(this[QUERY]));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
Cursor2.SelectSingle = SelectSingle;
|
|
335
|
+
})(Cursor || (Cursor = {}));
|
|
336
|
+
export {
|
|
337
|
+
Cursor
|
|
338
|
+
};
|
package/dist/define/Table.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Callable } from '../util/Callable.js';
|
|
2
2
|
import { Column, ColumnData, OptionalColumn, PrimaryColumn } from './Column.js';
|
|
3
|
-
import { EV, Expr } from './Expr.js';
|
|
3
|
+
import { EV, Expr, ExprData } from './Expr.js';
|
|
4
4
|
import type { Fields } from './Fields.js';
|
|
5
5
|
import { Index, IndexData } from './Index.js';
|
|
6
6
|
import { SelectFirst, TableSelect } from './Query.js';
|
|
@@ -11,6 +11,7 @@ export declare class TableData {
|
|
|
11
11
|
definition: {};
|
|
12
12
|
columns: Record<string, ColumnData>;
|
|
13
13
|
meta: () => {
|
|
14
|
+
primaryKey?: Array<ExprData>;
|
|
14
15
|
indexes: Record<string, IndexData>;
|
|
15
16
|
};
|
|
16
17
|
constructor(data: TableData);
|
|
@@ -42,6 +43,7 @@ type UpdateOf<Definition> = Partial<{
|
|
|
42
43
|
export declare namespace Table {
|
|
43
44
|
export const Data: unique symbol;
|
|
44
45
|
export const Indexes: unique symbol;
|
|
46
|
+
export const PrimaryKey: unique symbol;
|
|
45
47
|
export type Of<Row> = TableOf<Row>;
|
|
46
48
|
export type Select<Definition> = RowOf<Definition>;
|
|
47
49
|
export type Update<Definition> = UpdateOf<Definition>;
|
|
@@ -64,8 +66,10 @@ export declare function createTable<Definition>(data: TableData): Table<Definiti
|
|
|
64
66
|
export declare function table<T extends {}, Indexes extends Record<string, Index>>(define: {
|
|
65
67
|
[key: string]: T | Define<T>;
|
|
66
68
|
[Table.Indexes]?: (this: T) => Indexes;
|
|
69
|
+
[Table.PrimaryKey]?: (this: T) => Array<Column<any>>;
|
|
67
70
|
}): {} extends Indexes ? Table<T> : IndexedTable<T, keyof Indexes>;
|
|
68
71
|
export declare namespace table {
|
|
69
72
|
const indexes: typeof Table.Indexes;
|
|
73
|
+
const primaryKey: typeof Table.PrimaryKey;
|
|
70
74
|
}
|
|
71
75
|
export {};
|
package/dist/define/Table.js
CHANGED
|
@@ -24,6 +24,7 @@ var Table;
|
|
|
24
24
|
((Table2) => {
|
|
25
25
|
Table2.Data = Symbol("Table.Data");
|
|
26
26
|
Table2.Indexes = Symbol("Table.Indexes");
|
|
27
|
+
Table2.PrimaryKey = Symbol("Table.PrimaryKey");
|
|
27
28
|
})(Table || (Table = {}));
|
|
28
29
|
function createTable(data) {
|
|
29
30
|
const target = new Target.Table(data);
|
|
@@ -109,7 +110,10 @@ function table(define) {
|
|
|
109
110
|
meta() {
|
|
110
111
|
const createIndexes = define[Table.Indexes];
|
|
111
112
|
const indexes = createIndexes ? createIndexes.apply(res) : {};
|
|
113
|
+
const createPrimaryKey = define[Table.PrimaryKey];
|
|
114
|
+
const primaryKey = createPrimaryKey ? createPrimaryKey.apply(res).map(ExprData.create) : void 0;
|
|
112
115
|
return {
|
|
116
|
+
primaryKey,
|
|
113
117
|
indexes: fromEntries(
|
|
114
118
|
entries(indexes || {}).map(([key, index]) => {
|
|
115
119
|
const indexName = `${name}.${key}`;
|
|
@@ -124,6 +128,7 @@ function table(define) {
|
|
|
124
128
|
}
|
|
125
129
|
((table2) => {
|
|
126
130
|
table2.indexes = Table.Indexes;
|
|
131
|
+
table2.primaryKey = Table.PrimaryKey;
|
|
127
132
|
})(table || (table = {}));
|
|
128
133
|
export {
|
|
129
134
|
Table,
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Query, QueryData } from "../Query.js";
|
|
2
|
+
class Batch extends Query {
|
|
3
|
+
constructor(queries) {
|
|
4
|
+
super(new QueryData.Batch({ queries }));
|
|
5
|
+
this.queries = queries;
|
|
6
|
+
}
|
|
7
|
+
next(cursor) {
|
|
8
|
+
return new Query(
|
|
9
|
+
new QueryData.Batch({
|
|
10
|
+
queries: [...this[Query.Data].queries, cursor[Query.Data]]
|
|
11
|
+
})
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
Batch
|
|
17
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EV } from '../Expr.js';
|
|
2
|
+
import { Query, QueryData } from '../Query.js';
|
|
3
|
+
export declare class Delete extends Query<{
|
|
4
|
+
rowsAffected: number;
|
|
5
|
+
}> {
|
|
6
|
+
[Query.Data]: QueryData.Delete;
|
|
7
|
+
constructor(query: QueryData.Delete);
|
|
8
|
+
where(...where: Array<EV<boolean>>): Delete;
|
|
9
|
+
take(limit: number | undefined): Delete;
|
|
10
|
+
skip(offset: number | undefined): Delete;
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Query } from "../Query.js";
|
|
2
|
+
class Delete extends Query {
|
|
3
|
+
constructor(query) {
|
|
4
|
+
super(query);
|
|
5
|
+
}
|
|
6
|
+
where(...where) {
|
|
7
|
+
return new Delete(this.addWhere(where));
|
|
8
|
+
}
|
|
9
|
+
take(limit) {
|
|
10
|
+
return new Delete(this[Query.Data].with({ limit }));
|
|
11
|
+
}
|
|
12
|
+
skip(offset) {
|
|
13
|
+
return new Delete(this[Query.Data].with({ offset }));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
Delete
|
|
18
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Query, QueryData } from '../Query.js';
|
|
2
|
+
import { Selection } from '../Selection.js';
|
|
3
|
+
import { Table, TableData } from '../Table.js';
|
|
4
|
+
import { Select } from './Select.js';
|
|
5
|
+
export declare class Insert<T = {
|
|
6
|
+
rowsAffected: number;
|
|
7
|
+
}> extends Query<T> {
|
|
8
|
+
[Query.Data]: QueryData.Insert;
|
|
9
|
+
constructor(query: QueryData.Insert);
|
|
10
|
+
returning<X extends Selection>(selection: X): Insert<Array<Selection.Infer<X>>>;
|
|
11
|
+
}
|
|
12
|
+
export declare class InsertOne<T> extends Query<T> {
|
|
13
|
+
[Query.Data]: QueryData.Insert;
|
|
14
|
+
constructor(query: QueryData.Insert);
|
|
15
|
+
returning<X extends Selection>(selection: X): Insert<Selection.Infer<X>>;
|
|
16
|
+
}
|
|
17
|
+
export declare class InsertInto<Definition> {
|
|
18
|
+
protected into: TableData;
|
|
19
|
+
constructor(into: TableData);
|
|
20
|
+
selection(query: Select<Table.Select<Definition>>): Insert;
|
|
21
|
+
values(...data: Array<Table.Insert<Definition>>): Insert;
|
|
22
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ExprData } from "../Expr.js";
|
|
2
|
+
import { Query, QueryData } from "../Query.js";
|
|
3
|
+
class Insert extends Query {
|
|
4
|
+
constructor(query) {
|
|
5
|
+
super(query);
|
|
6
|
+
}
|
|
7
|
+
returning(selection) {
|
|
8
|
+
return new Insert(
|
|
9
|
+
new QueryData.Insert({
|
|
10
|
+
...this[Query.Data],
|
|
11
|
+
selection: ExprData.create(selection)
|
|
12
|
+
})
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
class InsertOne extends Query {
|
|
17
|
+
constructor(query) {
|
|
18
|
+
super(query);
|
|
19
|
+
}
|
|
20
|
+
returning(selection) {
|
|
21
|
+
return new Insert(
|
|
22
|
+
new QueryData.Insert({
|
|
23
|
+
...this[Query.Data],
|
|
24
|
+
selection: ExprData.create(selection),
|
|
25
|
+
singleResult: true
|
|
26
|
+
})
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
class InsertInto {
|
|
31
|
+
constructor(into) {
|
|
32
|
+
this.into = into;
|
|
33
|
+
}
|
|
34
|
+
selection(query) {
|
|
35
|
+
return new Insert(
|
|
36
|
+
new QueryData.Insert({ into: this.into, select: query[Query.Data] })
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
values(...data) {
|
|
40
|
+
return new Insert(new QueryData.Insert({ into: this.into, data }));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
Insert,
|
|
45
|
+
InsertInto,
|
|
46
|
+
InsertOne
|
|
47
|
+
};
|