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.
Files changed (54) hide show
  1. package/dist/cjs/condition/condition-collector.cjs +35 -27
  2. package/dist/cjs/core/helpers/ConnectedAggregateBuilder.cjs +128 -0
  3. package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +53 -0
  4. package/dist/cjs/core/helpers/ConnectedCountBuilder.cjs +68 -0
  5. package/dist/cjs/core/helpers/ConnectedDeleteBuilder.cjs +33 -0
  6. package/dist/cjs/core/helpers/ConnectedInsertBuilder.cjs +56 -0
  7. package/dist/cjs/core/helpers/ConnectedQueryBuilder.cjs +200 -0
  8. package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +46 -0
  9. package/dist/cjs/core/helpers/ConnectedSelectBuilder.cjs +495 -0
  10. package/dist/cjs/core/helpers/ConnectedTransactionBuilder.cjs +44 -0
  11. package/dist/cjs/core/helpers/ConnectedUpdateBuilder.cjs +34 -0
  12. package/dist/cjs/core/helpers/PaginateBuilder.cjs +178 -0
  13. package/dist/cjs/core/helpers/ReturningExecutor.cjs +34 -0
  14. package/dist/cjs/core/helpers/index.cjs +30 -0
  15. package/dist/cjs/core/helpers/methods.cjs +10 -0
  16. package/dist/cjs/core/relq-client.cjs +35 -1157
  17. package/dist/cjs/core/types/core.types.cjs +2 -0
  18. package/dist/cjs/select/index.cjs +12 -1
  19. package/dist/cjs/select/join-builder.cjs +192 -0
  20. package/dist/cjs/select/join-condition-builder.cjs +189 -0
  21. package/dist/cjs/select/join-internals.cjs +5 -0
  22. package/dist/cjs/select/join-many-condition-builder.cjs +153 -0
  23. package/dist/cjs/select/select-builder.cjs +133 -10
  24. package/dist/cjs/select/table-proxy.cjs +99 -0
  25. package/dist/cjs/utils/fk-resolver.cjs +162 -0
  26. package/dist/cjs/utils/index.cjs +7 -1
  27. package/dist/esm/condition/condition-collector.js +35 -27
  28. package/dist/esm/core/helpers/ConnectedAggregateBuilder.js +124 -0
  29. package/dist/esm/core/helpers/ConnectedCTEBuilder.js +49 -0
  30. package/dist/esm/core/helpers/ConnectedCountBuilder.js +64 -0
  31. package/dist/esm/core/helpers/ConnectedDeleteBuilder.js +29 -0
  32. package/dist/esm/core/helpers/ConnectedInsertBuilder.js +52 -0
  33. package/dist/esm/core/helpers/ConnectedQueryBuilder.js +196 -0
  34. package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +42 -0
  35. package/dist/esm/core/helpers/ConnectedSelectBuilder.js +488 -0
  36. package/dist/esm/core/helpers/ConnectedTransactionBuilder.js +40 -0
  37. package/dist/esm/core/helpers/ConnectedUpdateBuilder.js +30 -0
  38. package/dist/esm/core/helpers/PaginateBuilder.js +174 -0
  39. package/dist/esm/core/helpers/ReturningExecutor.js +30 -0
  40. package/dist/esm/core/helpers/index.js +13 -0
  41. package/dist/esm/core/helpers/methods.js +6 -0
  42. package/dist/esm/core/relq-client.js +20 -1139
  43. package/dist/esm/core/types/core.types.js +1 -0
  44. package/dist/esm/select/index.js +3 -0
  45. package/dist/esm/select/join-builder.js +184 -0
  46. package/dist/esm/select/join-condition-builder.js +181 -0
  47. package/dist/esm/select/join-internals.js +2 -0
  48. package/dist/esm/select/join-many-condition-builder.js +145 -0
  49. package/dist/esm/select/select-builder.js +133 -10
  50. package/dist/esm/select/table-proxy.js +91 -0
  51. package/dist/esm/utils/fk-resolver.js +154 -0
  52. package/dist/esm/utils/index.js +1 -0
  53. package/dist/index.d.ts +1852 -966
  54. 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)('%I IN %L', column, values);
212
+ return `${col} IN ${(0, pg_format_1.default)('%L', values)}`;
205
213
  }
206
- return (0, pg_format_1.default)('%I = %L', column, Array.isArray(values) ? values[0] : values);
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)('%I NOT IN %L', column, values);
217
+ return `${col} NOT IN ${(0, pg_format_1.default)('%L', values)}`;
210
218
  }
211
- return (0, pg_format_1.default)('%I != %L', column, Array.isArray(values) ? values[0] : values);
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)('%I < %L', column, Array.isArray(values) ? values[0] : values);
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)('%I <= %L', column, Array.isArray(values) ? values[0] : values);
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)('%I > %L', column, Array.isArray(values) ? values[0] : values);
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)('%I >= %L', column, Array.isArray(values) ? values[0] : values);
227
+ return `${col} >= ${(0, pg_format_1.default)('%L', Array.isArray(values) ? values[0] : values)}`;
220
228
  case 'isNull':
221
- return (0, pg_format_1.default)('%I IS NULL', column);
229
+ return `${col} IS NULL`;
222
230
  case 'isNotNull':
223
- return (0, pg_format_1.default)('%I IS NOT NULL', column);
231
+ return `${col} IS NOT NULL`;
224
232
  case 'between': {
225
233
  const [start, end] = values;
226
- return (0, pg_format_1.default)('%I BETWEEN %L AND %L', column, start, end);
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)('%I NOT BETWEEN %L AND %L', column, notStart, notEnd);
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)('%I LIKE %L', column, `${values}%`);
241
+ return `${col} LIKE ${(0, pg_format_1.default)('%L', `${values}%`)}`;
234
242
  case 'notStartsWith':
235
- return (0, pg_format_1.default)('%I NOT LIKE %L', column, `${values}%`);
243
+ return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', `${values}%`)}`;
236
244
  case 'endsWith':
237
- return (0, pg_format_1.default)('%I LIKE %L', column, `%${values}`);
245
+ return `${col} LIKE ${(0, pg_format_1.default)('%L', `%${values}`)}`;
238
246
  case 'notEndsWith':
239
- return (0, pg_format_1.default)('%I NOT LIKE %L', column, `%${values}`);
247
+ return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', `%${values}`)}`;
240
248
  case 'contains':
241
- return (0, pg_format_1.default)('%I LIKE %L', column, `%${values}%`);
249
+ return `${col} LIKE ${(0, pg_format_1.default)('%L', `%${values}%`)}`;
242
250
  case 'notContains':
243
- return (0, pg_format_1.default)('%I NOT LIKE %L', column, `%${values}%`);
251
+ return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', `%${values}%`)}`;
244
252
  case 'like':
245
- return (0, pg_format_1.default)('%I LIKE %L', column, values);
253
+ return `${col} LIKE ${(0, pg_format_1.default)('%L', values)}`;
246
254
  case 'notLike':
247
- return (0, pg_format_1.default)('%I NOT LIKE %L', column, values);
255
+ return `${col} NOT LIKE ${(0, pg_format_1.default)('%L', values)}`;
248
256
  case 'ilike':
249
- return (0, pg_format_1.default)('%I ILIKE %L', column, values);
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 (0, pg_format_1.default)('%I IN (%s)', column, formattedValues);
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 (0, pg_format_1.default)('%I NOT IN (%s)', column, formattedValues);
266
+ return `${col} NOT IN (${formattedValues})`;
259
267
  }
260
268
  case 'exists':
261
- return (0, pg_format_1.default)('EXISTS (%s)', values);
269
+ return `EXISTS (${values})`;
262
270
  case 'notExists':
263
- return (0, pg_format_1.default)('NOT EXISTS (%s)', values);
271
+ return `NOT EXISTS (${values})`;
264
272
  case 'search':
265
- return (0, pg_format_1.default)('to_tsvector(%I) @@ plainto_tsquery(%L)', column, values);
273
+ return `to_tsvector(${col}) @@ plainto_tsquery(${(0, pg_format_1.default)('%L', values)})`;
266
274
  case 'notSearch':
267
- return (0, pg_format_1.default)('NOT (to_tsvector(%I) @@ plainto_tsquery(%L))', column, values);
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;