relq 1.0.37 → 1.0.38
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/cjs/condition/condition-collector.cjs +35 -27
- package/dist/cjs/core/helpers/ConnectedAggregateBuilder.cjs +128 -0
- package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +53 -0
- package/dist/cjs/core/helpers/ConnectedCountBuilder.cjs +68 -0
- package/dist/cjs/core/helpers/ConnectedDeleteBuilder.cjs +33 -0
- package/dist/cjs/core/helpers/ConnectedInsertBuilder.cjs +56 -0
- package/dist/cjs/core/helpers/ConnectedQueryBuilder.cjs +200 -0
- package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +46 -0
- package/dist/cjs/core/helpers/ConnectedSelectBuilder.cjs +495 -0
- package/dist/cjs/core/helpers/ConnectedTransactionBuilder.cjs +44 -0
- package/dist/cjs/core/helpers/ConnectedUpdateBuilder.cjs +34 -0
- package/dist/cjs/core/helpers/PaginateBuilder.cjs +178 -0
- package/dist/cjs/core/helpers/ReturningExecutor.cjs +34 -0
- package/dist/cjs/core/helpers/index.cjs +30 -0
- package/dist/cjs/core/helpers/methods.cjs +10 -0
- package/dist/cjs/core/relq-client.cjs +35 -1157
- package/dist/cjs/core/types/core.types.cjs +2 -0
- package/dist/cjs/select/index.cjs +12 -1
- package/dist/cjs/select/join-builder.cjs +192 -0
- package/dist/cjs/select/join-condition-builder.cjs +189 -0
- package/dist/cjs/select/join-internals.cjs +5 -0
- package/dist/cjs/select/join-many-condition-builder.cjs +153 -0
- package/dist/cjs/select/select-builder.cjs +133 -10
- package/dist/cjs/select/table-proxy.cjs +99 -0
- package/dist/cjs/utils/fk-resolver.cjs +162 -0
- package/dist/cjs/utils/index.cjs +7 -1
- package/dist/esm/condition/condition-collector.js +35 -27
- package/dist/esm/core/helpers/ConnectedAggregateBuilder.js +124 -0
- package/dist/esm/core/helpers/ConnectedCTEBuilder.js +49 -0
- package/dist/esm/core/helpers/ConnectedCountBuilder.js +64 -0
- package/dist/esm/core/helpers/ConnectedDeleteBuilder.js +29 -0
- package/dist/esm/core/helpers/ConnectedInsertBuilder.js +52 -0
- package/dist/esm/core/helpers/ConnectedQueryBuilder.js +196 -0
- package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +42 -0
- package/dist/esm/core/helpers/ConnectedSelectBuilder.js +488 -0
- package/dist/esm/core/helpers/ConnectedTransactionBuilder.js +40 -0
- package/dist/esm/core/helpers/ConnectedUpdateBuilder.js +30 -0
- package/dist/esm/core/helpers/PaginateBuilder.js +174 -0
- package/dist/esm/core/helpers/ReturningExecutor.js +30 -0
- package/dist/esm/core/helpers/index.js +13 -0
- package/dist/esm/core/helpers/methods.js +6 -0
- package/dist/esm/core/relq-client.js +20 -1139
- package/dist/esm/core/types/core.types.js +1 -0
- package/dist/esm/select/index.js +3 -0
- package/dist/esm/select/join-builder.js +184 -0
- package/dist/esm/select/join-condition-builder.js +181 -0
- package/dist/esm/select/join-internals.js +2 -0
- package/dist/esm/select/join-many-condition-builder.js +145 -0
- package/dist/esm/select/select-builder.js +133 -10
- package/dist/esm/select/table-proxy.js +91 -0
- package/dist/esm/utils/fk-resolver.js +154 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/index.d.ts +1852 -966
- package/package.json +1 -1
|
@@ -178,6 +178,13 @@ class ConditionCollector {
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
exports.ConditionCollector = ConditionCollector;
|
|
181
|
+
function formatColumn(column) {
|
|
182
|
+
if (column.includes('.')) {
|
|
183
|
+
const parts = column.split('.');
|
|
184
|
+
return parts.map(p => pg_format_1.default.ident(p)).join('.');
|
|
185
|
+
}
|
|
186
|
+
return pg_format_1.default.ident(column);
|
|
187
|
+
}
|
|
181
188
|
function buildConditionSQL(condition) {
|
|
182
189
|
const { method, column, values } = condition;
|
|
183
190
|
if (method.startsWith('jsonb_')) {
|
|
@@ -198,73 +205,74 @@ function buildConditionSQL(condition) {
|
|
|
198
205
|
if (method.startsWith('network_')) {
|
|
199
206
|
return (0, network_condition_builder_1.buildNetworkConditionSQL)(condition);
|
|
200
207
|
}
|
|
208
|
+
const col = column ? formatColumn(column) : '';
|
|
201
209
|
switch (method) {
|
|
202
210
|
case 'equal':
|
|
203
211
|
if (Array.isArray(values) && values.length > 1) {
|
|
204
|
-
return (0, pg_format_1.default)('%
|
|
212
|
+
return `${col} IN ${(0, pg_format_1.default)('%L', values)}`;
|
|
205
213
|
}
|
|
206
|
-
return (0, pg_format_1.default)('%
|
|
214
|
+
return `${col} = ${(0, pg_format_1.default)('%L', Array.isArray(values) ? values[0] : values)}`;
|
|
207
215
|
case 'notEqual':
|
|
208
216
|
if (Array.isArray(values) && values.length > 1) {
|
|
209
|
-
return (0, pg_format_1.default)('%
|
|
217
|
+
return `${col} NOT IN ${(0, pg_format_1.default)('%L', values)}`;
|
|
210
218
|
}
|
|
211
|
-
return (0, pg_format_1.default)('%
|
|
219
|
+
return `${col} != ${(0, pg_format_1.default)('%L', Array.isArray(values) ? values[0] : values)}`;
|
|
212
220
|
case 'lessThan':
|
|
213
|
-
return (0, pg_format_1.default)('%
|
|
221
|
+
return `${col} < ${(0, pg_format_1.default)('%L', Array.isArray(values) ? values[0] : values)}`;
|
|
214
222
|
case 'lessThanEqual':
|
|
215
|
-
return (0, pg_format_1.default)('%
|
|
223
|
+
return `${col} <= ${(0, pg_format_1.default)('%L', Array.isArray(values) ? values[0] : values)}`;
|
|
216
224
|
case 'greaterThan':
|
|
217
|
-
return (0, pg_format_1.default)('%
|
|
225
|
+
return `${col} > ${(0, pg_format_1.default)('%L', Array.isArray(values) ? values[0] : values)}`;
|
|
218
226
|
case 'greaterThanEqual':
|
|
219
|
-
return (0, pg_format_1.default)('%
|
|
227
|
+
return `${col} >= ${(0, pg_format_1.default)('%L', Array.isArray(values) ? values[0] : values)}`;
|
|
220
228
|
case 'isNull':
|
|
221
|
-
return
|
|
229
|
+
return `${col} IS NULL`;
|
|
222
230
|
case 'isNotNull':
|
|
223
|
-
return
|
|
231
|
+
return `${col} IS NOT NULL`;
|
|
224
232
|
case 'between': {
|
|
225
233
|
const [start, end] = values;
|
|
226
|
-
return (0, pg_format_1.default)('%
|
|
234
|
+
return `${col} BETWEEN ${(0, pg_format_1.default)('%L', start)} AND ${(0, pg_format_1.default)('%L', end)}`;
|
|
227
235
|
}
|
|
228
236
|
case 'notBetween': {
|
|
229
237
|
const [notStart, notEnd] = values;
|
|
230
|
-
return (0, pg_format_1.default)('%
|
|
238
|
+
return `${col} NOT BETWEEN ${(0, pg_format_1.default)('%L', notStart)} AND ${(0, pg_format_1.default)('%L', notEnd)}`;
|
|
231
239
|
}
|
|
232
240
|
case 'startsWith':
|
|
233
|
-
return (0, pg_format_1.default)('%
|
|
241
|
+
return `${col} LIKE ${(0, pg_format_1.default)('%L', `${values}%`)}`;
|
|
234
242
|
case 'notStartsWith':
|
|
235
|
-
return (0, pg_format_1.default)('%
|
|
243
|
+
return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', `${values}%`)}`;
|
|
236
244
|
case 'endsWith':
|
|
237
|
-
return (0, pg_format_1.default)('%
|
|
245
|
+
return `${col} LIKE ${(0, pg_format_1.default)('%L', `%${values}`)}`;
|
|
238
246
|
case 'notEndsWith':
|
|
239
|
-
return (0, pg_format_1.default)('%
|
|
247
|
+
return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', `%${values}`)}`;
|
|
240
248
|
case 'contains':
|
|
241
|
-
return (0, pg_format_1.default)('%
|
|
249
|
+
return `${col} LIKE ${(0, pg_format_1.default)('%L', `%${values}%`)}`;
|
|
242
250
|
case 'notContains':
|
|
243
|
-
return (0, pg_format_1.default)('%
|
|
251
|
+
return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', `%${values}%`)}`;
|
|
244
252
|
case 'like':
|
|
245
|
-
return (0, pg_format_1.default)('%
|
|
253
|
+
return `${col} LIKE ${(0, pg_format_1.default)('%L', values)}`;
|
|
246
254
|
case 'notLike':
|
|
247
|
-
return (0, pg_format_1.default)('%
|
|
255
|
+
return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', values)}`;
|
|
248
256
|
case 'ilike':
|
|
249
|
-
return (0, pg_format_1.default)('%
|
|
257
|
+
return `${col} ILIKE ${(0, pg_format_1.default)('%L', values)}`;
|
|
250
258
|
case 'in': {
|
|
251
259
|
const valueList = Array.isArray(values) ? values : [values];
|
|
252
260
|
const formattedValues = valueList.map(v => (0, pg_format_1.default)('%L', v)).join(', ');
|
|
253
|
-
return
|
|
261
|
+
return `${col} IN (${formattedValues})`;
|
|
254
262
|
}
|
|
255
263
|
case 'notIn': {
|
|
256
264
|
const valueList = Array.isArray(values) ? values : [values];
|
|
257
265
|
const formattedValues = valueList.map(v => (0, pg_format_1.default)('%L', v)).join(', ');
|
|
258
|
-
return
|
|
266
|
+
return `${col} NOT IN (${formattedValues})`;
|
|
259
267
|
}
|
|
260
268
|
case 'exists':
|
|
261
|
-
return
|
|
269
|
+
return `EXISTS (${values})`;
|
|
262
270
|
case 'notExists':
|
|
263
|
-
return
|
|
271
|
+
return `NOT EXISTS (${values})`;
|
|
264
272
|
case 'search':
|
|
265
|
-
return (0, pg_format_1.default)('
|
|
273
|
+
return `to_tsvector(${col}) @@ plainto_tsquery(${(0, pg_format_1.default)('%L', values)})`;
|
|
266
274
|
case 'notSearch':
|
|
267
|
-
return
|
|
275
|
+
return `NOT (to_tsvector(${col}) @@ plainto_tsquery(${(0, pg_format_1.default)('%L', values)}))`;
|
|
268
276
|
case 'or': {
|
|
269
277
|
const orConditions = values;
|
|
270
278
|
return `(${orConditions.map(c => buildConditionSQL(c)).join(' OR ')})`;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectedAggregateBuilder = void 0;
|
|
4
|
+
const methods_1 = require("./methods.cjs");
|
|
5
|
+
class ConnectedAggregateBuilder {
|
|
6
|
+
builder;
|
|
7
|
+
relq;
|
|
8
|
+
tableName;
|
|
9
|
+
constructor(builder, relq, tableName) {
|
|
10
|
+
this.builder = builder;
|
|
11
|
+
this.relq = relq;
|
|
12
|
+
this.tableName = tableName;
|
|
13
|
+
}
|
|
14
|
+
mapColumn(column) {
|
|
15
|
+
const transformed = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, { [column]: true });
|
|
16
|
+
return Object.keys(transformed)[0] || column;
|
|
17
|
+
}
|
|
18
|
+
groupBy(...columns) {
|
|
19
|
+
const dbColumns = columns.map(col => this.mapColumn(col));
|
|
20
|
+
this.builder.groupBy(...dbColumns);
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
count(alias) {
|
|
24
|
+
this.builder.count(alias);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
countColumn(column, alias) {
|
|
28
|
+
this.builder.countColumn(this.mapColumn(column), alias);
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
countDistinct(column, alias) {
|
|
32
|
+
this.builder.countDistinct(this.mapColumn(column), alias);
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
sum(column, alias) {
|
|
36
|
+
this.builder.sum(this.mapColumn(column), alias);
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
avg(column, alias) {
|
|
40
|
+
this.builder.avg(this.mapColumn(column), alias);
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
min(column, alias) {
|
|
44
|
+
this.builder.min(this.mapColumn(column), alias);
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
max(column, alias) {
|
|
48
|
+
this.builder.max(this.mapColumn(column), alias);
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
arrayAgg(column, alias) {
|
|
52
|
+
this.builder.arrayAgg(this.mapColumn(column), alias);
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
stringAgg(column, delimiter, alias) {
|
|
56
|
+
this.builder.stringAgg(this.mapColumn(column), delimiter || ', ', alias);
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
jsonAgg(column, alias) {
|
|
60
|
+
this.builder.jsonAgg(this.mapColumn(column), alias);
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
jsonbAgg(column, alias) {
|
|
64
|
+
this.builder.jsonbAgg(this.mapColumn(column), alias);
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
boolAnd(column, alias) {
|
|
68
|
+
this.builder.boolAnd(this.mapColumn(column), alias);
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
boolOr(column, alias) {
|
|
72
|
+
this.builder.boolOr(this.mapColumn(column), alias);
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
where(callback) {
|
|
76
|
+
this.builder.where(callback);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
having(callback) {
|
|
80
|
+
this.builder.having(callback);
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
orderBy(column, direction = 'ASC') {
|
|
84
|
+
this.builder.orderBy(this.mapColumn(column), direction);
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
limit(count) {
|
|
88
|
+
this.builder.limit(count);
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
offset(count) {
|
|
92
|
+
this.builder.offset(count);
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
toString() {
|
|
96
|
+
return this.builder.toString();
|
|
97
|
+
}
|
|
98
|
+
async all() {
|
|
99
|
+
const sql = this.builder.toString();
|
|
100
|
+
const result = await this.relq[methods_1.INTERNAL].executeSelect(sql, this.tableName);
|
|
101
|
+
const numericAliases = this.builder.getNumericAliases();
|
|
102
|
+
if (numericAliases.length > 0) {
|
|
103
|
+
for (const row of result.data) {
|
|
104
|
+
for (const alias of numericAliases) {
|
|
105
|
+
if (alias in row && typeof row[alias] === 'string') {
|
|
106
|
+
row[alias] = Number(row[alias]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result.data;
|
|
112
|
+
}
|
|
113
|
+
async get() {
|
|
114
|
+
this.builder.limit(1);
|
|
115
|
+
const sql = this.builder.toString();
|
|
116
|
+
const result = await this.relq[methods_1.INTERNAL].executeSelectOne(sql, this.tableName);
|
|
117
|
+
const numericAliases = this.builder.getNumericAliases();
|
|
118
|
+
if (numericAliases.length > 0 && result.data) {
|
|
119
|
+
for (const alias of numericAliases) {
|
|
120
|
+
if (alias in result.data && typeof result.data[alias] === 'string') {
|
|
121
|
+
result.data[alias] = Number(result.data[alias]);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return result.data;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.ConnectedAggregateBuilder = ConnectedAggregateBuilder;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectedCTEBuilder = void 0;
|
|
4
|
+
const methods_1 = require("./methods.cjs");
|
|
5
|
+
class ConnectedCTEBuilder {
|
|
6
|
+
relq;
|
|
7
|
+
ctes = [];
|
|
8
|
+
constructor(relq) {
|
|
9
|
+
this.relq = relq;
|
|
10
|
+
}
|
|
11
|
+
with(name, query) {
|
|
12
|
+
const queryStr = typeof query === 'string' ? query : query.toString();
|
|
13
|
+
this.ctes.push({ name, query: queryStr });
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
withMaterialized(name, query) {
|
|
17
|
+
const queryStr = typeof query === 'string' ? query : query.toString();
|
|
18
|
+
this.ctes.push({ name, query: `MATERIALIZED (${queryStr})` });
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
async query(sql) {
|
|
22
|
+
const cteClause = this.buildCTEClause();
|
|
23
|
+
const fullSql = `${cteClause} ${sql}`;
|
|
24
|
+
const result = await this.relq[methods_1.INTERNAL].executeQuery(fullSql);
|
|
25
|
+
return {
|
|
26
|
+
data: result.result.rows,
|
|
27
|
+
rowCount: result.result.rowCount ?? 0
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async all(sql) {
|
|
31
|
+
const result = await this.query(sql);
|
|
32
|
+
return result.data;
|
|
33
|
+
}
|
|
34
|
+
async get(sql) {
|
|
35
|
+
const result = await this.query(sql);
|
|
36
|
+
return result.data[0] ?? null;
|
|
37
|
+
}
|
|
38
|
+
buildCTEClause() {
|
|
39
|
+
if (this.ctes.length === 0)
|
|
40
|
+
return '';
|
|
41
|
+
const cteStrings = this.ctes.map(cte => {
|
|
42
|
+
if (cte.query.startsWith('MATERIALIZED')) {
|
|
43
|
+
return `"${cte.name}" AS ${cte.query}`;
|
|
44
|
+
}
|
|
45
|
+
return `"${cte.name}" AS (${cte.query})`;
|
|
46
|
+
});
|
|
47
|
+
return `WITH ${cteStrings.join(', ')}`;
|
|
48
|
+
}
|
|
49
|
+
toSQL(mainQuery) {
|
|
50
|
+
return `${this.buildCTEClause()} ${mainQuery}`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.ConnectedCTEBuilder = ConnectedCTEBuilder;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectedCountBuilder = void 0;
|
|
4
|
+
const methods_1 = require("./methods.cjs");
|
|
5
|
+
class ConnectedCountBuilder {
|
|
6
|
+
builder;
|
|
7
|
+
relq;
|
|
8
|
+
tableName;
|
|
9
|
+
groupNames = [];
|
|
10
|
+
constructor(builder, relq, tableName) {
|
|
11
|
+
this.builder = builder;
|
|
12
|
+
this.relq = relq;
|
|
13
|
+
this.tableName = tableName;
|
|
14
|
+
}
|
|
15
|
+
group(name, callback, options) {
|
|
16
|
+
this.groupNames.push(name);
|
|
17
|
+
this.builder.group(name, (q) => {
|
|
18
|
+
const wrapped = this.wrapConditionBuilder(q);
|
|
19
|
+
return callback(wrapped);
|
|
20
|
+
}, options);
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
where(callback) {
|
|
24
|
+
this.builder.where((q) => {
|
|
25
|
+
const wrapped = this.wrapConditionBuilder(q);
|
|
26
|
+
return callback(wrapped);
|
|
27
|
+
});
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
wrapConditionBuilder(originalBuilder) {
|
|
31
|
+
const relq = this.relq;
|
|
32
|
+
const tableName = this.tableName;
|
|
33
|
+
return new Proxy(originalBuilder, {
|
|
34
|
+
get(target, prop) {
|
|
35
|
+
const original = target[prop];
|
|
36
|
+
if (typeof original === 'function') {
|
|
37
|
+
return function (column, ...args) {
|
|
38
|
+
const transformed = relq[methods_1.INTERNAL].transformToDbColumns(tableName, { [column]: true });
|
|
39
|
+
const dbColumn = Object.keys(transformed)[0] || column;
|
|
40
|
+
return original.call(target, dbColumn, ...args);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return original;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
toString() {
|
|
48
|
+
return this.builder.toString();
|
|
49
|
+
}
|
|
50
|
+
async execute() {
|
|
51
|
+
const sql = this.builder.toString();
|
|
52
|
+
return this.relq[methods_1.INTERNAL].executeCount(sql);
|
|
53
|
+
}
|
|
54
|
+
async get() {
|
|
55
|
+
const sql = this.builder.toString();
|
|
56
|
+
const result = await this.relq[methods_1.INTERNAL].executeQuery(sql);
|
|
57
|
+
const row = result.result.rows[0];
|
|
58
|
+
if (this.groupNames.length === 0) {
|
|
59
|
+
return (Number(row?.count) ?? 0);
|
|
60
|
+
}
|
|
61
|
+
const counts = {};
|
|
62
|
+
for (const name of this.groupNames) {
|
|
63
|
+
counts[name] = Number(row?.[name] ?? 0);
|
|
64
|
+
}
|
|
65
|
+
return counts;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.ConnectedCountBuilder = ConnectedCountBuilder;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectedDeleteBuilder = void 0;
|
|
4
|
+
const methods_1 = require("./methods.cjs");
|
|
5
|
+
const ReturningExecutor_1 = require("./ReturningExecutor.cjs");
|
|
6
|
+
class ConnectedDeleteBuilder {
|
|
7
|
+
builder;
|
|
8
|
+
relq;
|
|
9
|
+
constructor(builder, relq) {
|
|
10
|
+
this.builder = builder;
|
|
11
|
+
this.relq = relq;
|
|
12
|
+
}
|
|
13
|
+
where(callback) {
|
|
14
|
+
this.builder.where(callback);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
toString() {
|
|
18
|
+
return this.builder.toString();
|
|
19
|
+
}
|
|
20
|
+
async run(withMetadata) {
|
|
21
|
+
const sql = this.builder.toString();
|
|
22
|
+
const result = await this.relq[methods_1.INTERNAL].executeRun(sql);
|
|
23
|
+
if (withMetadata) {
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
return result.metadata.rowCount ?? 0;
|
|
27
|
+
}
|
|
28
|
+
returning(columns) {
|
|
29
|
+
this.builder.returning(columns);
|
|
30
|
+
return new ReturningExecutor_1.ReturningExecutor(this.builder, this.relq);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.ConnectedDeleteBuilder = ConnectedDeleteBuilder;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectedInsertBuilder = void 0;
|
|
4
|
+
const methods_1 = require("./methods.cjs");
|
|
5
|
+
const ReturningExecutor_1 = require("./ReturningExecutor.cjs");
|
|
6
|
+
class ConnectedInsertBuilder {
|
|
7
|
+
builder;
|
|
8
|
+
relq;
|
|
9
|
+
constructor(builder, relq) {
|
|
10
|
+
this.builder = builder;
|
|
11
|
+
this.relq = relq;
|
|
12
|
+
}
|
|
13
|
+
addRow(row) {
|
|
14
|
+
this.builder.addRow(row);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
addRows(rows) {
|
|
18
|
+
this.builder.addRows(rows);
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
clear() {
|
|
22
|
+
this.builder.clear();
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
get total() {
|
|
26
|
+
return this.builder.total;
|
|
27
|
+
}
|
|
28
|
+
onConflict(columns, callback) {
|
|
29
|
+
const cols = Array.isArray(columns) ? columns : [columns];
|
|
30
|
+
this.builder.onConflict(cols, (conflictBuilder) => {
|
|
31
|
+
callback(conflictBuilder);
|
|
32
|
+
});
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
toString() {
|
|
36
|
+
return this.builder.toString();
|
|
37
|
+
}
|
|
38
|
+
async run(withMetadata) {
|
|
39
|
+
(0, methods_1.debugLog)(this.relq[methods_1.INTERNAL]?.config, `ConnectedInsertBuilder.run called for table: ${this.builder.tableName}`);
|
|
40
|
+
const internalRelq = this.relq[methods_1.INTERNAL];
|
|
41
|
+
for (const row of this.builder.insertData) {
|
|
42
|
+
internalRelq.validateData(this.builder.tableName, row, 'insert');
|
|
43
|
+
}
|
|
44
|
+
const sql = this.builder.toString();
|
|
45
|
+
const result = await internalRelq.executeRun(sql);
|
|
46
|
+
if (withMetadata) {
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
return result.metadata.rowCount ?? 0;
|
|
50
|
+
}
|
|
51
|
+
returning(columns) {
|
|
52
|
+
this.builder.returning(columns);
|
|
53
|
+
return new ReturningExecutor_1.ReturningExecutor(this.builder, this.relq);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.ConnectedInsertBuilder = ConnectedInsertBuilder;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectedQueryBuilder = void 0;
|
|
4
|
+
const count_builder_1 = require("../../count/count-builder.cjs");
|
|
5
|
+
const delete_builder_1 = require("../../delete/delete-builder.cjs");
|
|
6
|
+
const insert_builder_1 = require("../../insert/insert-builder.cjs");
|
|
7
|
+
const aggregate_builder_1 = require("../../select/aggregate-builder.cjs");
|
|
8
|
+
const select_builder_1 = require("../../select/select-builder.cjs");
|
|
9
|
+
const update_builder_1 = require("../../update/update-builder.cjs");
|
|
10
|
+
const ConnectedAggregateBuilder_1 = require("./ConnectedAggregateBuilder.cjs");
|
|
11
|
+
const ConnectedCountBuilder_1 = require("./ConnectedCountBuilder.cjs");
|
|
12
|
+
const ConnectedDeleteBuilder_1 = require("./ConnectedDeleteBuilder.cjs");
|
|
13
|
+
const ConnectedInsertBuilder_1 = require("./ConnectedInsertBuilder.cjs");
|
|
14
|
+
const ConnectedSelectBuilder_1 = require("./ConnectedSelectBuilder.cjs");
|
|
15
|
+
const ConnectedUpdateBuilder_1 = require("./ConnectedUpdateBuilder.cjs");
|
|
16
|
+
const methods_1 = require("./methods.cjs");
|
|
17
|
+
const PaginateBuilder_1 = require("./PaginateBuilder.cjs");
|
|
18
|
+
class ConnectedQueryBuilder {
|
|
19
|
+
tableName;
|
|
20
|
+
relq;
|
|
21
|
+
schemaKey;
|
|
22
|
+
constructor(tableName, relq, schemaKey) {
|
|
23
|
+
this.tableName = tableName;
|
|
24
|
+
this.relq = relq;
|
|
25
|
+
this.schemaKey = schemaKey;
|
|
26
|
+
}
|
|
27
|
+
select(columns) {
|
|
28
|
+
let dbColumns = columns;
|
|
29
|
+
if (columns && this.relq[methods_1.INTERNAL].hasColumnMapping()) {
|
|
30
|
+
if (Array.isArray(columns)) {
|
|
31
|
+
dbColumns = columns.map(col => {
|
|
32
|
+
if (Array.isArray(col)) {
|
|
33
|
+
const transformed = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, { [col[0]]: true });
|
|
34
|
+
return [Object.keys(transformed)[0], col[1]];
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const transformed = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, { [col]: true });
|
|
38
|
+
return Object.keys(transformed)[0];
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const transformed = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, { [columns]: true });
|
|
44
|
+
dbColumns = Object.keys(transformed)[0];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const builder = new select_builder_1.SelectBuilder(this.tableName, dbColumns);
|
|
48
|
+
return new ConnectedSelectBuilder_1.ConnectedSelectBuilder(builder, this.relq, this.tableName, columns, this.schemaKey);
|
|
49
|
+
}
|
|
50
|
+
insert(data) {
|
|
51
|
+
const builder = new insert_builder_1.InsertBuilder(this.tableName, data);
|
|
52
|
+
return new ConnectedInsertBuilder_1.ConnectedInsertBuilder(builder, this.relq);
|
|
53
|
+
}
|
|
54
|
+
update(data) {
|
|
55
|
+
const builder = new update_builder_1.UpdateBuilder(this.tableName, data);
|
|
56
|
+
return new ConnectedUpdateBuilder_1.ConnectedUpdateBuilder(builder, this.relq);
|
|
57
|
+
}
|
|
58
|
+
delete() {
|
|
59
|
+
const builder = new delete_builder_1.DeleteBuilder(this.tableName);
|
|
60
|
+
return new ConnectedDeleteBuilder_1.ConnectedDeleteBuilder(builder, this.relq);
|
|
61
|
+
}
|
|
62
|
+
count() {
|
|
63
|
+
const builder = new count_builder_1.CountBuilder(this.tableName);
|
|
64
|
+
return new ConnectedCountBuilder_1.ConnectedCountBuilder(builder, this.relq, this.tableName);
|
|
65
|
+
}
|
|
66
|
+
aggregate() {
|
|
67
|
+
const builder = new aggregate_builder_1.AggregateQueryBuilder(this.tableName);
|
|
68
|
+
return new ConnectedAggregateBuilder_1.ConnectedAggregateBuilder(builder, this.relq, this.tableName);
|
|
69
|
+
}
|
|
70
|
+
async findById(id) {
|
|
71
|
+
const pkColumn = this.getPrimaryKeyColumn();
|
|
72
|
+
const dbColumn = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, { [pkColumn]: id });
|
|
73
|
+
const dbColName = Object.keys(dbColumn)[0];
|
|
74
|
+
const builder = new select_builder_1.SelectBuilder(this.tableName, ['*']);
|
|
75
|
+
builder.where(q => q.equal(dbColName, id));
|
|
76
|
+
builder.limit(1);
|
|
77
|
+
const sql = builder.toString();
|
|
78
|
+
const result = await this.relq[methods_1.INTERNAL].executeSelectOne(sql, this.tableName);
|
|
79
|
+
return result.data;
|
|
80
|
+
}
|
|
81
|
+
async findOne(filter) {
|
|
82
|
+
const builder = new select_builder_1.SelectBuilder(this.tableName, ['*']);
|
|
83
|
+
const dbFilter = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, filter);
|
|
84
|
+
builder.where(q => {
|
|
85
|
+
for (const [col, val] of Object.entries(dbFilter)) {
|
|
86
|
+
q.equal(col, val);
|
|
87
|
+
}
|
|
88
|
+
return q;
|
|
89
|
+
});
|
|
90
|
+
builder.limit(1);
|
|
91
|
+
const sql = builder.toString();
|
|
92
|
+
const result = await this.relq[methods_1.INTERNAL].executeSelectOne(sql, this.tableName);
|
|
93
|
+
return result.data;
|
|
94
|
+
}
|
|
95
|
+
async findMany(filter) {
|
|
96
|
+
const builder = new select_builder_1.SelectBuilder(this.tableName, ['*']);
|
|
97
|
+
const dbFilter = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, filter);
|
|
98
|
+
builder.where(q => {
|
|
99
|
+
for (const [col, val] of Object.entries(dbFilter)) {
|
|
100
|
+
q.equal(col, val);
|
|
101
|
+
}
|
|
102
|
+
return q;
|
|
103
|
+
});
|
|
104
|
+
const sql = builder.toString();
|
|
105
|
+
const result = await this.relq[methods_1.INTERNAL].executeSelect(sql, this.tableName);
|
|
106
|
+
return result.data;
|
|
107
|
+
}
|
|
108
|
+
async exists(filter) {
|
|
109
|
+
const builder = new count_builder_1.CountBuilder(this.tableName);
|
|
110
|
+
const dbFilter = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, filter);
|
|
111
|
+
builder.where(q => {
|
|
112
|
+
for (const [col, val] of Object.entries(dbFilter)) {
|
|
113
|
+
q.equal(col, val);
|
|
114
|
+
}
|
|
115
|
+
return q;
|
|
116
|
+
});
|
|
117
|
+
const sql = builder.toString();
|
|
118
|
+
const result = await this.relq[methods_1.INTERNAL].executeCount(sql);
|
|
119
|
+
return result.count > 0;
|
|
120
|
+
}
|
|
121
|
+
async upsert(options) {
|
|
122
|
+
const dbCreate = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, options.create);
|
|
123
|
+
const dbUpdate = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, options.update);
|
|
124
|
+
const dbWhere = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, options.where);
|
|
125
|
+
const conflictColumn = Object.keys(dbWhere)[0];
|
|
126
|
+
const builder = new insert_builder_1.InsertBuilder(this.tableName, dbCreate);
|
|
127
|
+
builder.onConflict(conflictColumn, cb => cb.doUpdate(dbUpdate));
|
|
128
|
+
builder.returning(['*']);
|
|
129
|
+
const sql = builder.toString();
|
|
130
|
+
const result = await this.relq[methods_1.INTERNAL].executeQuery(sql);
|
|
131
|
+
const transformed = this.relq[methods_1.INTERNAL].transformResultsFromDb(this.tableName, result.result.rows);
|
|
132
|
+
return transformed[0];
|
|
133
|
+
}
|
|
134
|
+
async insertMany(rows) {
|
|
135
|
+
if (rows.length === 0)
|
|
136
|
+
return [];
|
|
137
|
+
const firstDbRow = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, rows[0]);
|
|
138
|
+
const builder = new insert_builder_1.InsertBuilder(this.tableName, firstDbRow);
|
|
139
|
+
for (let i = 1; i < rows.length; i++) {
|
|
140
|
+
const dbRow = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, rows[i]);
|
|
141
|
+
builder.addRow(dbRow);
|
|
142
|
+
}
|
|
143
|
+
builder.returning(['*']);
|
|
144
|
+
const sql = builder.toString();
|
|
145
|
+
const result = await this.relq[methods_1.INTERNAL].executeQuery(sql);
|
|
146
|
+
return this.relq[methods_1.INTERNAL].transformResultsFromDb(this.tableName, result.result.rows);
|
|
147
|
+
}
|
|
148
|
+
paginate(options = {}) {
|
|
149
|
+
return new PaginateBuilder_1.PaginateBuilder(this.relq, this.tableName, options.columns, options.where, options.orderBy);
|
|
150
|
+
}
|
|
151
|
+
async softDelete(filter) {
|
|
152
|
+
const dbFilter = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, filter);
|
|
153
|
+
const builder = new update_builder_1.UpdateBuilder(this.tableName, { deleted_at: new Date() });
|
|
154
|
+
builder.where(q => {
|
|
155
|
+
for (const [col, val] of Object.entries(dbFilter)) {
|
|
156
|
+
q.equal(col, val);
|
|
157
|
+
}
|
|
158
|
+
return q;
|
|
159
|
+
});
|
|
160
|
+
builder.returning(['*']);
|
|
161
|
+
const sql = builder.toString();
|
|
162
|
+
const result = await this.relq[methods_1.INTERNAL].executeQuery(sql);
|
|
163
|
+
if (result.result.rows.length === 0)
|
|
164
|
+
return null;
|
|
165
|
+
const transformed = this.relq[methods_1.INTERNAL].transformResultsFromDb(this.tableName, result.result.rows);
|
|
166
|
+
return transformed[0];
|
|
167
|
+
}
|
|
168
|
+
async restore(filter) {
|
|
169
|
+
const dbFilter = this.relq[methods_1.INTERNAL].transformToDbColumns(this.tableName, filter);
|
|
170
|
+
const builder = new update_builder_1.UpdateBuilder(this.tableName, { deleted_at: null });
|
|
171
|
+
builder.where(q => {
|
|
172
|
+
for (const [col, val] of Object.entries(dbFilter)) {
|
|
173
|
+
q.equal(col, val);
|
|
174
|
+
}
|
|
175
|
+
return q;
|
|
176
|
+
});
|
|
177
|
+
builder.returning(['*']);
|
|
178
|
+
const sql = builder.toString();
|
|
179
|
+
const result = await this.relq[methods_1.INTERNAL].executeQuery(sql);
|
|
180
|
+
if (result.result.rows.length === 0)
|
|
181
|
+
return null;
|
|
182
|
+
const transformed = this.relq[methods_1.INTERNAL].transformResultsFromDb(this.tableName, result.result.rows);
|
|
183
|
+
return transformed[0];
|
|
184
|
+
}
|
|
185
|
+
getPrimaryKeyColumn() {
|
|
186
|
+
const schema = this.relq.schema;
|
|
187
|
+
if (schema && schema[this.tableName]) {
|
|
188
|
+
const tableSchema = schema[this.tableName];
|
|
189
|
+
for (const [colName, colDef] of Object.entries(tableSchema)) {
|
|
190
|
+
if (colDef && typeof colDef === 'object' &&
|
|
191
|
+
('$primaryKey' in colDef ||
|
|
192
|
+
colDef.config?.$primaryKey === true)) {
|
|
193
|
+
return colName;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return 'id';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.ConnectedQueryBuilder = ConnectedQueryBuilder;
|