pqb 0.0.1
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/index.d.ts +3630 -0
- package/dist/index.esm.js +4587 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +4691 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
- package/rollup.config.js +35 -0
- package/src/adapter.test.ts +10 -0
- package/src/adapter.ts +171 -0
- package/src/columnSchema/array.ts +21 -0
- package/src/columnSchema/boolean.ts +10 -0
- package/src/columnSchema/columnType.test.ts +129 -0
- package/src/columnSchema/columnType.ts +77 -0
- package/src/columnSchema/columnTypes.ts +145 -0
- package/src/columnSchema/columnsSchema.test.ts +32 -0
- package/src/columnSchema/columnsSchema.ts +100 -0
- package/src/columnSchema/commonMethods.ts +130 -0
- package/src/columnSchema/dateTime.ts +104 -0
- package/src/columnSchema/enum.ts +13 -0
- package/src/columnSchema/index.ts +11 -0
- package/src/columnSchema/json/array.ts +55 -0
- package/src/columnSchema/json/discriminatedUnion.ts +91 -0
- package/src/columnSchema/json/enum.ts +29 -0
- package/src/columnSchema/json/instanceOf.ts +16 -0
- package/src/columnSchema/json/intersection.ts +23 -0
- package/src/columnSchema/json/lazy.ts +22 -0
- package/src/columnSchema/json/literal.ts +12 -0
- package/src/columnSchema/json/map.ts +29 -0
- package/src/columnSchema/json/nativeEnum.ts +30 -0
- package/src/columnSchema/json/nullable.ts +33 -0
- package/src/columnSchema/json/nullish.ts +30 -0
- package/src/columnSchema/json/object.ts +206 -0
- package/src/columnSchema/json/optional.ts +28 -0
- package/src/columnSchema/json/record.ts +40 -0
- package/src/columnSchema/json/scalarTypes.ts +117 -0
- package/src/columnSchema/json/set.ts +34 -0
- package/src/columnSchema/json/tuple.ts +40 -0
- package/src/columnSchema/json/typeBase.ts +202 -0
- package/src/columnSchema/json/union.ts +16 -0
- package/src/columnSchema/json.ts +64 -0
- package/src/columnSchema/number.ts +122 -0
- package/src/columnSchema/string.ts +222 -0
- package/src/columnSchema/utils.ts +27 -0
- package/src/common.ts +86 -0
- package/src/db.test.ts +67 -0
- package/src/db.ts +212 -0
- package/src/errors.ts +7 -0
- package/src/index.ts +18 -0
- package/src/operators.test.ts +608 -0
- package/src/operators.ts +177 -0
- package/src/query.ts +292 -0
- package/src/queryDataUtils.ts +50 -0
- package/src/queryMethods/aggregate.test.ts +583 -0
- package/src/queryMethods/aggregate.ts +878 -0
- package/src/queryMethods/callbacks.test.ts +69 -0
- package/src/queryMethods/callbacks.ts +55 -0
- package/src/queryMethods/clear.test.ts +64 -0
- package/src/queryMethods/clear.ts +58 -0
- package/src/queryMethods/columnInfo.test.ts +45 -0
- package/src/queryMethods/columnInfo.ts +67 -0
- package/src/queryMethods/delete.test.ts +135 -0
- package/src/queryMethods/delete.ts +50 -0
- package/src/queryMethods/for.test.ts +57 -0
- package/src/queryMethods/for.ts +99 -0
- package/src/queryMethods/from.test.ts +66 -0
- package/src/queryMethods/from.ts +58 -0
- package/src/queryMethods/get.test.ts +66 -0
- package/src/queryMethods/get.ts +88 -0
- package/src/queryMethods/having.test.ts +247 -0
- package/src/queryMethods/having.ts +99 -0
- package/src/queryMethods/insert.test.ts +555 -0
- package/src/queryMethods/insert.ts +453 -0
- package/src/queryMethods/join.test.ts +150 -0
- package/src/queryMethods/join.ts +508 -0
- package/src/queryMethods/json.test.ts +398 -0
- package/src/queryMethods/json.ts +259 -0
- package/src/queryMethods/log.test.ts +172 -0
- package/src/queryMethods/log.ts +123 -0
- package/src/queryMethods/queryMethods.test.ts +629 -0
- package/src/queryMethods/queryMethods.ts +428 -0
- package/src/queryMethods/select.test.ts +479 -0
- package/src/queryMethods/select.ts +249 -0
- package/src/queryMethods/then.ts +236 -0
- package/src/queryMethods/transaction.test.ts +66 -0
- package/src/queryMethods/transaction.ts +66 -0
- package/src/queryMethods/union.test.ts +59 -0
- package/src/queryMethods/union.ts +89 -0
- package/src/queryMethods/update.test.ts +417 -0
- package/src/queryMethods/update.ts +350 -0
- package/src/queryMethods/upsert.test.ts +56 -0
- package/src/queryMethods/upsert.ts +43 -0
- package/src/queryMethods/where.test.ts +1594 -0
- package/src/queryMethods/where.ts +450 -0
- package/src/queryMethods/window.test.ts +66 -0
- package/src/queryMethods/window.ts +108 -0
- package/src/queryMethods/with.test.ts +191 -0
- package/src/queryMethods/with.ts +92 -0
- package/src/quote.ts +36 -0
- package/src/relations.ts +194 -0
- package/src/sql/aggregate.ts +80 -0
- package/src/sql/columnInfo.ts +22 -0
- package/src/sql/common.ts +42 -0
- package/src/sql/delete.ts +41 -0
- package/src/sql/distinct.ts +19 -0
- package/src/sql/fromAndAs.ts +51 -0
- package/src/sql/having.ts +140 -0
- package/src/sql/index.ts +2 -0
- package/src/sql/insert.ts +102 -0
- package/src/sql/join.ts +242 -0
- package/src/sql/orderBy.ts +41 -0
- package/src/sql/select.ts +153 -0
- package/src/sql/toSql.ts +153 -0
- package/src/sql/truncate.ts +13 -0
- package/src/sql/types.ts +355 -0
- package/src/sql/update.ts +62 -0
- package/src/sql/where.ts +314 -0
- package/src/sql/window.ts +38 -0
- package/src/sql/with.ts +32 -0
- package/src/test-utils.ts +172 -0
- package/src/utils.ts +140 -0
- package/tsconfig.build.json +6 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AddQueryJoinedTable,
|
|
3
|
+
ColumnsParsers,
|
|
4
|
+
Query,
|
|
5
|
+
QueryBase,
|
|
6
|
+
Selectable,
|
|
7
|
+
SelectableBase,
|
|
8
|
+
WithDataItem,
|
|
9
|
+
} from '../query';
|
|
10
|
+
import { pushQueryValue, setQueryObjectValue } from '../queryDataUtils';
|
|
11
|
+
import { RawExpression, StringKey } from '../common';
|
|
12
|
+
import { WhereQueryBuilder } from './where';
|
|
13
|
+
import { Relation } from '../relations';
|
|
14
|
+
|
|
15
|
+
type WithSelectable<
|
|
16
|
+
T extends QueryBase,
|
|
17
|
+
W extends keyof T['withData'],
|
|
18
|
+
> = T['withData'][W] extends WithDataItem
|
|
19
|
+
?
|
|
20
|
+
| StringKey<keyof T['withData'][W]['shape']>
|
|
21
|
+
| `${T['withData'][W]['table']}.${StringKey<
|
|
22
|
+
keyof T['withData'][W]['shape']
|
|
23
|
+
>}`
|
|
24
|
+
: never;
|
|
25
|
+
|
|
26
|
+
export type JoinArgs<
|
|
27
|
+
T extends QueryBase,
|
|
28
|
+
Q extends Query = Query,
|
|
29
|
+
R extends keyof T['relations'] = keyof T['relations'],
|
|
30
|
+
W extends keyof T['withData'] = keyof T['withData'],
|
|
31
|
+
> =
|
|
32
|
+
| [relation: R]
|
|
33
|
+
| [
|
|
34
|
+
query: Q,
|
|
35
|
+
conditions:
|
|
36
|
+
| Record<Selectable<Q>, Selectable<T> | RawExpression>
|
|
37
|
+
| RawExpression,
|
|
38
|
+
]
|
|
39
|
+
| [
|
|
40
|
+
withAlias: W,
|
|
41
|
+
conditions:
|
|
42
|
+
| Record<WithSelectable<T, W>, Selectable<T> | RawExpression>
|
|
43
|
+
| RawExpression,
|
|
44
|
+
]
|
|
45
|
+
| [
|
|
46
|
+
query: Q,
|
|
47
|
+
leftColumn: Selectable<Q> | RawExpression,
|
|
48
|
+
rightColumn: Selectable<T> | RawExpression,
|
|
49
|
+
]
|
|
50
|
+
| [
|
|
51
|
+
withAlias: W,
|
|
52
|
+
leftColumn: WithSelectable<T, W> | RawExpression,
|
|
53
|
+
rightColumn: Selectable<T> | RawExpression,
|
|
54
|
+
]
|
|
55
|
+
| [
|
|
56
|
+
query: Q,
|
|
57
|
+
leftColumn: Selectable<Q> | RawExpression,
|
|
58
|
+
op: string,
|
|
59
|
+
rightColumn: Selectable<T> | RawExpression,
|
|
60
|
+
]
|
|
61
|
+
| [
|
|
62
|
+
withAlias: W,
|
|
63
|
+
leftColumn: WithSelectable<T, W> | RawExpression,
|
|
64
|
+
op: string,
|
|
65
|
+
rightColumn: Selectable<T> | RawExpression,
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
type JoinResult<
|
|
69
|
+
T extends Query,
|
|
70
|
+
Args extends JoinArgs<T>,
|
|
71
|
+
A extends Query | keyof T['relations'] = Args[0],
|
|
72
|
+
> = AddQueryJoinedTable<
|
|
73
|
+
T,
|
|
74
|
+
A extends Query
|
|
75
|
+
? A
|
|
76
|
+
: T['relations'] extends Record<string, Relation>
|
|
77
|
+
? A extends keyof T['relations']
|
|
78
|
+
? T['relations'][A]['model']
|
|
79
|
+
: A extends keyof T['withData']
|
|
80
|
+
? T['withData'][A] extends WithDataItem
|
|
81
|
+
? {
|
|
82
|
+
table: T['withData'][A]['table'];
|
|
83
|
+
tableAlias: undefined;
|
|
84
|
+
result: T['withData'][A]['shape'];
|
|
85
|
+
}
|
|
86
|
+
: never
|
|
87
|
+
: never
|
|
88
|
+
: never
|
|
89
|
+
>;
|
|
90
|
+
|
|
91
|
+
export type JoinCallbackArg<T extends QueryBase> =
|
|
92
|
+
| Query
|
|
93
|
+
| keyof T['withData']
|
|
94
|
+
| keyof T['relations'];
|
|
95
|
+
|
|
96
|
+
export type JoinCallback<
|
|
97
|
+
T extends QueryBase,
|
|
98
|
+
Arg extends JoinCallbackArg<T>,
|
|
99
|
+
> = (
|
|
100
|
+
q: OnQueryBuilder<
|
|
101
|
+
T,
|
|
102
|
+
Arg extends keyof T['withData']
|
|
103
|
+
? T['withData'][Arg] extends WithDataItem
|
|
104
|
+
? {
|
|
105
|
+
table: T['withData'][Arg]['table'];
|
|
106
|
+
tableAlias: undefined;
|
|
107
|
+
shape: T['withData'][Arg]['shape'];
|
|
108
|
+
selectable: {
|
|
109
|
+
[K in keyof T['withData'][Arg]['shape'] as `${T['withData'][Arg]['table']}.${StringKey<K>}`]: {
|
|
110
|
+
as: StringKey<K>;
|
|
111
|
+
column: T['withData'][Arg]['shape'][K];
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
: never
|
|
116
|
+
: Arg extends Query
|
|
117
|
+
? Arg
|
|
118
|
+
: T['relations'] extends Record<string, Relation>
|
|
119
|
+
? Arg extends keyof T['relations']
|
|
120
|
+
? T['relations'][Arg]['model']
|
|
121
|
+
: never
|
|
122
|
+
: never
|
|
123
|
+
>,
|
|
124
|
+
) => OnQueryBuilder;
|
|
125
|
+
|
|
126
|
+
type JoinCallbackResult<
|
|
127
|
+
T extends Query,
|
|
128
|
+
Arg extends JoinCallbackArg<T>,
|
|
129
|
+
> = AddQueryJoinedTable<
|
|
130
|
+
T,
|
|
131
|
+
Arg extends Query
|
|
132
|
+
? Arg
|
|
133
|
+
: T['relations'] extends Record<string, Relation>
|
|
134
|
+
? Arg extends keyof T['relations']
|
|
135
|
+
? T['relations'][Arg]['model']
|
|
136
|
+
: Arg extends keyof T['withData']
|
|
137
|
+
? T['withData'][Arg] extends WithDataItem
|
|
138
|
+
? {
|
|
139
|
+
table: T['withData'][Arg]['table'];
|
|
140
|
+
tableAlias: undefined;
|
|
141
|
+
result: T['withData'][Arg]['shape'];
|
|
142
|
+
}
|
|
143
|
+
: never
|
|
144
|
+
: never
|
|
145
|
+
: never
|
|
146
|
+
>;
|
|
147
|
+
|
|
148
|
+
const join = <T extends Query, Args extends JoinArgs<T>>(
|
|
149
|
+
q: T,
|
|
150
|
+
type: string,
|
|
151
|
+
args: Args,
|
|
152
|
+
): JoinResult<T, Args> => {
|
|
153
|
+
return _join(q.clone() as T, type, args) as unknown as JoinResult<T, Args>;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const _join = <
|
|
157
|
+
T extends Query,
|
|
158
|
+
Arg extends JoinCallbackArg<T>,
|
|
159
|
+
Args extends JoinArgs<T>,
|
|
160
|
+
>(
|
|
161
|
+
q: T,
|
|
162
|
+
type: string,
|
|
163
|
+
args: Args | [arg: Arg, cb: JoinCallback<T, Arg>],
|
|
164
|
+
): JoinResult<T, Args> => {
|
|
165
|
+
const first = args[0];
|
|
166
|
+
let joinKey: string | undefined;
|
|
167
|
+
let parsers: ColumnsParsers | undefined;
|
|
168
|
+
|
|
169
|
+
if (typeof first === 'object') {
|
|
170
|
+
const as = first.tableAlias || first.table;
|
|
171
|
+
if (as) {
|
|
172
|
+
joinKey = as;
|
|
173
|
+
parsers = first.query.parsers || first.columnsParsers;
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
joinKey = first as string;
|
|
177
|
+
|
|
178
|
+
const relation = (q.relations as Record<string, Relation>)[joinKey];
|
|
179
|
+
if (relation) {
|
|
180
|
+
parsers = relation.model.query.parsers || relation.model.columnsParsers;
|
|
181
|
+
} else {
|
|
182
|
+
const shape = q.query.withShapes?.[first as string];
|
|
183
|
+
if (shape) {
|
|
184
|
+
parsers = {};
|
|
185
|
+
for (const key in shape) {
|
|
186
|
+
const parser = shape[key].parseFn;
|
|
187
|
+
if (parser) {
|
|
188
|
+
parsers[key] = parser;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (joinKey && parsers) {
|
|
196
|
+
setQueryObjectValue(q, 'joinedParsers', joinKey, parsers);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return pushQueryValue(q, 'join', {
|
|
200
|
+
type,
|
|
201
|
+
args,
|
|
202
|
+
}) as unknown as JoinResult<T, Args>;
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export class Join {
|
|
206
|
+
join<T extends Query, Args extends JoinArgs<T>>(
|
|
207
|
+
this: T,
|
|
208
|
+
...args: Args
|
|
209
|
+
): JoinResult<T, Args>;
|
|
210
|
+
join<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
211
|
+
this: T,
|
|
212
|
+
arg: Arg,
|
|
213
|
+
cb: JoinCallback<T, Arg>,
|
|
214
|
+
): JoinCallbackResult<T, Arg>;
|
|
215
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
216
|
+
join(this: Query, ...args: any) {
|
|
217
|
+
return join(this, 'JOIN', args);
|
|
218
|
+
}
|
|
219
|
+
_join<T extends Query, Args extends JoinArgs<T>>(
|
|
220
|
+
this: T,
|
|
221
|
+
...args: Args
|
|
222
|
+
): JoinResult<T, Args>;
|
|
223
|
+
_join<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
224
|
+
this: T,
|
|
225
|
+
arg: Arg,
|
|
226
|
+
cb: JoinCallback<T, Arg>,
|
|
227
|
+
): JoinCallbackResult<T, Arg>;
|
|
228
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
229
|
+
_join(this: Query, ...args: any) {
|
|
230
|
+
return _join(this, 'JOIN', args);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
innerJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
234
|
+
this: T,
|
|
235
|
+
...args: Args
|
|
236
|
+
): JoinResult<T, Args>;
|
|
237
|
+
innerJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
238
|
+
this: T,
|
|
239
|
+
arg: Arg,
|
|
240
|
+
cb: JoinCallback<T, Arg>,
|
|
241
|
+
): JoinCallbackResult<T, Arg>;
|
|
242
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
243
|
+
innerJoin(this: Query, ...args: any) {
|
|
244
|
+
return join(this, 'INNER JOIN', args);
|
|
245
|
+
}
|
|
246
|
+
_innerJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
247
|
+
this: T,
|
|
248
|
+
...args: Args
|
|
249
|
+
): JoinResult<T, Args>;
|
|
250
|
+
_innerJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
251
|
+
this: T,
|
|
252
|
+
arg: Arg,
|
|
253
|
+
cb: JoinCallback<T, Arg>,
|
|
254
|
+
): JoinCallbackResult<T, Arg>;
|
|
255
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
256
|
+
_innerJoin(this: Query, ...args: any) {
|
|
257
|
+
return _join(this, 'INNER JOIN', args);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
leftJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
261
|
+
this: T,
|
|
262
|
+
...args: Args
|
|
263
|
+
): JoinResult<T, Args>;
|
|
264
|
+
leftJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
265
|
+
this: T,
|
|
266
|
+
arg: Arg,
|
|
267
|
+
cb: JoinCallback<T, Arg>,
|
|
268
|
+
): JoinCallbackResult<T, Arg>;
|
|
269
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
270
|
+
leftJoin(this: Query, ...args: any) {
|
|
271
|
+
return join(this, 'LEFT JOIN', args);
|
|
272
|
+
}
|
|
273
|
+
_leftJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
274
|
+
this: T,
|
|
275
|
+
...args: Args
|
|
276
|
+
): JoinResult<T, Args>;
|
|
277
|
+
_leftJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
278
|
+
this: T,
|
|
279
|
+
arg: Arg,
|
|
280
|
+
cb: JoinCallback<T, Arg>,
|
|
281
|
+
): JoinCallbackResult<T, Arg>;
|
|
282
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
283
|
+
_leftJoin(this: Query, ...args: any) {
|
|
284
|
+
return _join(this, 'LEFT JOIN', args);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
leftOuterJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
288
|
+
this: T,
|
|
289
|
+
...args: Args
|
|
290
|
+
): JoinResult<T, Args>;
|
|
291
|
+
leftOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
292
|
+
this: T,
|
|
293
|
+
arg: Arg,
|
|
294
|
+
cb: JoinCallback<T, Arg>,
|
|
295
|
+
): JoinCallbackResult<T, Arg>;
|
|
296
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
297
|
+
leftOuterJoin(this: Query, ...args: any) {
|
|
298
|
+
return join(this, 'LEFT OUTER JOIN', args);
|
|
299
|
+
}
|
|
300
|
+
_leftOuterJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
301
|
+
this: T,
|
|
302
|
+
...args: Args
|
|
303
|
+
): JoinResult<T, Args>;
|
|
304
|
+
_leftOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
305
|
+
this: T,
|
|
306
|
+
arg: Arg,
|
|
307
|
+
cb: JoinCallback<T, Arg>,
|
|
308
|
+
): JoinCallbackResult<T, Arg>;
|
|
309
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
310
|
+
_leftOuterJoin(this: Query, ...args: any) {
|
|
311
|
+
return _join(this, 'LEFT OUTER JOIN', args);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
rightJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
315
|
+
this: T,
|
|
316
|
+
...args: Args
|
|
317
|
+
): JoinResult<T, Args>;
|
|
318
|
+
rightJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
319
|
+
this: T,
|
|
320
|
+
arg: Arg,
|
|
321
|
+
cb: JoinCallback<T, Arg>,
|
|
322
|
+
): JoinCallbackResult<T, Arg>;
|
|
323
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
324
|
+
rightJoin(this: Query, ...args: any) {
|
|
325
|
+
return join(this, 'RIGHT JOIN', args);
|
|
326
|
+
}
|
|
327
|
+
_rightJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
328
|
+
this: T,
|
|
329
|
+
...args: Args
|
|
330
|
+
): JoinResult<T, Args>;
|
|
331
|
+
_rightJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
332
|
+
this: T,
|
|
333
|
+
arg: Arg,
|
|
334
|
+
cb: JoinCallback<T, Arg>,
|
|
335
|
+
): JoinCallbackResult<T, Arg>;
|
|
336
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
337
|
+
_rightJoin(this: Query, ...args: any) {
|
|
338
|
+
return _join(this, 'RIGHT JOIN', args);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
rightOuterJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
342
|
+
this: T,
|
|
343
|
+
...args: Args
|
|
344
|
+
): JoinResult<T, Args>;
|
|
345
|
+
rightOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
346
|
+
this: T,
|
|
347
|
+
arg: Arg,
|
|
348
|
+
cb: JoinCallback<T, Arg>,
|
|
349
|
+
): JoinCallbackResult<T, Arg>;
|
|
350
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
351
|
+
rightOuterJoin(this: Query, ...args: any) {
|
|
352
|
+
return join(this, 'RIGHT OUTER JOIN', args);
|
|
353
|
+
}
|
|
354
|
+
_rightOuterJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
355
|
+
this: T,
|
|
356
|
+
...args: Args
|
|
357
|
+
): JoinResult<T, Args>;
|
|
358
|
+
_rightOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
359
|
+
this: T,
|
|
360
|
+
arg: Arg,
|
|
361
|
+
cb: JoinCallback<T, Arg>,
|
|
362
|
+
): JoinCallbackResult<T, Arg>;
|
|
363
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
364
|
+
_rightOuterJoin(this: Query, ...args: any) {
|
|
365
|
+
return _join(this, 'RIGHT OUTER JOIN', args);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
fullOuterJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
369
|
+
this: T,
|
|
370
|
+
...args: Args
|
|
371
|
+
): JoinResult<T, Args>;
|
|
372
|
+
fullOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
373
|
+
this: T,
|
|
374
|
+
arg: Arg,
|
|
375
|
+
cb: JoinCallback<T, Arg>,
|
|
376
|
+
): JoinCallbackResult<T, Arg>;
|
|
377
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
378
|
+
fullOuterJoin(this: Query, ...args: any) {
|
|
379
|
+
return join(this, 'FULL OUTER JOIN', args);
|
|
380
|
+
}
|
|
381
|
+
_fullOuterJoin<T extends Query, Args extends JoinArgs<T>>(
|
|
382
|
+
this: T,
|
|
383
|
+
...args: Args
|
|
384
|
+
): JoinResult<T, Args>;
|
|
385
|
+
_fullOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
|
|
386
|
+
this: T,
|
|
387
|
+
arg: Arg,
|
|
388
|
+
cb: JoinCallback<T, Arg>,
|
|
389
|
+
): JoinCallbackResult<T, Arg>;
|
|
390
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
391
|
+
_fullOuterJoin(this: Query, ...args: any) {
|
|
392
|
+
return _join(this, 'FULL OUTER JOIN', args);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
type PickQueryForSelect<T extends QueryBase = QueryBase> = Pick<
|
|
397
|
+
T,
|
|
398
|
+
'table' | 'tableAlias' | 'selectable'
|
|
399
|
+
>;
|
|
400
|
+
|
|
401
|
+
type OnArgs<Q extends { selectable: SelectableBase }> =
|
|
402
|
+
| [leftColumn: keyof Q['selectable'], rightColumn: keyof Q['selectable']]
|
|
403
|
+
| [
|
|
404
|
+
leftColumn: keyof Q['selectable'],
|
|
405
|
+
op: string,
|
|
406
|
+
rightColumn: keyof Q['selectable'],
|
|
407
|
+
];
|
|
408
|
+
|
|
409
|
+
const makeOnItem = (
|
|
410
|
+
joinTo: QueryBase | string,
|
|
411
|
+
joinFrom: QueryBase | string,
|
|
412
|
+
args: OnArgs<QueryBase>,
|
|
413
|
+
) => {
|
|
414
|
+
return {
|
|
415
|
+
ON: {
|
|
416
|
+
joinTo,
|
|
417
|
+
joinFrom,
|
|
418
|
+
on: args,
|
|
419
|
+
},
|
|
420
|
+
};
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
export const pushQueryOn = <T extends QueryBase>(
|
|
424
|
+
q: T,
|
|
425
|
+
joinFrom: QueryBase | string,
|
|
426
|
+
joinTo: QueryBase | string,
|
|
427
|
+
...on: OnArgs<QueryBase>
|
|
428
|
+
): T => {
|
|
429
|
+
return pushQueryValue(q, 'and', makeOnItem(joinFrom, joinTo, on));
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
export const pushQueryOrOn: typeof pushQueryOn = (
|
|
433
|
+
q,
|
|
434
|
+
joinFrom,
|
|
435
|
+
joinTo,
|
|
436
|
+
...on
|
|
437
|
+
) => {
|
|
438
|
+
return pushQueryValue(q, 'or', [makeOnItem(joinFrom, joinTo, on)]);
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
export const addQueryOn: typeof pushQueryOrOn = (
|
|
442
|
+
q,
|
|
443
|
+
joinFrom,
|
|
444
|
+
joinTo,
|
|
445
|
+
...args
|
|
446
|
+
) => {
|
|
447
|
+
return pushQueryOn(q.clone() as typeof q, joinFrom, joinTo, ...args);
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
export const addQueryOrOn: typeof pushQueryOrOn = (
|
|
451
|
+
q,
|
|
452
|
+
joinFrom,
|
|
453
|
+
joinTo,
|
|
454
|
+
...args
|
|
455
|
+
) => {
|
|
456
|
+
return pushQueryOrOn(q.clone() as typeof q, joinFrom, joinTo, ...args);
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
type OnJsonPathEqualsArgs<T extends QueryBase> = [
|
|
460
|
+
leftColumn: keyof T['selectable'],
|
|
461
|
+
leftPath: string,
|
|
462
|
+
rightColumn: keyof T['selectable'],
|
|
463
|
+
rightPath: string,
|
|
464
|
+
];
|
|
465
|
+
|
|
466
|
+
export class OnQueryBuilder<
|
|
467
|
+
S extends QueryBase = QueryBase,
|
|
468
|
+
J extends PickQueryForSelect = PickQueryForSelect,
|
|
469
|
+
>
|
|
470
|
+
extends WhereQueryBuilder<
|
|
471
|
+
Omit<S, 'selectable'> & { selectable: S['selectable'] & J['selectable'] }
|
|
472
|
+
>
|
|
473
|
+
implements QueryBase
|
|
474
|
+
{
|
|
475
|
+
constructor(
|
|
476
|
+
q: { table?: string; query: { as?: string } },
|
|
477
|
+
public joinTo: QueryBase | string,
|
|
478
|
+
) {
|
|
479
|
+
super(q.table, q.query.as);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
on<T extends this>(this: T, ...args: OnArgs<T>): T {
|
|
483
|
+
return this.clone()._on(...args);
|
|
484
|
+
}
|
|
485
|
+
_on<T extends this>(this: T, ...args: OnArgs<T>): T {
|
|
486
|
+
return pushQueryOn(this, this.joinTo, this, ...args);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
orOn<T extends this>(this: T, ...args: OnArgs<T>): T {
|
|
490
|
+
return this.clone()._orOn(...args);
|
|
491
|
+
}
|
|
492
|
+
_orOn<T extends this>(this: T, ...args: OnArgs<T>): T {
|
|
493
|
+
return pushQueryOrOn(this, this.joinTo, this, ...args);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
onJsonPathEquals<T extends this>(
|
|
497
|
+
this: T,
|
|
498
|
+
...args: OnJsonPathEqualsArgs<T>
|
|
499
|
+
): T {
|
|
500
|
+
return this.clone()._onJsonPathEquals(...args);
|
|
501
|
+
}
|
|
502
|
+
_onJsonPathEquals<T extends this>(
|
|
503
|
+
this: T,
|
|
504
|
+
...args: OnJsonPathEqualsArgs<T>
|
|
505
|
+
): T {
|
|
506
|
+
return pushQueryValue(this, 'and', { ON: args });
|
|
507
|
+
}
|
|
508
|
+
}
|