rado 1.0.2 → 1.0.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/dist/core/Builder.d.ts +5 -3
- package/dist/core/Builder.js +13 -22
- package/dist/core/Emitter.d.ts +14 -5
- package/dist/core/Emitter.js +25 -11
- package/dist/core/Join.d.ts +1 -0
- package/dist/core/Join.js +0 -0
- package/dist/core/Query.d.ts +5 -2
- package/dist/core/Selection.d.ts +18 -3
- package/dist/core/Selection.js +49 -3
- package/dist/core/Sql.d.ts +2 -0
- package/dist/core/Sql.js +6 -2
- package/dist/core/Virtual.d.ts +2 -2
- package/dist/core/Virtual.js +9 -7
- package/dist/core/expr/Conditions.d.ts +5 -4
- package/dist/core/expr/Conditions.js +24 -17
- package/dist/core/expr/Include.d.ts +1 -1
- package/dist/core/expr/Include.js +2 -3
- package/dist/core/query/Delete.js +1 -1
- package/dist/core/query/Insert.js +1 -1
- package/dist/core/query/Select.d.ts +11 -13
- package/dist/core/query/Select.js +10 -34
- package/dist/core/query/Union.d.ts +11 -10
- package/dist/core/query/Union.js +13 -9
- package/dist/core/query/Update.js +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.js +7 -5
- package/package.json +2 -2
package/dist/core/Builder.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ import { type SelectionInput } from './Selection.js';
|
|
|
5
5
|
import type { Table, TableDefinition } from './Table.js';
|
|
6
6
|
import { DeleteFrom } from './query/Delete.js';
|
|
7
7
|
import { InsertInto } from './query/Insert.js';
|
|
8
|
-
import type {
|
|
8
|
+
import type { WithSelection, WithoutSelection } from './query/Select.js';
|
|
9
|
+
import type { UnionBase } from './query/Union.js';
|
|
9
10
|
import { UpdateTable } from './query/Update.js';
|
|
10
11
|
declare class BuilderBase<Meta extends QueryMeta> {
|
|
11
12
|
readonly [internalData]: QueryData<Meta>;
|
|
@@ -23,8 +24,9 @@ declare class BuilderBase<Meta extends QueryMeta> {
|
|
|
23
24
|
export type CTE<Input = unknown> = Input & HasTarget & HasQuery;
|
|
24
25
|
export declare class Builder<Meta extends QueryMeta> extends BuilderBase<Meta> {
|
|
25
26
|
$with(cteName: string): {
|
|
26
|
-
as<Input extends SelectionInput>(query:
|
|
27
|
+
as<Input extends SelectionInput>(query: UnionBase<Input, Meta>): CTE<Input>;
|
|
27
28
|
};
|
|
28
|
-
with(...
|
|
29
|
+
with(...definitions: Array<CTE>): BuilderBase<Meta>;
|
|
30
|
+
withRecursive(...definitions: Array<CTE>): BuilderBase<Meta>;
|
|
29
31
|
}
|
|
30
32
|
export {};
|
package/dist/core/Builder.js
CHANGED
|
@@ -4,11 +4,9 @@ import {
|
|
|
4
4
|
getQuery,
|
|
5
5
|
getSelection,
|
|
6
6
|
internalData,
|
|
7
|
-
internalQuery
|
|
8
|
-
internalTarget
|
|
7
|
+
internalQuery
|
|
9
8
|
} from "./Internal.js";
|
|
10
9
|
import { selection } from "./Selection.js";
|
|
11
|
-
import { sql } from "./Sql.js";
|
|
12
10
|
import { DeleteFrom } from "./query/Delete.js";
|
|
13
11
|
import { InsertInto } from "./query/Insert.js";
|
|
14
12
|
import { Select } from "./query/Select.js";
|
|
@@ -21,32 +19,20 @@ var BuilderBase = class {
|
|
|
21
19
|
select(input) {
|
|
22
20
|
return new Select({
|
|
23
21
|
...getData(this),
|
|
24
|
-
select:
|
|
25
|
-
type: input ? "selection" : "allFrom",
|
|
26
|
-
selection: input && selection(input),
|
|
27
|
-
tables: []
|
|
28
|
-
}
|
|
22
|
+
select: input && selection(input)
|
|
29
23
|
});
|
|
30
24
|
}
|
|
31
25
|
selectDistinct(input) {
|
|
32
26
|
return new Select({
|
|
33
27
|
...getData(this),
|
|
34
|
-
select:
|
|
35
|
-
type: input ? "selection" : "allFrom",
|
|
36
|
-
selection: input && selection(input),
|
|
37
|
-
tables: []
|
|
38
|
-
},
|
|
28
|
+
select: input && selection(input),
|
|
39
29
|
distinct: true
|
|
40
30
|
});
|
|
41
31
|
}
|
|
42
32
|
selectDistinctOn(columns, input) {
|
|
43
33
|
return new Select({
|
|
44
34
|
...getData(this),
|
|
45
|
-
select:
|
|
46
|
-
type: input ? "selection" : "allFrom",
|
|
47
|
-
selection: input && selection(input),
|
|
48
|
-
tables: []
|
|
49
|
-
},
|
|
35
|
+
select: input && selection(input),
|
|
50
36
|
distinctOn: columns
|
|
51
37
|
});
|
|
52
38
|
}
|
|
@@ -66,16 +52,21 @@ var Builder = class extends BuilderBase {
|
|
|
66
52
|
as(query) {
|
|
67
53
|
const fields = getSelection(query).makeVirtual(cteName);
|
|
68
54
|
return Object.assign(fields, {
|
|
69
|
-
[
|
|
70
|
-
[internalQuery]: getQuery(query)
|
|
55
|
+
[internalQuery]: getQuery(query).nameSelf(cteName)
|
|
71
56
|
});
|
|
72
57
|
}
|
|
73
58
|
};
|
|
74
59
|
}
|
|
75
|
-
with(...
|
|
60
|
+
with(...definitions) {
|
|
61
|
+
return new BuilderBase({
|
|
62
|
+
...getData(this),
|
|
63
|
+
cte: { recursive: false, definitions }
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
withRecursive(...definitions) {
|
|
76
67
|
return new BuilderBase({
|
|
77
68
|
...getData(this),
|
|
78
|
-
cte
|
|
69
|
+
cte: { recursive: true, definitions }
|
|
79
70
|
});
|
|
80
71
|
}
|
|
81
72
|
};
|
package/dist/core/Emitter.d.ts
CHANGED
|
@@ -2,14 +2,14 @@ import type { ColumnData } from './Column.js';
|
|
|
2
2
|
import { type HasQuery, type HasTarget } from './Internal.js';
|
|
3
3
|
import type { Runtime } from './MetaData.js';
|
|
4
4
|
import { type Param } from './Param.js';
|
|
5
|
-
import {
|
|
5
|
+
import { Sql } from './Sql.js';
|
|
6
6
|
import type { TableApi } from './Table.js';
|
|
7
7
|
import type { FieldData } from './expr/Field.js';
|
|
8
8
|
import type { IncludeData } from './expr/Include.js';
|
|
9
9
|
import type { Delete } from './query/Delete.js';
|
|
10
10
|
import type { Insert } from './query/Insert.js';
|
|
11
11
|
import type { SelectData } from './query/Select.js';
|
|
12
|
-
import type {
|
|
12
|
+
import type { UnionData } from './query/Union.js';
|
|
13
13
|
import type { Update } from './query/Update.js';
|
|
14
14
|
export declare abstract class Emitter {
|
|
15
15
|
sql: string;
|
|
@@ -23,17 +23,26 @@ export declare abstract class Emitter {
|
|
|
23
23
|
abstract emitInline(value: unknown): void;
|
|
24
24
|
abstract emitJsonPath(value: Array<number | string>): void;
|
|
25
25
|
abstract emitPlaceholder(value: string): void;
|
|
26
|
+
emitIdentifierOrSelf(value: string): void;
|
|
27
|
+
selfName?: string;
|
|
28
|
+
emitSelf({ name, inner }: {
|
|
29
|
+
name: string;
|
|
30
|
+
inner: Sql;
|
|
31
|
+
}): void;
|
|
26
32
|
emitUnsafe(value: string): void;
|
|
27
|
-
emitField(
|
|
33
|
+
emitField({ targetName, fieldName }: FieldData): void;
|
|
28
34
|
emitCreateTable(tableApi: TableApi): void;
|
|
29
35
|
emitColumn(column: ColumnData): void;
|
|
30
36
|
emitReferences(fields: Array<FieldData>): void;
|
|
31
37
|
emitDelete(deleteOp: Delete<unknown>): void;
|
|
32
38
|
emitInsert(insert: Insert<unknown>): void;
|
|
33
39
|
emitSelect({ select, cte, from, distinct, distinctOn, where, groupBy, orderBy, having, limit, offset }: SelectData): void;
|
|
34
|
-
emitUnion(
|
|
40
|
+
emitUnion({ left, operator, right }: UnionData): void;
|
|
35
41
|
emitUpdate(update: Update<unknown>): void;
|
|
36
|
-
emitWith(cte:
|
|
42
|
+
emitWith(cte: {
|
|
43
|
+
recursive: boolean;
|
|
44
|
+
definitions: Array<HasQuery & HasTarget>;
|
|
45
|
+
}): void;
|
|
37
46
|
emitInclude(data: IncludeData): void;
|
|
38
47
|
emitUniversal(runtimes: Partial<Record<Runtime | 'default', Sql>>): void;
|
|
39
48
|
}
|
package/dist/core/Emitter.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getTarget
|
|
7
7
|
} from "./Internal.js";
|
|
8
8
|
import { ValueParam } from "./Param.js";
|
|
9
|
-
import { sql } from "./Sql.js";
|
|
9
|
+
import { Sql, sql } from "./Sql.js";
|
|
10
10
|
import { callFunction } from "./expr/Functions.js";
|
|
11
11
|
import { jsonAggregateArray, jsonArray } from "./expr/Json.js";
|
|
12
12
|
var Emitter = class {
|
|
@@ -27,13 +27,28 @@ var Emitter = class {
|
|
|
27
27
|
processValue(value) {
|
|
28
28
|
return value;
|
|
29
29
|
}
|
|
30
|
+
emitIdentifierOrSelf(value) {
|
|
31
|
+
if (value === Sql.SELF_TARGET) {
|
|
32
|
+
if (!this.selfName)
|
|
33
|
+
throw new Error("Self target not defined");
|
|
34
|
+
this.emitIdentifier(this.selfName);
|
|
35
|
+
} else {
|
|
36
|
+
this.emitIdentifier(value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
selfName;
|
|
40
|
+
emitSelf({ name, inner }) {
|
|
41
|
+
this.selfName = name;
|
|
42
|
+
inner.emitTo(this);
|
|
43
|
+
this.selfName = void 0;
|
|
44
|
+
}
|
|
30
45
|
emitUnsafe(value) {
|
|
31
46
|
this.sql += value;
|
|
32
47
|
}
|
|
33
|
-
emitField(
|
|
34
|
-
this.
|
|
48
|
+
emitField({ targetName, fieldName }) {
|
|
49
|
+
this.emitIdentifierOrSelf(targetName);
|
|
35
50
|
this.emitUnsafe(".");
|
|
36
|
-
this.emitIdentifier(
|
|
51
|
+
this.emitIdentifier(fieldName);
|
|
37
52
|
}
|
|
38
53
|
emitCreateTable(tableApi) {
|
|
39
54
|
sql.join([
|
|
@@ -102,7 +117,7 @@ var Emitter = class {
|
|
|
102
117
|
this.emitWith(cte);
|
|
103
118
|
const prefix = distinctOn ? sql`distinct on (${sql.join(distinctOn, sql`, `)})` : distinct && sql`distinct`;
|
|
104
119
|
sql.query({
|
|
105
|
-
select: sql.join([prefix, select
|
|
120
|
+
select: sql.join([prefix, select]),
|
|
106
121
|
from,
|
|
107
122
|
where,
|
|
108
123
|
groupBy,
|
|
@@ -112,8 +127,7 @@ var Emitter = class {
|
|
|
112
127
|
offset
|
|
113
128
|
}).emitTo(this);
|
|
114
129
|
}
|
|
115
|
-
emitUnion(
|
|
116
|
-
const { left, operator, right } = getData(union);
|
|
130
|
+
emitUnion({ left, operator, right }) {
|
|
117
131
|
sql.join([getQuery(left), operator, getQuery(right)]).emitTo(this);
|
|
118
132
|
}
|
|
119
133
|
emitUpdate(update) {
|
|
@@ -130,8 +144,8 @@ var Emitter = class {
|
|
|
130
144
|
}
|
|
131
145
|
emitWith(cte) {
|
|
132
146
|
sql.query({
|
|
133
|
-
with: sql.join(
|
|
134
|
-
cte.map((cte2) => {
|
|
147
|
+
[cte.recursive ? "withRecursive" : "with"]: sql.join(
|
|
148
|
+
cte.definitions.map((cte2) => {
|
|
135
149
|
const query = getQuery(cte2);
|
|
136
150
|
const target = getTarget(cte2);
|
|
137
151
|
return sql`${target} as (${query})`;
|
|
@@ -144,9 +158,9 @@ var Emitter = class {
|
|
|
144
158
|
const wrapQuery = Boolean(data.limit || data.offset || data.orderBy);
|
|
145
159
|
const innerQuery = sql.chunk("emitSelect", data);
|
|
146
160
|
const inner = wrapQuery ? sql`select * from (${innerQuery})` : innerQuery;
|
|
147
|
-
if (!data.select
|
|
161
|
+
if (!data.select)
|
|
148
162
|
throw new Error("No selection defined");
|
|
149
|
-
const fields = data.select.
|
|
163
|
+
const fields = data.select.fieldNames();
|
|
150
164
|
const subject = jsonArray(
|
|
151
165
|
...fields.map((name) => sql`_.${sql.identifier(name)}`)
|
|
152
166
|
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type JoinOperator = 'left' | 'right' | 'inner' | 'full';
|
|
File without changes
|
package/dist/core/Query.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type HasQuery, type HasResolver, type HasSql, type HasTarget, internalData, internalQuery } from './Internal.js';
|
|
2
2
|
import type { Deliver, QueryMeta } from './MetaData.js';
|
|
3
3
|
import type { PreparedStatement, Resolver } from './Resolver.js';
|
|
4
4
|
import type { Sql } from './Sql.js';
|
|
5
5
|
export declare class QueryData<Meta extends QueryMeta> {
|
|
6
6
|
resolver?: Resolver<Meta>;
|
|
7
|
-
cte?:
|
|
7
|
+
cte?: {
|
|
8
|
+
recursive: boolean;
|
|
9
|
+
definitions: Array<HasQuery & HasTarget>;
|
|
10
|
+
};
|
|
8
11
|
}
|
|
9
12
|
type Exec = () => any;
|
|
10
13
|
declare class Executable<Result, Meta extends QueryMeta> implements PromiseLike<Array<Result>> {
|
package/dist/core/Selection.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DriverSpecs } from './Driver.js';
|
|
2
|
-
import {
|
|
2
|
+
import { type HasSql, type HasTable, type HasTarget, internalSql } from './Internal.js';
|
|
3
|
+
import type { JoinOperator } from './Join.js';
|
|
3
4
|
import { type Sql } from './Sql.js';
|
|
4
5
|
import type { Table, TableRow } from './Table.js';
|
|
5
6
|
import type { Expand } from './Types.js';
|
|
@@ -29,9 +30,23 @@ export declare class Selection implements HasSql {
|
|
|
29
30
|
nullable: Set<string>;
|
|
30
31
|
mapRow: (ctx: MapRowContext) => unknown;
|
|
31
32
|
constructor(input: SelectionInput, nullable: Set<string>);
|
|
32
|
-
makeVirtual(name: string):
|
|
33
|
-
get [internalSql](): Sql;
|
|
33
|
+
makeVirtual<Input>(name: string): Input & HasTarget;
|
|
34
34
|
fieldNames(): Array<string>;
|
|
35
|
+
get [internalSql](): Sql;
|
|
36
|
+
join(right: HasTable, operator: JoinOperator): Selection;
|
|
37
|
+
}
|
|
38
|
+
export declare class TableSelection extends Selection {
|
|
39
|
+
table: HasTable;
|
|
40
|
+
constructor(table: HasTable);
|
|
41
|
+
join(right: HasTable, operator: JoinOperator): Selection;
|
|
42
|
+
}
|
|
43
|
+
export declare class JoinSelection extends Selection {
|
|
44
|
+
tables: Array<HasTable>;
|
|
45
|
+
constructor(tables: Array<HasTable>, nullable: Set<string>);
|
|
46
|
+
join(right: HasTable, operator: JoinOperator): Selection;
|
|
35
47
|
}
|
|
36
48
|
export declare function selection(input: SelectionInput, nullable?: Array<string>): Selection;
|
|
49
|
+
export declare namespace selection {
|
|
50
|
+
function table(table: HasTable): TableSelection;
|
|
51
|
+
}
|
|
37
52
|
export {};
|
package/dist/core/Selection.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
getField,
|
|
4
4
|
getSql,
|
|
5
|
+
getTable,
|
|
5
6
|
hasField,
|
|
6
7
|
internalSql
|
|
7
8
|
} from "./Internal.js";
|
|
@@ -69,9 +70,6 @@ var Selection = class {
|
|
|
69
70
|
])
|
|
70
71
|
);
|
|
71
72
|
}
|
|
72
|
-
get [internalSql]() {
|
|
73
|
-
return this.#selectionToSql(this.input, /* @__PURE__ */ new Set());
|
|
74
|
-
}
|
|
75
73
|
fieldNames() {
|
|
76
74
|
return this.#fieldNames(this.input, /* @__PURE__ */ new Set());
|
|
77
75
|
}
|
|
@@ -111,11 +109,59 @@ var Selection = class {
|
|
|
111
109
|
sql`, `
|
|
112
110
|
);
|
|
113
111
|
}
|
|
112
|
+
get [internalSql]() {
|
|
113
|
+
return this.#selectionToSql(this.input, /* @__PURE__ */ new Set());
|
|
114
|
+
}
|
|
115
|
+
join(right, operator) {
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
var TableSelection = class extends Selection {
|
|
120
|
+
constructor(table) {
|
|
121
|
+
super(table, /* @__PURE__ */ new Set());
|
|
122
|
+
this.table = table;
|
|
123
|
+
}
|
|
124
|
+
join(right, operator) {
|
|
125
|
+
const leftTable = getTable(this.table);
|
|
126
|
+
const rightTable = getTable(right);
|
|
127
|
+
const nullable = new Set(this.nullable);
|
|
128
|
+
if (operator === "right" || operator === "full")
|
|
129
|
+
nullable.add(leftTable.aliased);
|
|
130
|
+
if (operator === "left" || operator === "full")
|
|
131
|
+
nullable.add(rightTable.aliased);
|
|
132
|
+
return new JoinSelection([this.table, right], nullable);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
var JoinSelection = class _JoinSelection extends Selection {
|
|
136
|
+
constructor(tables, nullable) {
|
|
137
|
+
super(
|
|
138
|
+
Object.fromEntries(tables.map((table) => [getTable(table).aliased, table])),
|
|
139
|
+
nullable
|
|
140
|
+
);
|
|
141
|
+
this.tables = tables;
|
|
142
|
+
}
|
|
143
|
+
join(right, operator) {
|
|
144
|
+
const rightTable = getTable(right);
|
|
145
|
+
const nullable = new Set(this.nullable);
|
|
146
|
+
if (operator === "right" || operator === "full")
|
|
147
|
+
this.tables.map((table) => getTable(table).aliased).forEach(nullable.add, nullable);
|
|
148
|
+
if (operator === "left" || operator === "full")
|
|
149
|
+
nullable.add(rightTable.aliased);
|
|
150
|
+
return new _JoinSelection([...this.tables, right], nullable);
|
|
151
|
+
}
|
|
114
152
|
};
|
|
115
153
|
function selection(input, nullable = []) {
|
|
116
154
|
return new Selection(input, new Set(nullable));
|
|
117
155
|
}
|
|
156
|
+
((selection2) => {
|
|
157
|
+
function table(table2) {
|
|
158
|
+
return new TableSelection(table2);
|
|
159
|
+
}
|
|
160
|
+
selection2.table = table;
|
|
161
|
+
})(selection || (selection = {}));
|
|
118
162
|
export {
|
|
163
|
+
JoinSelection,
|
|
119
164
|
Selection,
|
|
165
|
+
TableSelection,
|
|
120
166
|
selection
|
|
121
167
|
};
|
package/dist/core/Sql.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export type Decoder<T> = ((value: unknown) => T) | {
|
|
|
16
16
|
};
|
|
17
17
|
export declare class Sql<Value = unknown> implements HasSql<Value> {
|
|
18
18
|
#private;
|
|
19
|
+
static SELF_TARGET: string;
|
|
19
20
|
private brand;
|
|
20
21
|
alias?: string;
|
|
21
22
|
mapFromDriverValue?: (input: unknown, specs: DriverSpecs) => Value;
|
|
@@ -34,6 +35,7 @@ export declare class Sql<Value = unknown> implements HasSql<Value> {
|
|
|
34
35
|
identifier(identifier: string): Sql<Value>;
|
|
35
36
|
inlineValues(): Sql<Value>;
|
|
36
37
|
inlineFields(withTableName: boolean): Sql<Value>;
|
|
38
|
+
nameSelf(name: string): Sql;
|
|
37
39
|
emitTo(emitter: Emitter): void;
|
|
38
40
|
}
|
|
39
41
|
export declare function sql<T>(strings: TemplateStringsArray, ...inner: Array<HasSql>): Sql<T>;
|
package/dist/core/Sql.js
CHANGED
|
@@ -7,6 +7,7 @@ var Chunk = class {
|
|
|
7
7
|
}
|
|
8
8
|
};
|
|
9
9
|
var Sql = class _Sql {
|
|
10
|
+
static SELF_TARGET = "$$self";
|
|
10
11
|
alias;
|
|
11
12
|
mapFromDriverValue;
|
|
12
13
|
[internalSql] = this;
|
|
@@ -60,7 +61,7 @@ var Sql = class _Sql {
|
|
|
60
61
|
return this.chunk("emitPlaceholder", name);
|
|
61
62
|
}
|
|
62
63
|
identifier(identifier) {
|
|
63
|
-
return this.chunk("
|
|
64
|
+
return this.chunk("emitIdentifierOrSelf", identifier);
|
|
64
65
|
}
|
|
65
66
|
inlineValues() {
|
|
66
67
|
return new _Sql(
|
|
@@ -79,7 +80,7 @@ var Sql = class _Sql {
|
|
|
79
80
|
const data = chunk.inner;
|
|
80
81
|
if (withTableName)
|
|
81
82
|
return [
|
|
82
|
-
new Chunk("
|
|
83
|
+
new Chunk("emitIdentifierOrSelf", data.targetName),
|
|
83
84
|
new Chunk("emitUnsafe", "."),
|
|
84
85
|
new Chunk("emitIdentifier", data.fieldName)
|
|
85
86
|
];
|
|
@@ -87,6 +88,9 @@ var Sql = class _Sql {
|
|
|
87
88
|
})
|
|
88
89
|
);
|
|
89
90
|
}
|
|
91
|
+
nameSelf(name) {
|
|
92
|
+
return sql.chunk("emitSelf", { name, inner: this });
|
|
93
|
+
}
|
|
90
94
|
emitTo(emitter) {
|
|
91
95
|
for (const chunk of this.#chunks)
|
|
92
96
|
emitter[chunk.type](chunk.inner);
|
package/dist/core/Virtual.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export declare function virtual<Input
|
|
1
|
+
import { type HasTarget } from './Internal.js';
|
|
2
|
+
export declare function virtual<Input>(alias: string, source?: Input): Input & HasTarget;
|
package/dist/core/Virtual.js
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
// src/core/Virtual.ts
|
|
2
|
-
import { getSql, hasSql } from "./Internal.js";
|
|
2
|
+
import { getSql, hasSql, internalTarget } from "./Internal.js";
|
|
3
|
+
import { sql } from "./Sql.js";
|
|
3
4
|
import { Field } from "./expr/Field.js";
|
|
4
5
|
function virtual(alias, source) {
|
|
6
|
+
const target = { [internalTarget]: sql.identifier(alias) };
|
|
5
7
|
if (source && hasSql(source)) {
|
|
6
8
|
const expr = getSql(source);
|
|
7
9
|
const name = expr.alias;
|
|
8
10
|
if (!name)
|
|
9
11
|
throw new Error("Cannot alias a virtual field without a name");
|
|
10
|
-
return new Field(alias, name, expr);
|
|
12
|
+
return Object.assign(new Field(alias, name, expr), target);
|
|
11
13
|
}
|
|
12
|
-
return new Proxy(
|
|
13
|
-
get(
|
|
14
|
-
if (field in
|
|
15
|
-
return
|
|
14
|
+
return new Proxy(target, {
|
|
15
|
+
get(target2, field) {
|
|
16
|
+
if (field in target2)
|
|
17
|
+
return target2[field];
|
|
16
18
|
const from = source?.[field];
|
|
17
19
|
if (typeof field !== "string")
|
|
18
20
|
return from;
|
|
19
|
-
return
|
|
21
|
+
return target2[field] = new Field(
|
|
20
22
|
alias,
|
|
21
23
|
field,
|
|
22
24
|
from ? getSql(from) : void 0
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type HasSql } from '../Internal.js';
|
|
2
|
+
import type { Either } from '../MetaData.js';
|
|
3
|
+
import type { Query } from '../Query.js';
|
|
2
4
|
import { type Sql } from '../Sql.js';
|
|
3
|
-
import type { Select } from '../query/Select.js';
|
|
4
5
|
import { type Input } from './Input.js';
|
|
5
6
|
export declare const eq: <T>(left: Input<T>, right: Input<T>) => Sql<boolean>;
|
|
6
7
|
export declare const ne: <T>(left: Input<T>, right: Input<T>) => Sql<boolean>;
|
|
@@ -18,8 +19,8 @@ export declare const arrayOverlaps: <T>(left: Input<Array<T>>, right: Input<Arra
|
|
|
18
19
|
export declare function and(...conditions: Array<undefined | Input<boolean>>): Sql<boolean>;
|
|
19
20
|
export declare function or(...conditions: Array<undefined | Input<boolean>>): Sql<boolean>;
|
|
20
21
|
export declare function not(condition: Input<boolean>): Sql<boolean>;
|
|
21
|
-
export declare function inArray<T>(left: Input<T>, right: Input<Array<T>>): Sql<boolean>;
|
|
22
|
-
export declare function notInArray<T>(left: Input<T>, right: Input<Array<T>>): Sql<boolean>;
|
|
22
|
+
export declare function inArray<T>(left: Input<T>, right: Query<T, any> | Input<Array<T>>): Sql<boolean>;
|
|
23
|
+
export declare function notInArray<T>(left: Input<T>, right: Query<T, any> | Input<Array<T>>): Sql<boolean>;
|
|
23
24
|
export declare function isNull(value: Input): Sql<boolean>;
|
|
24
25
|
export declare function isNotNull(value: Input): Sql<boolean>;
|
|
25
26
|
export declare function between<T>(value: Input<T>, left: Input<T>, right: Input<T>): Sql<boolean>;
|
|
@@ -29,4 +30,4 @@ export declare function desc<T>(input: HasSql<T>): Sql;
|
|
|
29
30
|
export declare function distinct<T>(input: HasSql<T>): Sql;
|
|
30
31
|
export declare function when<In, Out>(compare: Input<In>, ...cases: Array<[condition: Input<In>, result: Input<Out>] | Input<Out>>): Sql<Out>;
|
|
31
32
|
export declare function when<Out>(...cases: Array<[condition: Input<boolean>, result: Input<Out>] | Input<Out>>): Sql<Out>;
|
|
32
|
-
export declare function exists
|
|
33
|
+
export declare function exists(query: Query<any, Either>): Sql<boolean>;
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
import { getQuery } from "../Internal.js";
|
|
3
3
|
import { sql } from "../Sql.js";
|
|
4
4
|
import { input } from "./Input.js";
|
|
5
|
+
function bool(impl) {
|
|
6
|
+
return impl.mapWith(Boolean);
|
|
7
|
+
}
|
|
5
8
|
function binop(operator) {
|
|
6
|
-
return (left, right) => sql`${input(left)} ${sql.unsafe(operator)} ${input(right)}
|
|
9
|
+
return (left, right) => bool(sql`${input(left)} ${sql.unsafe(operator)} ${input(right)}`);
|
|
7
10
|
}
|
|
8
11
|
var eq = binop("=");
|
|
9
12
|
var ne = binop("<>");
|
|
@@ -21,49 +24,53 @@ var arrayOverlaps = binop("&&");
|
|
|
21
24
|
function and(...conditions) {
|
|
22
25
|
const inputs = conditions.filter((v) => v !== void 0).map(input);
|
|
23
26
|
if (inputs.length === 0)
|
|
24
|
-
return sql`true
|
|
27
|
+
return bool(sql`true`);
|
|
25
28
|
if (inputs.length === 1)
|
|
26
|
-
return inputs[0];
|
|
27
|
-
return sql`(${sql.join(inputs, sql` and `)})
|
|
29
|
+
return bool(inputs[0]);
|
|
30
|
+
return bool(sql`(${sql.join(inputs, sql` and `)})`);
|
|
28
31
|
}
|
|
29
32
|
function or(...conditions) {
|
|
30
33
|
const inputs = conditions.filter((v) => v !== void 0).map(input);
|
|
31
34
|
if (inputs.length === 0)
|
|
32
|
-
return sql`true
|
|
35
|
+
return bool(sql`true`);
|
|
33
36
|
if (inputs.length === 1)
|
|
34
|
-
return inputs[0];
|
|
35
|
-
return sql`(${sql.join(inputs, sql` or `)})
|
|
37
|
+
return bool(inputs[0]);
|
|
38
|
+
return bool(sql`(${sql.join(inputs, sql` or `)})`);
|
|
36
39
|
}
|
|
37
40
|
function not(condition) {
|
|
38
|
-
return sql`not ${input(condition)}
|
|
41
|
+
return bool(sql`not ${input(condition)}`);
|
|
39
42
|
}
|
|
40
43
|
function inArray(left, right) {
|
|
41
44
|
if (Array.isArray(right)) {
|
|
42
45
|
if (right.length === 0)
|
|
43
46
|
return sql`false`;
|
|
44
|
-
return sql`${input(left)} in (${sql.join(right.map(input), sql`, `)})
|
|
47
|
+
return bool(sql`${input(left)} in (${sql.join(right.map(input), sql`, `)})`);
|
|
45
48
|
}
|
|
46
|
-
return sql`${input(left)} in ${input(right)}
|
|
49
|
+
return bool(sql`${input(left)} in ${input(right)}`);
|
|
47
50
|
}
|
|
48
51
|
function notInArray(left, right) {
|
|
49
52
|
if (Array.isArray(right)) {
|
|
50
53
|
if (right.length === 0)
|
|
51
54
|
return sql`true`;
|
|
52
|
-
return
|
|
55
|
+
return bool(
|
|
56
|
+
sql`${input(left)} not in (${sql.join(right.map(input), sql`, `)})`
|
|
57
|
+
);
|
|
53
58
|
}
|
|
54
|
-
return sql`${input(left)} not in ${input(right)}
|
|
59
|
+
return bool(sql`${input(left)} not in ${input(right)}`);
|
|
55
60
|
}
|
|
56
61
|
function isNull(value) {
|
|
57
|
-
return sql`${input(value)} is null
|
|
62
|
+
return bool(sql`${input(value)} is null`);
|
|
58
63
|
}
|
|
59
64
|
function isNotNull(value) {
|
|
60
|
-
return sql`${input(value)} is not null
|
|
65
|
+
return bool(sql`${input(value)} is not null`);
|
|
61
66
|
}
|
|
62
67
|
function between(value, left, right) {
|
|
63
|
-
return sql`${input(value)} between ${input(left)} and ${input(right)}
|
|
68
|
+
return bool(sql`${input(value)} between ${input(left)} and ${input(right)}`);
|
|
64
69
|
}
|
|
65
70
|
function notBetween(value, left, right) {
|
|
66
|
-
return
|
|
71
|
+
return bool(
|
|
72
|
+
sql`${input(value)} not between ${input(left)} and ${input(right)}`
|
|
73
|
+
);
|
|
67
74
|
}
|
|
68
75
|
function asc(input2) {
|
|
69
76
|
return sql`${input2} asc`;
|
|
@@ -94,7 +101,7 @@ function when(...cases) {
|
|
|
94
101
|
]);
|
|
95
102
|
}
|
|
96
103
|
function exists(query) {
|
|
97
|
-
return sql`exists (${getQuery(query)})
|
|
104
|
+
return bool(sql`exists (${getQuery(query)})`);
|
|
98
105
|
}
|
|
99
106
|
export {
|
|
100
107
|
and,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type HasData, type HasSql, internalData, internalSql } from '../Internal.js';
|
|
2
2
|
import type { QueryMeta } from '../MetaData.js';
|
|
3
3
|
import type { RowOfRecord } from '../Selection.js';
|
|
4
4
|
import { type Sql } from '../Sql.js';
|
|
@@ -12,10 +12,9 @@ var Include = class {
|
|
|
12
12
|
}
|
|
13
13
|
#mapFromDriverValue = (value, specs) => {
|
|
14
14
|
const { select, first } = getData(this);
|
|
15
|
-
const selection = select.selection;
|
|
16
15
|
const parsed = specs.parsesJson ? value : JSON.parse(value);
|
|
17
16
|
if (first)
|
|
18
|
-
return parsed ?
|
|
17
|
+
return parsed ? select.mapRow({ values: parsed, index: 0, specs }) : null;
|
|
19
18
|
if (!parsed)
|
|
20
19
|
return [];
|
|
21
20
|
const rows = parsed;
|
|
@@ -27,7 +26,7 @@ var Include = class {
|
|
|
27
26
|
for (let i = 0; i < rows.length; i++) {
|
|
28
27
|
ctx.values = rows[i];
|
|
29
28
|
ctx.index = 0;
|
|
30
|
-
rows[i] =
|
|
29
|
+
rows[i] = select.mapRow(ctx);
|
|
31
30
|
}
|
|
32
31
|
return rows ?? [];
|
|
33
32
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type HasSelection, type HasSql, type HasTable, type HasTarget, internalData, internalQuery, internalSelection, internalSql } from '../Internal.js';
|
|
2
2
|
import type { QueryMeta } from '../MetaData.js';
|
|
3
|
-
import type { Query } from '../Query.js';
|
|
4
3
|
import { type IsNullable, type MakeNullable, type Selection, type SelectionRecord, type SelectionRow } from '../Selection.js';
|
|
5
4
|
import { type Sql } from '../Sql.js';
|
|
6
5
|
import type { Table, TableDefinition, TableFields } from '../Table.js';
|
|
@@ -10,11 +9,6 @@ import { type Input as UserInput } from '../expr/Input.js';
|
|
|
10
9
|
import { UnionBase, type UnionBaseData } from './Union.js';
|
|
11
10
|
export type SelectionType = 'selection' | 'allFrom' | 'joinTables';
|
|
12
11
|
export interface SelectData<Meta extends QueryMeta = QueryMeta> extends UnionBaseData<Meta> {
|
|
13
|
-
select: {
|
|
14
|
-
type: SelectionType;
|
|
15
|
-
tables: Array<string>;
|
|
16
|
-
selection?: Selection;
|
|
17
|
-
};
|
|
18
12
|
distinct?: boolean;
|
|
19
13
|
distinctOn?: Array<HasSql>;
|
|
20
14
|
from?: HasSql;
|
|
@@ -31,13 +25,13 @@ export declare class Select<Input, Meta extends QueryMeta = QueryMeta> extends U
|
|
|
31
25
|
constructor(data: SelectData<Meta>);
|
|
32
26
|
as(alias: string): SubQuery<Input>;
|
|
33
27
|
from(target: HasTarget | HasSql): Select<Input, Meta>;
|
|
34
|
-
leftJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
35
|
-
rightJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
36
|
-
innerJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
37
|
-
fullJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
28
|
+
leftJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
29
|
+
rightJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
30
|
+
innerJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
31
|
+
fullJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
38
32
|
where(...where: Array<HasSql<boolean> | undefined>): Select<Input, Meta>;
|
|
39
33
|
groupBy(...exprs: Array<HasSql>): Select<Input, Meta>;
|
|
40
|
-
having(having: HasSql<boolean>): Select<Input, Meta>;
|
|
34
|
+
having(having: HasSql<boolean> | ((self: Input) => HasSql<boolean>)): Select<Input, Meta>;
|
|
41
35
|
orderBy(...exprs: Array<HasSql>): Select<Input, Meta>;
|
|
42
36
|
limit(limit: UserInput<number>): Select<Input, Meta>;
|
|
43
37
|
offset(offset: UserInput<number>): Select<Input, Meta>;
|
|
@@ -59,7 +53,7 @@ export interface WithoutSelection<Meta extends QueryMeta> {
|
|
|
59
53
|
from<Definition extends TableDefinition, Name extends string>(from: Table<Definition, Name>): AllFrom<TableFields<Definition>, Meta, Record<Name, TableFields<Definition>>>;
|
|
60
54
|
from<Input>(from: SubQuery<Input>): SelectionFrom<Input, Meta>;
|
|
61
55
|
}
|
|
62
|
-
export interface WithSelection<Input, Meta extends QueryMeta> extends
|
|
56
|
+
export interface WithSelection<Input, Meta extends QueryMeta> extends SelectBase<Input, Meta>, HasSql<SelectionRow<Input>> {
|
|
63
57
|
from<Definition extends TableDefinition, Name extends string>(from: Table<Definition, Name>): SelectionFrom<Input, Meta>;
|
|
64
58
|
from(from: SubQuery<unknown>): SelectionFrom<Input, Meta>;
|
|
65
59
|
from(target: HasSql): Select<Input, Meta>;
|
|
@@ -75,8 +69,12 @@ type MarkFieldsAsNullable<Input, TableName extends string> = Expand<{
|
|
|
75
69
|
}>;
|
|
76
70
|
export interface SelectionFrom<Input, Meta extends QueryMeta> extends SelectBase<Input, Meta> {
|
|
77
71
|
leftJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<MarkFieldsAsNullable<Input, Name>, Meta>;
|
|
72
|
+
leftJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
78
73
|
rightJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
74
|
+
rightJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
79
75
|
innerJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
76
|
+
innerJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
80
77
|
fullJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
78
|
+
fullJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
81
79
|
}
|
|
82
80
|
export {};
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
getQuery,
|
|
5
5
|
getSelection,
|
|
6
6
|
getSql,
|
|
7
|
-
getTable,
|
|
8
7
|
getTarget,
|
|
9
8
|
hasTable,
|
|
10
9
|
hasTarget,
|
|
@@ -37,50 +36,24 @@ var Select = class _Select extends UnionBase {
|
|
|
37
36
|
}
|
|
38
37
|
from(target) {
|
|
39
38
|
const { select: current } = getData(this);
|
|
40
|
-
const selected = current.selection;
|
|
41
39
|
const from = hasTarget(target) ? getTarget(target) : getSql(target);
|
|
42
40
|
const isTable = hasTable(target);
|
|
43
|
-
const
|
|
41
|
+
const selected = current ?? (isTable ? selection.table(target) : selection(sql`*`));
|
|
44
42
|
return new _Select({
|
|
45
43
|
...getData(this),
|
|
46
|
-
select:
|
|
47
|
-
...current,
|
|
48
|
-
selection: selectionInput,
|
|
49
|
-
tables: isTable ? [getTable(target).aliased] : []
|
|
50
|
-
},
|
|
44
|
+
select: selected,
|
|
51
45
|
from
|
|
52
46
|
});
|
|
53
47
|
}
|
|
54
48
|
#join(operator, right, on) {
|
|
55
49
|
const { from, select: current } = getData(this);
|
|
56
|
-
const selected = current.selection;
|
|
57
|
-
const rightTable = getTable(right);
|
|
58
|
-
const addNullable = [];
|
|
59
|
-
if (operator === "right" || operator === "full")
|
|
60
|
-
addNullable.push(...current.tables);
|
|
61
|
-
if (operator === "left" || operator === "full")
|
|
62
|
-
addNullable.push(rightTable.aliased);
|
|
63
|
-
if (selected)
|
|
64
|
-
addNullable.push(...selected.nullable);
|
|
65
|
-
const select = current.type === "selection" ? current : {
|
|
66
|
-
type: "joinTables",
|
|
67
|
-
selection: selection(current.type === "allFrom" ? {
|
|
68
|
-
// Todo: handle this properly
|
|
69
|
-
[getTable(selected.input).aliased]: selected.input,
|
|
70
|
-
[rightTable.aliased]: right
|
|
71
|
-
} : {
|
|
72
|
-
...selected?.input,
|
|
73
|
-
[rightTable.aliased]: right
|
|
74
|
-
}, addNullable),
|
|
75
|
-
tables: [...current.tables, rightTable.aliased]
|
|
76
|
-
};
|
|
77
50
|
return new _Select({
|
|
78
51
|
...getData(this),
|
|
79
|
-
select,
|
|
52
|
+
select: hasTable(right) ? current?.join(right, operator) : current,
|
|
80
53
|
from: sql.join([
|
|
81
54
|
from,
|
|
82
55
|
sql.unsafe(`${operator} join`),
|
|
83
|
-
|
|
56
|
+
getTarget(right),
|
|
84
57
|
sql`on ${on}`
|
|
85
58
|
])
|
|
86
59
|
});
|
|
@@ -107,7 +80,10 @@ var Select = class _Select extends UnionBase {
|
|
|
107
80
|
});
|
|
108
81
|
}
|
|
109
82
|
having(having) {
|
|
110
|
-
return new _Select({
|
|
83
|
+
return new _Select({
|
|
84
|
+
...getData(this),
|
|
85
|
+
having: typeof having === "function" ? having(getSelection(this).input) : having
|
|
86
|
+
});
|
|
111
87
|
}
|
|
112
88
|
orderBy(...exprs) {
|
|
113
89
|
return new _Select({
|
|
@@ -126,9 +102,9 @@ var Select = class _Select extends UnionBase {
|
|
|
126
102
|
}
|
|
127
103
|
get [internalSelection]() {
|
|
128
104
|
const { select } = getData(this);
|
|
129
|
-
if (!select
|
|
105
|
+
if (!select)
|
|
130
106
|
throw new Error("No selection defined");
|
|
131
|
-
return select
|
|
107
|
+
return select;
|
|
132
108
|
}
|
|
133
109
|
get [internalQuery]() {
|
|
134
110
|
return sql.chunk("emitSelect", getData(this));
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type HasQuery, type HasSelection, type HasSql, type HasTarget, internalData, internalQuery, internalSelection } from '../Internal.js';
|
|
2
2
|
import type { IsMysql, IsPostgres, QueryMeta } from '../MetaData.js';
|
|
3
3
|
import { Query, type QueryData } from '../Query.js';
|
|
4
4
|
import type { Selection, SelectionRow } from '../Selection.js';
|
|
5
|
-
import {
|
|
5
|
+
import { Sql } from '../Sql.js';
|
|
6
6
|
export interface UnionBaseData<Meta extends QueryMeta> extends QueryData<Meta> {
|
|
7
|
-
|
|
7
|
+
select?: Selection;
|
|
8
8
|
}
|
|
9
9
|
export declare abstract class UnionBase<Input, Meta extends QueryMeta = QueryMeta> extends Query<SelectionRow<Input>, Meta> {
|
|
10
|
+
#private;
|
|
10
11
|
readonly [internalData]: UnionBaseData<Meta>;
|
|
11
|
-
union(right: UnionBase<Input, Meta>): Union<Input, Meta>;
|
|
12
|
-
unionAll(right: UnionBase<Input, Meta>): Union<Input, Meta>;
|
|
13
|
-
intersect(right: UnionBase<Input, Meta>): Union<Input, Meta>;
|
|
14
|
-
intersectAll(this: UnionBase<Input, IsPostgres | IsMysql>, right: UnionBase<Input, Meta>): Union<Input, Meta>;
|
|
15
|
-
except(right: UnionBase<Input, Meta>): Union<Input, Meta>;
|
|
16
|
-
exceptAll(this: UnionBase<Input, IsPostgres | IsMysql>, right: UnionBase<Input, Meta>): Union<Input, Meta>;
|
|
12
|
+
union(right: UnionBase<Input, Meta> | ((self: Input & HasTarget) => UnionBase<Input, Meta>)): Union<Input, Meta>;
|
|
13
|
+
unionAll(right: UnionBase<Input, Meta> | ((self: Input & HasTarget) => UnionBase<Input, Meta>)): Union<Input, Meta>;
|
|
14
|
+
intersect(right: UnionBase<Input, Meta> | ((self: Input & HasTarget) => UnionBase<Input, Meta>)): Union<Input, Meta>;
|
|
15
|
+
intersectAll(this: UnionBase<Input, IsPostgres | IsMysql>, right: UnionBase<Input, Meta> | ((self: Input & HasTarget) => UnionBase<Input, Meta>)): Union<Input, Meta>;
|
|
16
|
+
except(right: UnionBase<Input, Meta> | ((self: Input & HasTarget) => UnionBase<Input, Meta>)): Union<Input, Meta>;
|
|
17
|
+
exceptAll(this: UnionBase<Input, IsPostgres | IsMysql>, right: UnionBase<Input, Meta> | ((self: Input & HasTarget) => UnionBase<Input, Meta>)): Union<Input, Meta>;
|
|
17
18
|
}
|
|
18
|
-
export interface UnionData<Meta extends QueryMeta> extends UnionBaseData<Meta> {
|
|
19
|
+
export interface UnionData<Meta extends QueryMeta = QueryMeta> extends UnionBaseData<Meta> {
|
|
19
20
|
left: HasQuery;
|
|
20
21
|
operator: HasSql;
|
|
21
22
|
right: HasQuery;
|
package/dist/core/query/Union.js
CHANGED
|
@@ -6,15 +6,19 @@ import {
|
|
|
6
6
|
internalSelection
|
|
7
7
|
} from "../Internal.js";
|
|
8
8
|
import { Query } from "../Query.js";
|
|
9
|
-
import { sql } from "../Sql.js";
|
|
9
|
+
import { Sql, sql } from "../Sql.js";
|
|
10
10
|
var UnionBase = class extends Query {
|
|
11
11
|
[internalData];
|
|
12
|
+
#makeSelf() {
|
|
13
|
+
const { select } = getData(this);
|
|
14
|
+
return select.makeVirtual(Sql.SELF_TARGET);
|
|
15
|
+
}
|
|
12
16
|
union(right) {
|
|
13
17
|
return new Union({
|
|
14
18
|
...getData(this),
|
|
15
19
|
left: this,
|
|
16
20
|
operator: sql`union`,
|
|
17
|
-
right
|
|
21
|
+
right: typeof right === "function" ? right(this.#makeSelf()) : right
|
|
18
22
|
});
|
|
19
23
|
}
|
|
20
24
|
unionAll(right) {
|
|
@@ -22,7 +26,7 @@ var UnionBase = class extends Query {
|
|
|
22
26
|
...getData(this),
|
|
23
27
|
left: this,
|
|
24
28
|
operator: sql`union all`,
|
|
25
|
-
right
|
|
29
|
+
right: typeof right === "function" ? right(this.#makeSelf()) : right
|
|
26
30
|
});
|
|
27
31
|
}
|
|
28
32
|
intersect(right) {
|
|
@@ -30,7 +34,7 @@ var UnionBase = class extends Query {
|
|
|
30
34
|
...getData(this),
|
|
31
35
|
left: this,
|
|
32
36
|
operator: sql`intersect`,
|
|
33
|
-
right
|
|
37
|
+
right: typeof right === "function" ? right(this.#makeSelf()) : right
|
|
34
38
|
});
|
|
35
39
|
}
|
|
36
40
|
intersectAll(right) {
|
|
@@ -38,7 +42,7 @@ var UnionBase = class extends Query {
|
|
|
38
42
|
...getData(this),
|
|
39
43
|
left: this,
|
|
40
44
|
operator: sql`intersect all`,
|
|
41
|
-
right
|
|
45
|
+
right: typeof right === "function" ? right(this.#makeSelf()) : right
|
|
42
46
|
});
|
|
43
47
|
}
|
|
44
48
|
except(right) {
|
|
@@ -46,7 +50,7 @@ var UnionBase = class extends Query {
|
|
|
46
50
|
...getData(this),
|
|
47
51
|
left: this,
|
|
48
52
|
operator: sql`except`,
|
|
49
|
-
right
|
|
53
|
+
right: typeof right === "function" ? right(this.#makeSelf()) : right
|
|
50
54
|
});
|
|
51
55
|
}
|
|
52
56
|
exceptAll(right) {
|
|
@@ -54,7 +58,7 @@ var UnionBase = class extends Query {
|
|
|
54
58
|
...getData(this),
|
|
55
59
|
left: this,
|
|
56
60
|
operator: sql`except all`,
|
|
57
|
-
right
|
|
61
|
+
right: typeof right === "function" ? right(this.#makeSelf()) : right
|
|
58
62
|
});
|
|
59
63
|
}
|
|
60
64
|
};
|
|
@@ -64,10 +68,10 @@ var Union = class extends UnionBase {
|
|
|
64
68
|
constructor(data) {
|
|
65
69
|
super(data);
|
|
66
70
|
this[internalData] = data;
|
|
67
|
-
this[internalSelection] = data.
|
|
71
|
+
this[internalSelection] = data.select;
|
|
68
72
|
}
|
|
69
73
|
get [internalQuery]() {
|
|
70
|
-
return sql.chunk("emitUnion", this);
|
|
74
|
+
return sql.chunk("emitUnion", getData(this));
|
|
71
75
|
}
|
|
72
76
|
};
|
|
73
77
|
function union(left, right, ...rest) {
|
|
@@ -50,7 +50,7 @@ var UpdateTable = class _UpdateTable extends Update {
|
|
|
50
50
|
const data = getData(this);
|
|
51
51
|
return new Update({
|
|
52
52
|
...data,
|
|
53
|
-
returning: selection(returning
|
|
53
|
+
returning: returning ? selection(returning) : selection.table(data.table)
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
export * from './compat.js';
|
|
2
|
+
export * from './core/Builder.js';
|
|
2
3
|
export * from './core/Column.js';
|
|
3
4
|
export * from './core/Constraint.js';
|
|
4
5
|
export * from './core/Database.js';
|
|
5
6
|
export * from './core/Driver.js';
|
|
7
|
+
export * from './core/Index.js';
|
|
8
|
+
export * from './core/Internal.js';
|
|
9
|
+
export * from './core/Query.js';
|
|
10
|
+
export * from './core/Selection.js';
|
|
11
|
+
export * from './core/Sql.js';
|
|
12
|
+
export * from './core/Table.js';
|
|
6
13
|
export * from './core/expr/Aggregate.js';
|
|
7
14
|
export * from './core/expr/Conditions.js';
|
|
8
15
|
export * from './core/expr/Include.js';
|
|
9
|
-
export * from './core/Index.js';
|
|
10
|
-
export * from './core/Query.js';
|
|
11
16
|
export * from './core/query/Delete.js';
|
|
12
17
|
export * from './core/query/Insert.js';
|
|
13
18
|
export * from './core/query/Select.js';
|
|
14
19
|
export * from './core/query/Union.js';
|
|
15
20
|
export * from './core/query/Update.js';
|
|
16
|
-
export * from './core/Selection.js';
|
|
17
|
-
export * from './core/Sql.js';
|
|
18
|
-
export * from './core/Table.js';
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
export * from "./compat.js";
|
|
3
|
+
export * from "./core/Builder.js";
|
|
3
4
|
export * from "./core/Column.js";
|
|
4
5
|
export * from "./core/Constraint.js";
|
|
5
6
|
export * from "./core/Database.js";
|
|
6
7
|
export * from "./core/Driver.js";
|
|
8
|
+
export * from "./core/Index.js";
|
|
9
|
+
export * from "./core/Internal.js";
|
|
10
|
+
export * from "./core/Query.js";
|
|
11
|
+
export * from "./core/Selection.js";
|
|
12
|
+
export * from "./core/Sql.js";
|
|
13
|
+
export * from "./core/Table.js";
|
|
7
14
|
export * from "./core/expr/Aggregate.js";
|
|
8
15
|
export * from "./core/expr/Conditions.js";
|
|
9
16
|
export * from "./core/expr/Include.js";
|
|
10
|
-
export * from "./core/Index.js";
|
|
11
|
-
export * from "./core/Query.js";
|
|
12
17
|
export * from "./core/query/Delete.js";
|
|
13
18
|
export * from "./core/query/Insert.js";
|
|
14
19
|
export * from "./core/query/Select.js";
|
|
15
20
|
export * from "./core/query/Union.js";
|
|
16
21
|
export * from "./core/query/Update.js";
|
|
17
|
-
export * from "./core/Selection.js";
|
|
18
|
-
export * from "./core/Sql.js";
|
|
19
|
-
export * from "./core/Table.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rado",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"size": "esbuild src/index.ts --bundle --minify --format=esm --outdir=dist",
|
|
9
9
|
"profile": "PROFILE=true bun build.ts && cd bin && (rimraf CPU*.cpuprofile || true) && node --cpu-prof --cpu-prof-interval=100 test && speedscope CPU*.cpuprofile",
|
|
10
10
|
"prepublishOnly": "rm -rf dist && bun run build",
|
|
11
|
-
"cycles": "madge --
|
|
11
|
+
"cycles": "madge --circular src/index.ts src/sqlite.ts src/mysql.ts src/postgres.ts",
|
|
12
12
|
"test:bun": "bun test",
|
|
13
13
|
"test:node": "node --test-force-exit --test-concurrency=1 --import tsx --test \"**/*.test.ts\"",
|
|
14
14
|
"test:deno": "deno test --no-check --allow-read"
|