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.
- package/README.md +2 -0
- package/dist/define/CTE.d.ts +2 -0
- package/dist/define/CTE.js +51 -0
- package/dist/define/Cursor.d.ts +65 -42
- package/dist/define/Cursor.js +170 -88
- package/dist/define/Expr.d.ts +2 -2
- package/dist/define/Expr.js +4 -1
- package/dist/define/Ops.d.ts +1 -6
- package/dist/define/Ops.js +10 -7
- package/dist/define/Query.d.ts +117 -2
- package/dist/define/Query.js +472 -17
- package/dist/define/Selection.d.ts +1 -1
- package/dist/define/Table.d.ts +6 -3
- package/dist/define/Table.js +6 -1
- package/dist/define/VirtualTable.d.ts +1 -1
- package/dist/define/query/Delete.d.ts +0 -2
- package/dist/define/query/Delete.js +0 -3
- package/dist/define/query/Select.d.ts +0 -2
- package/dist/define/query/Select.js +1 -14
- 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/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/driver/bun-sqlite.js +1 -2
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -8
- package/dist/lib/Driver.d.ts +1 -2
- 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/{lib → src/lib}/Column.js +1 -6
- package/dist/{lib → src/lib}/Cursor.js +25 -50
- package/dist/src/lib/Driver.js +316 -0
- package/dist/{lib → src/lib}/Expr.js +4 -4
- package/dist/src/lib/Formatter.js +625 -0
- package/dist/{lib → src/lib}/Ops.js +14 -5
- package/dist/src/lib/Sanitizer.js +0 -0
- package/dist/src/lib/Statement.js +103 -0
- package/dist/{lib → src/lib}/Table.js +1 -1
- package/dist/{lib → src/lib}/Target.js +4 -9
- 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 +1 -1
- package/dist/lib/Column.d.ts +0 -57
- package/dist/lib/Cursor.d.ts +0 -85
- package/dist/lib/Expr.d.ts +0 -154
- package/dist/lib/Fields.d.ts +0 -13
- package/dist/lib/Functions.d.ts +0 -5
- package/dist/lib/Id.d.ts +0 -3
- package/dist/lib/Index.d.ts +0 -17
- package/dist/lib/Ops.d.ts +0 -7
- package/dist/lib/OrderBy.d.ts +0 -9
- package/dist/lib/Param.d.ts +0 -20
- package/dist/lib/Query.d.ts +0 -109
- package/dist/lib/Schema.d.ts +0 -18
- package/dist/lib/Selection.d.ts +0 -20
- package/dist/lib/Table.d.ts +0 -62
- package/dist/lib/Target.d.ts +0 -38
- package/dist/lib/Update.d.ts +0 -4
- /package/dist/{lib/Fields.js → deno/lib/Sanitizer.js} +0 -0
- /package/dist/{lib/Id.js → src/lib/Fields.js} +0 -0
- /package/dist/{lib → src/lib}/Functions.js +0 -0
- /package/dist/{lib/Update.js → src/lib/Id.js} +0 -0
- /package/dist/{lib → src/lib}/Index.js +0 -0
- /package/dist/{lib → src/lib}/OrderBy.js +0 -0
- /package/dist/{lib → src/lib}/Param.js +0 -0
- /package/dist/{lib → src/lib}/Query.js +0 -0
- /package/dist/{lib → src/lib}/Schema.js +0 -0
- /package/dist/{lib → src/lib}/Selection.js +0 -0
package/README.md
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// src/define/CTE.ts
|
|
2
|
+
import { Expr, ExprData, ExprType } from "./Expr.js";
|
|
3
|
+
import { Query, QueryData } from "./Query.js";
|
|
4
|
+
import { virtualTable } from "./Table.js";
|
|
5
|
+
import { Target, TargetType } from "./Target.js";
|
|
6
|
+
var { keys, create, fromEntries } = Object;
|
|
7
|
+
function columnsOf(expr) {
|
|
8
|
+
switch (expr.type) {
|
|
9
|
+
case ExprType.Record:
|
|
10
|
+
return keys(expr.fields);
|
|
11
|
+
case ExprType.Row:
|
|
12
|
+
switch (expr.target.type) {
|
|
13
|
+
case TargetType.Table:
|
|
14
|
+
return keys(expr.target.table.columns);
|
|
15
|
+
default:
|
|
16
|
+
throw new Error("Could not retrieve CTE columns");
|
|
17
|
+
}
|
|
18
|
+
default:
|
|
19
|
+
throw new Error("Could not retrieve CTE columns");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function makeRecursiveUnion(initial, createUnion, operator) {
|
|
23
|
+
let name;
|
|
24
|
+
const alias = new Proxy(create(null), {
|
|
25
|
+
get(_, key) {
|
|
26
|
+
name = key;
|
|
27
|
+
return virtualTable(name);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
const right = createUnion(alias)[Query.Data];
|
|
31
|
+
if (!name)
|
|
32
|
+
throw new TypeError("No CTE name provided");
|
|
33
|
+
const cte = alias[name];
|
|
34
|
+
const cols = columnsOf(initial.selection);
|
|
35
|
+
const selection = new ExprData.Record(
|
|
36
|
+
fromEntries(cols.map((col) => [col, cte[col][Expr.Data]]))
|
|
37
|
+
);
|
|
38
|
+
const union = new QueryData.Union({
|
|
39
|
+
a: initial,
|
|
40
|
+
operator,
|
|
41
|
+
b: right
|
|
42
|
+
});
|
|
43
|
+
const from = new Target.CTE(name, union);
|
|
44
|
+
return new QueryData.Select({
|
|
45
|
+
selection,
|
|
46
|
+
from
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
makeRecursiveUnion
|
|
51
|
+
};
|
package/dist/define/Cursor.d.ts
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { Driver } from '../lib/Driver';
|
|
2
|
+
import { CompileOptions } from '../lib/Formatter';
|
|
2
3
|
import { EV, Expr } from './Expr';
|
|
3
4
|
import { OrderBy } from './OrderBy';
|
|
4
5
|
import { Query } from './Query';
|
|
5
|
-
import { Schema } from './Schema';
|
|
6
6
|
import { Selection } from './Selection';
|
|
7
|
-
import { Table } from './Table';
|
|
8
|
-
|
|
7
|
+
import { Table, TableData } from './Table';
|
|
8
|
+
declare const QUERY: unique symbol;
|
|
9
9
|
export declare class Cursor<T> {
|
|
10
|
-
[Selection.
|
|
10
|
+
[Selection.CursorType]: () => T;
|
|
11
|
+
[QUERY]: Query<T>;
|
|
12
|
+
static Query: typeof QUERY;
|
|
11
13
|
constructor(query: Query<T>);
|
|
12
14
|
static all(strings: TemplateStringsArray, ...params: Array<any>): Cursor<any>;
|
|
13
|
-
|
|
15
|
+
next<T>(cursor: Cursor<T>): Cursor<T>;
|
|
14
16
|
on(driver: Driver.Sync): T;
|
|
15
17
|
on(driver: Driver.Async): Promise<T>;
|
|
18
|
+
toSql(driver: Driver, options?: CompileOptions): string;
|
|
16
19
|
toJSON(): Query<T>;
|
|
17
20
|
}
|
|
18
21
|
export declare namespace Cursor {
|
|
@@ -24,62 +27,82 @@ export declare namespace Cursor {
|
|
|
24
27
|
take(limit: number | undefined): Delete;
|
|
25
28
|
skip(offset: number | undefined): Delete;
|
|
26
29
|
}
|
|
27
|
-
class Update<
|
|
30
|
+
class Update<Definition> extends Cursor<{
|
|
28
31
|
rowsAffected: number;
|
|
29
32
|
}> {
|
|
30
|
-
|
|
31
|
-
set(set:
|
|
32
|
-
where(...where: Array<EV<boolean>>): Update<
|
|
33
|
-
take(limit: number | undefined): Update<
|
|
34
|
-
skip(offset: number | undefined): Update<
|
|
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>;
|
|
35
38
|
}
|
|
36
39
|
class InsertValuesReturning<T> extends Cursor<T> {
|
|
37
40
|
}
|
|
38
|
-
class
|
|
41
|
+
class Inserted extends Cursor<{
|
|
39
42
|
rowsAffected: number;
|
|
40
43
|
}> {
|
|
41
|
-
|
|
44
|
+
[QUERY]: Query.Insert;
|
|
45
|
+
constructor(query: Query.Insert);
|
|
42
46
|
returning<X extends Selection>(selection: X): InsertValuesReturning<Selection.Infer<X>>;
|
|
43
47
|
}
|
|
44
|
-
class Insert<
|
|
45
|
-
protected into:
|
|
46
|
-
constructor(into:
|
|
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;
|
|
48
53
|
}
|
|
49
54
|
class CreateTable extends Cursor<void> {
|
|
50
|
-
protected table:
|
|
51
|
-
constructor(table:
|
|
55
|
+
protected table: TableData;
|
|
56
|
+
constructor(table: TableData);
|
|
52
57
|
}
|
|
53
58
|
class Batch<T = void> extends Cursor<T> {
|
|
54
59
|
protected queries: Array<Query>;
|
|
60
|
+
[QUERY]: Query.Batch;
|
|
55
61
|
constructor(queries: Array<Query>);
|
|
62
|
+
next<T>(cursor: Cursor<T>): Cursor<T>;
|
|
56
63
|
}
|
|
57
|
-
class SelectMultiple<
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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>;
|
|
61
69
|
select<X extends Selection>(selection: X): SelectMultiple<Selection.Infer<X>>;
|
|
62
70
|
count(): SelectSingle<number>;
|
|
63
|
-
orderBy(...orderBy: Array<Expr<any> | OrderBy>): SelectMultiple<
|
|
64
|
-
groupBy(...groupBy: Array<Expr<any>>): SelectMultiple<
|
|
65
|
-
first(): SelectSingle<
|
|
66
|
-
sure(): SelectSingle<
|
|
67
|
-
where(...where: Array<EV<boolean>>): SelectMultiple<
|
|
68
|
-
take(limit: number | undefined): SelectMultiple<
|
|
69
|
-
skip(offset: number | undefined): SelectMultiple<
|
|
70
|
-
|
|
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>;
|
|
71
79
|
}
|
|
72
|
-
class
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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>;
|
|
76
98
|
select<X extends Selection>(selection: X): SelectSingle<Selection.Infer<X>>;
|
|
77
|
-
orderBy(...orderBy: Array<OrderBy>): SelectSingle<
|
|
78
|
-
groupBy(...groupBy: Array<Expr<any>>): SelectSingle<
|
|
79
|
-
where(...where: Array<EV<boolean>>): SelectSingle<
|
|
80
|
-
take(limit: number | undefined): SelectSingle<
|
|
81
|
-
skip(offset: number | undefined): SelectSingle<
|
|
82
|
-
all(): SelectMultiple<
|
|
83
|
-
|
|
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>;
|
|
84
106
|
}
|
|
85
107
|
}
|
|
108
|
+
export {};
|
package/dist/define/Cursor.js
CHANGED
|
@@ -1,96 +1,112 @@
|
|
|
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
|
+
|
|
1
8
|
// src/define/Cursor.ts
|
|
2
9
|
import { Expr, ExprData } from "./Expr.js";
|
|
3
10
|
import { Functions } from "./Functions.js";
|
|
4
11
|
import { Query } from "./Query.js";
|
|
5
12
|
import { Schema } from "./Schema.js";
|
|
6
13
|
import { Selection } from "./Selection.js";
|
|
14
|
+
import { Table, createTable } from "./Table.js";
|
|
7
15
|
import { Target } from "./Target.js";
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
16
|
+
var QUERY = Symbol("Cursor.Query");
|
|
17
|
+
var _Cursor = class {
|
|
18
|
+
[(Selection.CursorType, QUERY)];
|
|
12
19
|
constructor(query) {
|
|
13
|
-
|
|
14
|
-
enumerable: false,
|
|
15
|
-
value: () => query
|
|
16
|
-
});
|
|
20
|
+
this[QUERY] = query;
|
|
17
21
|
}
|
|
18
22
|
static all(strings, ...params) {
|
|
19
|
-
return new
|
|
23
|
+
return new _Cursor(Query.Raw({ expectedReturn: "rows", strings, params }));
|
|
20
24
|
}
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
next(cursor) {
|
|
26
|
+
return new _Cursor(
|
|
27
|
+
Query.Batch({
|
|
28
|
+
queries: [this[QUERY], cursor[QUERY]]
|
|
29
|
+
})
|
|
30
|
+
);
|
|
23
31
|
}
|
|
24
32
|
on(driver) {
|
|
25
|
-
return driver.executeQuery(this
|
|
33
|
+
return driver.executeQuery(this[QUERY]);
|
|
34
|
+
}
|
|
35
|
+
toSql(driver, options = { forceInline: true }) {
|
|
36
|
+
return driver.formatter.compile(this[QUERY], options).sql;
|
|
26
37
|
}
|
|
27
38
|
toJSON() {
|
|
28
|
-
return this
|
|
39
|
+
return this[QUERY];
|
|
29
40
|
}
|
|
30
41
|
};
|
|
42
|
+
var Cursor = _Cursor;
|
|
43
|
+
__publicField(Cursor, "Query", QUERY);
|
|
31
44
|
function addWhere(query, where) {
|
|
32
45
|
const conditions = where.slice();
|
|
33
46
|
if (query.where)
|
|
34
|
-
conditions.push(query.where);
|
|
47
|
+
conditions.push(new Expr(query.where));
|
|
35
48
|
return {
|
|
36
49
|
...query,
|
|
37
|
-
where: Expr.and(...conditions).
|
|
50
|
+
where: Expr.and(...conditions)[Expr.Data]
|
|
38
51
|
};
|
|
39
52
|
}
|
|
40
53
|
((Cursor2) => {
|
|
41
54
|
class Delete extends Cursor2 {
|
|
42
55
|
query() {
|
|
43
|
-
return super
|
|
56
|
+
return super[QUERY];
|
|
44
57
|
}
|
|
45
58
|
where(...where) {
|
|
46
|
-
return new Delete(addWhere(this
|
|
59
|
+
return new Delete(addWhere(this[QUERY], where));
|
|
47
60
|
}
|
|
48
61
|
take(limit) {
|
|
49
|
-
return new Delete({ ...this
|
|
62
|
+
return new Delete({ ...this[QUERY], limit });
|
|
50
63
|
}
|
|
51
64
|
skip(offset) {
|
|
52
|
-
return new Delete({ ...this
|
|
65
|
+
return new Delete({ ...this[QUERY], offset });
|
|
53
66
|
}
|
|
54
67
|
}
|
|
55
68
|
Cursor2.Delete = Delete;
|
|
56
|
-
class
|
|
57
|
-
query() {
|
|
58
|
-
return super.query();
|
|
59
|
-
}
|
|
69
|
+
const _Update = class extends Cursor2 {
|
|
60
70
|
set(set) {
|
|
61
|
-
return new
|
|
71
|
+
return new _Update({ ...this[QUERY], set });
|
|
62
72
|
}
|
|
63
73
|
where(...where) {
|
|
64
|
-
return new
|
|
74
|
+
return new _Update(addWhere(this[QUERY], where));
|
|
65
75
|
}
|
|
66
76
|
take(limit) {
|
|
67
|
-
return new
|
|
77
|
+
return new _Update({ ...this[QUERY], limit });
|
|
68
78
|
}
|
|
69
79
|
skip(offset) {
|
|
70
|
-
return new
|
|
80
|
+
return new _Update({ ...this[QUERY], offset });
|
|
71
81
|
}
|
|
72
|
-
}
|
|
82
|
+
};
|
|
83
|
+
let Update = _Update;
|
|
84
|
+
QUERY;
|
|
73
85
|
Cursor2.Update = Update;
|
|
74
86
|
class InsertValuesReturning extends Cursor2 {
|
|
75
87
|
}
|
|
76
88
|
Cursor2.InsertValuesReturning = InsertValuesReturning;
|
|
77
|
-
class
|
|
78
|
-
query
|
|
79
|
-
|
|
89
|
+
class Inserted extends Cursor2 {
|
|
90
|
+
constructor(query) {
|
|
91
|
+
super(query);
|
|
80
92
|
}
|
|
81
93
|
returning(selection) {
|
|
82
94
|
return new InsertValuesReturning(
|
|
83
|
-
Query.Insert({ ...this
|
|
95
|
+
Query.Insert({ ...this[QUERY], selection: ExprData.create(selection) })
|
|
84
96
|
);
|
|
85
97
|
}
|
|
86
98
|
}
|
|
87
|
-
|
|
99
|
+
QUERY;
|
|
100
|
+
Cursor2.Inserted = Inserted;
|
|
88
101
|
class Insert {
|
|
89
102
|
constructor(into) {
|
|
90
103
|
this.into = into;
|
|
91
104
|
}
|
|
105
|
+
selection(query) {
|
|
106
|
+
return new Inserted(Query.Insert({ into: this.into, select: query[QUERY] }));
|
|
107
|
+
}
|
|
92
108
|
values(...data) {
|
|
93
|
-
return new
|
|
109
|
+
return new Inserted(Query.Insert({ into: this.into, data }));
|
|
94
110
|
}
|
|
95
111
|
}
|
|
96
112
|
Cursor2.Insert = Insert;
|
|
@@ -106,147 +122,213 @@ function addWhere(query, where) {
|
|
|
106
122
|
super(Query.Batch({ queries }));
|
|
107
123
|
this.queries = queries;
|
|
108
124
|
}
|
|
125
|
+
next(cursor) {
|
|
126
|
+
return new Cursor2(
|
|
127
|
+
Query.Batch({
|
|
128
|
+
queries: [...this[QUERY].queries, cursor[QUERY]]
|
|
129
|
+
})
|
|
130
|
+
);
|
|
131
|
+
}
|
|
109
132
|
}
|
|
133
|
+
QUERY;
|
|
110
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
|
+
}
|
|
111
153
|
class SelectMultiple extends Cursor2 {
|
|
112
|
-
query
|
|
113
|
-
|
|
154
|
+
constructor(query) {
|
|
155
|
+
super(query);
|
|
114
156
|
}
|
|
115
157
|
leftJoin(that, ...on) {
|
|
116
|
-
const query = this
|
|
158
|
+
const query = this[QUERY];
|
|
117
159
|
return new SelectMultiple({
|
|
118
160
|
...query,
|
|
119
|
-
from:
|
|
120
|
-
query.from,
|
|
121
|
-
Target.Table(that.schema()),
|
|
122
|
-
"left",
|
|
123
|
-
Expr.and(...on).expr
|
|
124
|
-
)
|
|
161
|
+
from: joinTarget("left", query, that, on)
|
|
125
162
|
});
|
|
126
163
|
}
|
|
127
164
|
innerJoin(that, ...on) {
|
|
128
|
-
const query = this
|
|
165
|
+
const query = this[QUERY];
|
|
129
166
|
return new SelectMultiple({
|
|
130
167
|
...query,
|
|
131
|
-
from:
|
|
132
|
-
query.from,
|
|
133
|
-
Target.Table(that.schema()),
|
|
134
|
-
"inner",
|
|
135
|
-
Expr.and(...on).expr
|
|
136
|
-
)
|
|
168
|
+
from: joinTarget("inner", query, that, on)
|
|
137
169
|
});
|
|
138
170
|
}
|
|
139
171
|
select(selection) {
|
|
140
172
|
return new SelectMultiple({
|
|
141
|
-
...this
|
|
173
|
+
...this[QUERY],
|
|
142
174
|
selection: ExprData.create(selection)
|
|
143
175
|
});
|
|
144
176
|
}
|
|
145
177
|
count() {
|
|
146
178
|
return new SelectSingle({
|
|
147
|
-
...this
|
|
148
|
-
selection: Functions.count().
|
|
179
|
+
...this[QUERY],
|
|
180
|
+
selection: Functions.count()[Expr.Data],
|
|
149
181
|
singleResult: true
|
|
150
182
|
});
|
|
151
183
|
}
|
|
152
184
|
orderBy(...orderBy) {
|
|
153
185
|
return new SelectMultiple({
|
|
154
|
-
...this
|
|
186
|
+
...this[QUERY],
|
|
155
187
|
orderBy: orderBy.map((e) => {
|
|
156
|
-
return e
|
|
188
|
+
return Expr.isExpr(e) ? e.asc() : e;
|
|
157
189
|
})
|
|
158
190
|
});
|
|
159
191
|
}
|
|
160
192
|
groupBy(...groupBy) {
|
|
161
193
|
return new SelectMultiple({
|
|
162
|
-
...this
|
|
194
|
+
...this[QUERY],
|
|
163
195
|
groupBy: groupBy.map(ExprData.create)
|
|
164
196
|
});
|
|
165
197
|
}
|
|
166
198
|
first() {
|
|
167
|
-
return new SelectSingle({ ...this
|
|
199
|
+
return new SelectSingle({ ...this[QUERY], singleResult: true });
|
|
168
200
|
}
|
|
169
201
|
sure() {
|
|
170
202
|
return new SelectSingle({
|
|
171
|
-
...this
|
|
203
|
+
...this[QUERY],
|
|
172
204
|
singleResult: true,
|
|
173
205
|
validate: true
|
|
174
206
|
});
|
|
175
207
|
}
|
|
176
208
|
where(...where) {
|
|
177
|
-
return new SelectMultiple(addWhere(this
|
|
209
|
+
return new SelectMultiple(addWhere(this[QUERY], where));
|
|
178
210
|
}
|
|
179
211
|
take(limit) {
|
|
180
|
-
return new SelectMultiple({ ...this
|
|
212
|
+
return new SelectMultiple({ ...this[QUERY], limit });
|
|
181
213
|
}
|
|
182
214
|
skip(offset) {
|
|
183
|
-
return new SelectMultiple({ ...this
|
|
215
|
+
return new SelectMultiple({ ...this[QUERY], offset });
|
|
184
216
|
}
|
|
185
|
-
|
|
186
|
-
return new Expr(ExprData.Query(this
|
|
217
|
+
[(QUERY, Expr.ToExpr)]() {
|
|
218
|
+
return new Expr(ExprData.Query(this[QUERY]));
|
|
187
219
|
}
|
|
188
220
|
}
|
|
189
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;
|
|
190
282
|
class SelectSingle extends Cursor2 {
|
|
191
|
-
query
|
|
192
|
-
|
|
283
|
+
constructor(query) {
|
|
284
|
+
super(query);
|
|
193
285
|
}
|
|
194
286
|
leftJoin(that, ...on) {
|
|
195
|
-
const query = this
|
|
287
|
+
const query = this[QUERY];
|
|
196
288
|
return new SelectSingle({
|
|
197
289
|
...query,
|
|
198
|
-
from:
|
|
199
|
-
query.from,
|
|
200
|
-
Target.Table(that.schema()),
|
|
201
|
-
"left",
|
|
202
|
-
Expr.and(...on).expr
|
|
203
|
-
)
|
|
290
|
+
from: joinTarget("left", query, that, on)
|
|
204
291
|
});
|
|
205
292
|
}
|
|
206
293
|
innerJoin(that, ...on) {
|
|
207
|
-
const query = this
|
|
294
|
+
const query = this[QUERY];
|
|
208
295
|
return new SelectSingle({
|
|
209
296
|
...query,
|
|
210
|
-
from:
|
|
211
|
-
query.from,
|
|
212
|
-
Target.Table(that.schema()),
|
|
213
|
-
"inner",
|
|
214
|
-
Expr.and(...on).expr
|
|
215
|
-
)
|
|
297
|
+
from: joinTarget("inner", query, that, on)
|
|
216
298
|
});
|
|
217
299
|
}
|
|
218
300
|
select(selection) {
|
|
219
301
|
return new SelectSingle({
|
|
220
|
-
...this
|
|
302
|
+
...this[QUERY],
|
|
221
303
|
selection: ExprData.create(selection)
|
|
222
304
|
});
|
|
223
305
|
}
|
|
224
306
|
orderBy(...orderBy) {
|
|
225
307
|
return new SelectSingle({
|
|
226
|
-
...this
|
|
308
|
+
...this[QUERY],
|
|
227
309
|
orderBy
|
|
228
310
|
});
|
|
229
311
|
}
|
|
230
312
|
groupBy(...groupBy) {
|
|
231
313
|
return new SelectSingle({
|
|
232
|
-
...this
|
|
314
|
+
...this[QUERY],
|
|
233
315
|
groupBy: groupBy.map(ExprData.create)
|
|
234
316
|
});
|
|
235
317
|
}
|
|
236
318
|
where(...where) {
|
|
237
|
-
return new SelectSingle(addWhere(this
|
|
319
|
+
return new SelectSingle(addWhere(this[QUERY], where));
|
|
238
320
|
}
|
|
239
321
|
take(limit) {
|
|
240
|
-
return new SelectSingle({ ...this
|
|
322
|
+
return new SelectSingle({ ...this[QUERY], limit });
|
|
241
323
|
}
|
|
242
324
|
skip(offset) {
|
|
243
|
-
return new SelectSingle({ ...this
|
|
325
|
+
return new SelectSingle({ ...this[QUERY], offset });
|
|
244
326
|
}
|
|
245
327
|
all() {
|
|
246
|
-
return new SelectMultiple({ ...this
|
|
328
|
+
return new SelectMultiple({ ...this[QUERY], singleResult: false });
|
|
247
329
|
}
|
|
248
|
-
|
|
249
|
-
return new Expr(ExprData.Query(this
|
|
330
|
+
[(QUERY, Expr.ToExpr)]() {
|
|
331
|
+
return new Expr(ExprData.Query(this[QUERY]));
|
|
250
332
|
}
|
|
251
333
|
}
|
|
252
334
|
Cursor2.SelectSingle = SelectSingle;
|
package/dist/define/Expr.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { Fields } from './Fields.js';
|
|
2
2
|
import { OrderBy } from './OrderBy.js';
|
|
3
3
|
import { ParamData } from './Param.js';
|
|
4
|
-
import { QueryData } from './Query.js';
|
|
4
|
+
import { QueryData, Select, SelectFirst } from './Query.js';
|
|
5
5
|
import { Selection } from './Selection.js';
|
|
6
6
|
import { Target } from './Target.js';
|
|
7
|
-
import { Select, SelectFirst } from './query/Select.js';
|
|
8
7
|
export declare enum UnOpType {
|
|
9
8
|
Not = "Not",
|
|
10
9
|
IsNull = "IsNull"
|
|
@@ -161,6 +160,7 @@ export declare class Expr<T> {
|
|
|
161
160
|
map<T, X extends Selection>(this: Expr<Array<T>>, fn: (cursor: Fields<T>) => X): Expr<Array<Selection.Infer<X>>>;
|
|
162
161
|
sure(): Expr<NonNullable<T>>;
|
|
163
162
|
get<T>(name: string): Expr<T>;
|
|
163
|
+
static [Symbol.hasInstance](instance: any): any;
|
|
164
164
|
}
|
|
165
165
|
export interface ObjectExpr {
|
|
166
166
|
[Expr.Data]: ExprData;
|
package/dist/define/Expr.js
CHANGED
|
@@ -386,6 +386,9 @@ class Expr {
|
|
|
386
386
|
get(name) {
|
|
387
387
|
return new Expr(new ExprData.Field(this[Expr.Data], name));
|
|
388
388
|
}
|
|
389
|
+
static [Symbol.hasInstance](instance) {
|
|
390
|
+
return instance?.[Expr.IsExpr];
|
|
391
|
+
}
|
|
389
392
|
}
|
|
390
393
|
((Expr2) => {
|
|
391
394
|
Expr2.Data = Symbol("Expr.Data");
|
|
@@ -419,7 +422,7 @@ class Expr {
|
|
|
419
422
|
}
|
|
420
423
|
Expr2.hasExpr = hasExpr;
|
|
421
424
|
function isExpr(input) {
|
|
422
|
-
return input
|
|
425
|
+
return input instanceof Expr2;
|
|
423
426
|
}
|
|
424
427
|
Expr2.isExpr = isExpr;
|
|
425
428
|
})(Expr || (Expr = {}));
|
package/dist/define/Ops.d.ts
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
|
+
import { Batch, Delete, InsertInto, RecursiveUnion, Select, Update } from './Query.js';
|
|
1
2
|
import { Selection } from './Selection.js';
|
|
2
3
|
import { Table } from './Table.js';
|
|
3
|
-
import { Batch } from './query/Batch.js';
|
|
4
|
-
import { Delete } from './query/Delete.js';
|
|
5
|
-
import { InsertInto } from './query/Insert.js';
|
|
6
|
-
import { Select } from './query/Select.js';
|
|
7
|
-
import { RecursiveUnion } from './query/Union.js';
|
|
8
|
-
import { Update } from './query/Update.js';
|
|
9
4
|
export declare function withRecursive<Row>(initialSelect: Select<Row>): RecursiveUnion<Row>;
|
|
10
5
|
export declare function alias<T extends Table<{}>>(table: T): Record<string, T>;
|
|
11
6
|
export declare function select<X extends Selection>(selection: X): Select<Selection.Infer<X>>;
|