@relq/orm 0.1.0

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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +236 -0
  3. package/dist/cjs/__test-types.cjs +17 -0
  4. package/dist/cjs/addon/cursor.cjs +1473 -0
  5. package/dist/cjs/addon/pg.cjs +4969 -0
  6. package/dist/cjs/cache/index.cjs +9 -0
  7. package/dist/cjs/cache/query-cache.cjs +311 -0
  8. package/dist/cjs/condition/array-condition-builder.cjs +527 -0
  9. package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
  10. package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
  11. package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
  12. package/dist/cjs/condition/base-condition-builder.cjs +2 -0
  13. package/dist/cjs/condition/condition-collector.cjs +461 -0
  14. package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
  15. package/dist/cjs/condition/geometric-condition-builder.cjs +228 -0
  16. package/dist/cjs/condition/index.cjs +29 -0
  17. package/dist/cjs/condition/jsonb-condition-builder.cjs +448 -0
  18. package/dist/cjs/condition/network-condition-builder.cjs +237 -0
  19. package/dist/cjs/condition/postgis-condition-builder.cjs +188 -0
  20. package/dist/cjs/condition/range-condition-builder.cjs +98 -0
  21. package/dist/cjs/core/helpers/ConnectedAggregateBuilder.cjs +132 -0
  22. package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +53 -0
  23. package/dist/cjs/core/helpers/ConnectedCountBuilder.cjs +73 -0
  24. package/dist/cjs/core/helpers/ConnectedDeleteBuilder.cjs +65 -0
  25. package/dist/cjs/core/helpers/ConnectedInsertBuilder.cjs +112 -0
  26. package/dist/cjs/core/helpers/ConnectedInsertFromSelectBuilder.cjs +66 -0
  27. package/dist/cjs/core/helpers/ConnectedQueryBuilder.cjs +146 -0
  28. package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +46 -0
  29. package/dist/cjs/core/helpers/ConnectedSelectBuilder.cjs +331 -0
  30. package/dist/cjs/core/helpers/ConnectedTransactionBuilder.cjs +105 -0
  31. package/dist/cjs/core/helpers/ConnectedUpdateBuilder.cjs +79 -0
  32. package/dist/cjs/core/helpers/PaginateBuilder.cjs +178 -0
  33. package/dist/cjs/core/helpers/ReturningExecutor.cjs +70 -0
  34. package/dist/cjs/core/helpers/capability-guard.cjs +10 -0
  35. package/dist/cjs/core/helpers/index.cjs +31 -0
  36. package/dist/cjs/core/helpers/methods.cjs +10 -0
  37. package/dist/cjs/core/helpers/query-convenience.cjs +238 -0
  38. package/dist/cjs/core/helpers/select-joins.cjs +251 -0
  39. package/dist/cjs/core/helpers/select-pagination.cjs +233 -0
  40. package/dist/cjs/core/helpers/select-types.cjs +2 -0
  41. package/dist/cjs/core/pg-family/cockroachdb-client/capabilities.cjs +31 -0
  42. package/dist/cjs/core/pg-family/cockroachdb-client/index.cjs +7 -0
  43. package/dist/cjs/core/pg-family/cockroachdb-client/relq-cockroach.cjs +16 -0
  44. package/dist/cjs/core/pg-family/dsql-client/capabilities.cjs +31 -0
  45. package/dist/cjs/core/pg-family/dsql-client/index.cjs +7 -0
  46. package/dist/cjs/core/pg-family/dsql-client/relq-dsql.cjs +16 -0
  47. package/dist/cjs/core/pg-family/index.cjs +19 -0
  48. package/dist/cjs/core/pg-family/nile-client/capabilities.cjs +31 -0
  49. package/dist/cjs/core/pg-family/nile-client/index.cjs +7 -0
  50. package/dist/cjs/core/pg-family/nile-client/relq-nile.cjs +36 -0
  51. package/dist/cjs/core/pg-family/nile-client/tenant-context.cjs +44 -0
  52. package/dist/cjs/core/pg-family/pg-client/capabilities.cjs +31 -0
  53. package/dist/cjs/core/pg-family/pg-client/index.cjs +7 -0
  54. package/dist/cjs/core/pg-family/pg-client/relq-postgres.cjs +43 -0
  55. package/dist/cjs/core/pg-family/shared/pg-base.cjs +385 -0
  56. package/dist/cjs/core/pg-family/shared/pg-dialect.cjs +67 -0
  57. package/dist/cjs/core/pg-family/shared/pg-error-parser.cjs +34 -0
  58. package/dist/cjs/core/pg-family/shared/pg-type-coercion.cjs +14 -0
  59. package/dist/cjs/core/relq-base.cjs +307 -0
  60. package/dist/cjs/core/relq-client.cjs +56 -0
  61. package/dist/cjs/core/shared/cleanup.cjs +36 -0
  62. package/dist/cjs/core/shared/column-mapping.cjs +97 -0
  63. package/dist/cjs/core/shared/errors.cjs +17 -0
  64. package/dist/cjs/core/shared/index.cjs +24 -0
  65. package/dist/cjs/core/shared/table-accessor.cjs +22 -0
  66. package/dist/cjs/core/shared/transform.cjs +35 -0
  67. package/dist/cjs/core/shared/types.cjs +2 -0
  68. package/dist/cjs/core/shared/validation.cjs +140 -0
  69. package/dist/cjs/core/types/core.types.cjs +2 -0
  70. package/dist/cjs/count/count-builder.cjs +88 -0
  71. package/dist/cjs/count/index.cjs +5 -0
  72. package/dist/cjs/delete/delete-builder.cjs +176 -0
  73. package/dist/cjs/delete/index.cjs +5 -0
  74. package/dist/cjs/explain/explain-builder.cjs +99 -0
  75. package/dist/cjs/explain/index.cjs +5 -0
  76. package/dist/cjs/index.cjs +26 -0
  77. package/dist/cjs/insert/conflict-builder.cjs +213 -0
  78. package/dist/cjs/insert/index.cjs +5 -0
  79. package/dist/cjs/insert/insert-builder.cjs +320 -0
  80. package/dist/cjs/insert/insert-from-select-builder.cjs +86 -0
  81. package/dist/cjs/pubsub/index.cjs +7 -0
  82. package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
  83. package/dist/cjs/pubsub/listener-connection.cjs +180 -0
  84. package/dist/cjs/raw/index.cjs +8 -0
  85. package/dist/cjs/raw/raw-query-builder.cjs +27 -0
  86. package/dist/cjs/raw/sql-template.cjs +73 -0
  87. package/dist/cjs/select/aggregate-builder.cjs +179 -0
  88. package/dist/cjs/select/index.cjs +16 -0
  89. package/dist/cjs/select/join-builder.cjs +192 -0
  90. package/dist/cjs/select/join-condition-builder.cjs +189 -0
  91. package/dist/cjs/select/join-internals.cjs +5 -0
  92. package/dist/cjs/select/join-many-condition-builder.cjs +159 -0
  93. package/dist/cjs/select/scalar-query-builder.cjs +134 -0
  94. package/dist/cjs/select/scalar-select-builder.cjs +78 -0
  95. package/dist/cjs/select/select-builder.cjs +426 -0
  96. package/dist/cjs/select/sql-expression.cjs +38 -0
  97. package/dist/cjs/select/table-proxy.cjs +99 -0
  98. package/dist/cjs/shared/aws-dsql.cjs +181 -0
  99. package/dist/cjs/shared/errors/relq-errors.cjs +361 -0
  100. package/dist/cjs/shared/pg-format.cjs +383 -0
  101. package/dist/cjs/shared/types/config-types.cjs +51 -0
  102. package/dist/cjs/transaction/index.cjs +6 -0
  103. package/dist/cjs/transaction/transaction-builder.cjs +78 -0
  104. package/dist/cjs/types/aggregate-types.cjs +2 -0
  105. package/dist/cjs/types/inference-types.cjs +18 -0
  106. package/dist/cjs/types/pagination-types.cjs +7 -0
  107. package/dist/cjs/types/result-types.cjs +2 -0
  108. package/dist/cjs/types/scalar-types.cjs +2 -0
  109. package/dist/cjs/types/schema-types.cjs +2 -0
  110. package/dist/cjs/types/subscription-types.cjs +2 -0
  111. package/dist/cjs/types.cjs +2 -0
  112. package/dist/cjs/update/array-update-builder.cjs +232 -0
  113. package/dist/cjs/update/index.cjs +16 -0
  114. package/dist/cjs/update/jsonb-update-builder.cjs +219 -0
  115. package/dist/cjs/update/update-builder.cjs +274 -0
  116. package/dist/cjs/utils/addon/pg/cursor.cjs +8 -0
  117. package/dist/cjs/utils/addon/pg/pg.cjs +23 -0
  118. package/dist/cjs/utils/case-converter.cjs +58 -0
  119. package/dist/cjs/utils/env-resolver.cjs +226 -0
  120. package/dist/cjs/utils/environment-detection.cjs +124 -0
  121. package/dist/cjs/utils/fk-resolver.cjs +186 -0
  122. package/dist/cjs/utils/index.cjs +25 -0
  123. package/dist/cjs/utils/pool-defaults.cjs +91 -0
  124. package/dist/cjs/utils/type-coercion.cjs +120 -0
  125. package/dist/cjs/window/index.cjs +5 -0
  126. package/dist/cjs/window/window-builder.cjs +80 -0
  127. package/dist/esm/__test-types.js +15 -0
  128. package/dist/esm/addon/cursor.js +1440 -0
  129. package/dist/esm/addon/pg.js +4931 -0
  130. package/dist/esm/cache/index.js +1 -0
  131. package/dist/esm/cache/query-cache.js +303 -0
  132. package/dist/esm/condition/array-condition-builder.js +519 -0
  133. package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
  134. package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
  135. package/dist/esm/condition/array-string-condition-builder.js +142 -0
  136. package/dist/esm/condition/base-condition-builder.js +1 -0
  137. package/dist/esm/condition/condition-collector.js +452 -0
  138. package/dist/esm/condition/fulltext-condition-builder.js +53 -0
  139. package/dist/esm/condition/geometric-condition-builder.js +220 -0
  140. package/dist/esm/condition/index.js +8 -0
  141. package/dist/esm/condition/jsonb-condition-builder.js +439 -0
  142. package/dist/esm/condition/network-condition-builder.js +229 -0
  143. package/dist/esm/condition/postgis-condition-builder.js +180 -0
  144. package/dist/esm/condition/range-condition-builder.js +90 -0
  145. package/dist/esm/core/helpers/ConnectedAggregateBuilder.js +128 -0
  146. package/dist/esm/core/helpers/ConnectedCTEBuilder.js +49 -0
  147. package/dist/esm/core/helpers/ConnectedCountBuilder.js +69 -0
  148. package/dist/esm/core/helpers/ConnectedDeleteBuilder.js +61 -0
  149. package/dist/esm/core/helpers/ConnectedInsertBuilder.js +108 -0
  150. package/dist/esm/core/helpers/ConnectedInsertFromSelectBuilder.js +62 -0
  151. package/dist/esm/core/helpers/ConnectedQueryBuilder.js +142 -0
  152. package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +42 -0
  153. package/dist/esm/core/helpers/ConnectedSelectBuilder.js +327 -0
  154. package/dist/esm/core/helpers/ConnectedTransactionBuilder.js +100 -0
  155. package/dist/esm/core/helpers/ConnectedUpdateBuilder.js +75 -0
  156. package/dist/esm/core/helpers/PaginateBuilder.js +174 -0
  157. package/dist/esm/core/helpers/ReturningExecutor.js +66 -0
  158. package/dist/esm/core/helpers/capability-guard.js +7 -0
  159. package/dist/esm/core/helpers/index.js +13 -0
  160. package/dist/esm/core/helpers/methods.js +6 -0
  161. package/dist/esm/core/helpers/query-convenience.js +194 -0
  162. package/dist/esm/core/helpers/select-joins.js +246 -0
  163. package/dist/esm/core/helpers/select-pagination.js +226 -0
  164. package/dist/esm/core/helpers/select-types.js +1 -0
  165. package/dist/esm/core/pg-family/cockroachdb-client/capabilities.js +28 -0
  166. package/dist/esm/core/pg-family/cockroachdb-client/index.js +2 -0
  167. package/dist/esm/core/pg-family/cockroachdb-client/relq-cockroach.js +12 -0
  168. package/dist/esm/core/pg-family/dsql-client/capabilities.js +28 -0
  169. package/dist/esm/core/pg-family/dsql-client/index.js +2 -0
  170. package/dist/esm/core/pg-family/dsql-client/relq-dsql.js +12 -0
  171. package/dist/esm/core/pg-family/index.js +6 -0
  172. package/dist/esm/core/pg-family/nile-client/capabilities.js +28 -0
  173. package/dist/esm/core/pg-family/nile-client/index.js +2 -0
  174. package/dist/esm/core/pg-family/nile-client/relq-nile.js +32 -0
  175. package/dist/esm/core/pg-family/nile-client/tenant-context.js +40 -0
  176. package/dist/esm/core/pg-family/pg-client/capabilities.js +28 -0
  177. package/dist/esm/core/pg-family/pg-client/index.js +2 -0
  178. package/dist/esm/core/pg-family/pg-client/relq-postgres.js +39 -0
  179. package/dist/esm/core/pg-family/shared/pg-base.js +347 -0
  180. package/dist/esm/core/pg-family/shared/pg-dialect.js +63 -0
  181. package/dist/esm/core/pg-family/shared/pg-error-parser.js +29 -0
  182. package/dist/esm/core/pg-family/shared/pg-type-coercion.js +6 -0
  183. package/dist/esm/core/relq-base.js +270 -0
  184. package/dist/esm/core/relq-client.js +48 -0
  185. package/dist/esm/core/shared/cleanup.js +27 -0
  186. package/dist/esm/core/shared/column-mapping.js +90 -0
  187. package/dist/esm/core/shared/errors.js +13 -0
  188. package/dist/esm/core/shared/index.js +6 -0
  189. package/dist/esm/core/shared/table-accessor.js +19 -0
  190. package/dist/esm/core/shared/transform.js +30 -0
  191. package/dist/esm/core/shared/types.js +1 -0
  192. package/dist/esm/core/shared/validation.js +136 -0
  193. package/dist/esm/core/types/core.types.js +1 -0
  194. package/dist/esm/count/count-builder.js +81 -0
  195. package/dist/esm/count/index.js +1 -0
  196. package/dist/esm/delete/delete-builder.js +169 -0
  197. package/dist/esm/delete/index.js +1 -0
  198. package/dist/esm/explain/explain-builder.js +95 -0
  199. package/dist/esm/explain/index.js +1 -0
  200. package/dist/esm/index.js +7 -0
  201. package/dist/esm/insert/conflict-builder.js +202 -0
  202. package/dist/esm/insert/index.js +1 -0
  203. package/dist/esm/insert/insert-builder.js +313 -0
  204. package/dist/esm/insert/insert-from-select-builder.js +79 -0
  205. package/dist/esm/pubsub/index.js +1 -0
  206. package/dist/esm/pubsub/listen-notify-builder.js +48 -0
  207. package/dist/esm/pubsub/listener-connection.js +173 -0
  208. package/dist/esm/raw/index.js +2 -0
  209. package/dist/esm/raw/raw-query-builder.js +20 -0
  210. package/dist/esm/raw/sql-template.js +66 -0
  211. package/dist/esm/select/aggregate-builder.js +172 -0
  212. package/dist/esm/select/index.js +4 -0
  213. package/dist/esm/select/join-builder.js +184 -0
  214. package/dist/esm/select/join-condition-builder.js +181 -0
  215. package/dist/esm/select/join-internals.js +2 -0
  216. package/dist/esm/select/join-many-condition-builder.js +151 -0
  217. package/dist/esm/select/scalar-query-builder.js +126 -0
  218. package/dist/esm/select/scalar-select-builder.js +70 -0
  219. package/dist/esm/select/select-builder.js +419 -0
  220. package/dist/esm/select/sql-expression.js +33 -0
  221. package/dist/esm/select/table-proxy.js +91 -0
  222. package/dist/esm/shared/aws-dsql.js +140 -0
  223. package/dist/esm/shared/errors/relq-errors.js +339 -0
  224. package/dist/esm/shared/pg-format.js +375 -0
  225. package/dist/esm/shared/types/config-types.js +46 -0
  226. package/dist/esm/transaction/index.js +1 -0
  227. package/dist/esm/transaction/transaction-builder.js +70 -0
  228. package/dist/esm/types/aggregate-types.js +1 -0
  229. package/dist/esm/types/inference-types.js +12 -0
  230. package/dist/esm/types/pagination-types.js +4 -0
  231. package/dist/esm/types/result-types.js +1 -0
  232. package/dist/esm/types/scalar-types.js +1 -0
  233. package/dist/esm/types/schema-types.js +1 -0
  234. package/dist/esm/types/subscription-types.js +1 -0
  235. package/dist/esm/types.js +1 -0
  236. package/dist/esm/update/array-update-builder.js +219 -0
  237. package/dist/esm/update/index.js +3 -0
  238. package/dist/esm/update/jsonb-update-builder.js +211 -0
  239. package/dist/esm/update/update-builder.js +267 -0
  240. package/dist/esm/utils/addon/pg/cursor.js +1 -0
  241. package/dist/esm/utils/addon/pg/pg.js +2 -0
  242. package/dist/esm/utils/case-converter.js +55 -0
  243. package/dist/esm/utils/env-resolver.js +213 -0
  244. package/dist/esm/utils/environment-detection.js +114 -0
  245. package/dist/esm/utils/fk-resolver.js +178 -0
  246. package/dist/esm/utils/index.js +4 -0
  247. package/dist/esm/utils/pool-defaults.js +85 -0
  248. package/dist/esm/utils/type-coercion.js +112 -0
  249. package/dist/esm/window/index.js +1 -0
  250. package/dist/esm/window/window-builder.js +73 -0
  251. package/dist/index.cjs +1 -0
  252. package/dist/index.d.ts +7281 -0
  253. package/dist/index.js +1 -0
  254. package/package.json +52 -0
@@ -0,0 +1,69 @@
1
+ import { INTERNAL } from "./methods.js";
2
+ import { createTableAccessor } from "../shared/table-accessor.js";
3
+ export class ConnectedCountBuilder {
4
+ builder;
5
+ relq;
6
+ tableName;
7
+ groupNames = [];
8
+ constructor(builder, relq, tableName) {
9
+ this.builder = builder;
10
+ this.relq = relq;
11
+ this.tableName = tableName;
12
+ }
13
+ group(name, callback, options) {
14
+ this.groupNames.push(name);
15
+ this.builder.group(name, (q) => {
16
+ const wrapped = this.wrapConditionBuilder(q);
17
+ return callback(wrapped);
18
+ }, options);
19
+ return this;
20
+ }
21
+ where(callback) {
22
+ this.builder.where((q) => {
23
+ q._tables = createTableAccessor(this.relq, this.relq.schema);
24
+ const wrapped = this.wrapConditionBuilder(q);
25
+ return callback(wrapped);
26
+ });
27
+ return this;
28
+ }
29
+ wrapConditionBuilder(originalBuilder) {
30
+ const relq = this.relq;
31
+ const tableName = this.tableName;
32
+ const createProxy = (target) => {
33
+ return new Proxy(target, {
34
+ get(target, prop) {
35
+ const original = target[prop];
36
+ if (typeof original === 'function') {
37
+ return function (column, ...args) {
38
+ const transformed = relq[INTERNAL].transformToDbColumns(tableName, { [column]: true });
39
+ const dbColumn = Object.keys(transformed)[0] || column;
40
+ const result = original.call(target, dbColumn, ...args);
41
+ if (result === target || (result && typeof result === 'object')) {
42
+ return createProxy(result);
43
+ }
44
+ return result;
45
+ };
46
+ }
47
+ return original;
48
+ }
49
+ });
50
+ };
51
+ return createProxy(originalBuilder);
52
+ }
53
+ toString() {
54
+ return this.builder.toString();
55
+ }
56
+ async get() {
57
+ const sql = this.builder.toString();
58
+ const result = await this.relq[INTERNAL].executeQuery(sql);
59
+ const row = result.result.rows[0];
60
+ if (this.groupNames.length === 0) {
61
+ return (Number(row?.count) ?? 0);
62
+ }
63
+ const counts = {};
64
+ for (const name of this.groupNames) {
65
+ counts[name] = Number(row?.[name] ?? 0);
66
+ }
67
+ return counts;
68
+ }
69
+ }
@@ -0,0 +1,61 @@
1
+ import { INTERNAL } from "./methods.js";
2
+ import { ReturningExecutor } from "./ReturningExecutor.js";
3
+ import { requireCapability } from "./capability-guard.js";
4
+ import { createTableAccessor } from "../shared/table-accessor.js";
5
+ export class ConnectedDeleteBuilder {
6
+ builder;
7
+ relq;
8
+ tableName;
9
+ schemaKey;
10
+ constructor(builder, relq, tableName, schemaKey) {
11
+ this.builder = builder;
12
+ this.relq = relq;
13
+ this.tableName = tableName;
14
+ this.schemaKey = schemaKey;
15
+ this.setupColumnResolver();
16
+ }
17
+ setupColumnResolver() {
18
+ if (!this.tableName && !this.schemaKey) {
19
+ return;
20
+ }
21
+ const internal = this.relq[INTERNAL];
22
+ const tableDef = internal.getTableDef(this.schemaKey || this.tableName);
23
+ if (!tableDef) {
24
+ return;
25
+ }
26
+ const tableColumns = tableDef.$columns || tableDef;
27
+ this.builder.setColumnResolver((column) => {
28
+ const columnDef = tableColumns[column];
29
+ if (columnDef) {
30
+ return columnDef.$columnName || column;
31
+ }
32
+ return column;
33
+ });
34
+ }
35
+ where(callback) {
36
+ this.builder.where((q) => {
37
+ q._tables = createTableAccessor(this.relq, this.relq.schema);
38
+ return callback(q);
39
+ });
40
+ return this;
41
+ }
42
+ toString() {
43
+ return this.builder.toString();
44
+ }
45
+ async run(withMetadata) {
46
+ const sql = this.builder.toString();
47
+ const result = await this.relq[INTERNAL].executeRun(sql);
48
+ if (withMetadata) {
49
+ return result;
50
+ }
51
+ return result.metadata.rowCount ?? 0;
52
+ }
53
+ returning(columns) {
54
+ if (columns === null) {
55
+ return this;
56
+ }
57
+ requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the DELETE to retrieve deleted data');
58
+ this.builder.returning(columns);
59
+ return new ReturningExecutor(this.builder, this.relq, this.tableName, this.schemaKey);
60
+ }
61
+ }
@@ -0,0 +1,108 @@
1
+ import { ConditionCollector, buildConditionsSQL } from "../../condition/condition-collector.js";
2
+ import { debugLog, INTERNAL } from "./methods.js";
3
+ import { ReturningExecutor } from "./ReturningExecutor.js";
4
+ import { requireCapability } from "./capability-guard.js";
5
+ export class ConnectedInsertBuilder {
6
+ builder;
7
+ relq;
8
+ tableName;
9
+ schemaKey;
10
+ constructor(builder, relq, tableName, schemaKey) {
11
+ this.builder = builder;
12
+ this.relq = relq;
13
+ this.tableName = tableName;
14
+ this.schemaKey = schemaKey;
15
+ this.setupColumnResolver();
16
+ }
17
+ setupColumnResolver() {
18
+ if (!this.tableName && !this.schemaKey) {
19
+ return;
20
+ }
21
+ const internal = this.relq[INTERNAL];
22
+ const tableDef = internal.getTableDef(this.schemaKey || this.tableName);
23
+ if (!tableDef) {
24
+ return;
25
+ }
26
+ const tableColumns = tableDef.$columns || tableDef;
27
+ this.builder.setColumnResolver((column) => {
28
+ const columnDef = tableColumns[column];
29
+ if (columnDef) {
30
+ return columnDef.$columnName || column;
31
+ }
32
+ return column;
33
+ });
34
+ this.builder.setColumnTypeResolver((column) => {
35
+ const columnDef = tableColumns[column];
36
+ if (!columnDef) {
37
+ return undefined;
38
+ }
39
+ const type = columnDef.$type;
40
+ if (typeof type !== 'string') {
41
+ return undefined;
42
+ }
43
+ const isArray = columnDef.$array === true;
44
+ const baseType = type.replace(/\[\]$/, '').toLowerCase();
45
+ return { type: baseType, isArray };
46
+ });
47
+ }
48
+ addRow(row) {
49
+ this.builder.addRow(row);
50
+ return this;
51
+ }
52
+ addRows(rows) {
53
+ this.builder.addRows(rows);
54
+ return this;
55
+ }
56
+ clear() {
57
+ this.builder.clear();
58
+ return this;
59
+ }
60
+ get total() {
61
+ return this.builder.total;
62
+ }
63
+ doNothing(...args) {
64
+ const columns = [...new Set(args.flat())];
65
+ this.builder._onConflict(columns.length > 0 ? columns : null, q => q.doNothing());
66
+ return this;
67
+ }
68
+ doUpdate(columns, values, where) {
69
+ const cols = [...new Set(Array.isArray(columns) ? columns : [columns])];
70
+ this.builder._onConflict(cols, (conflictBuilder) => {
71
+ conflictBuilder.doUpdate(values);
72
+ if (where) {
73
+ const collector = new ConditionCollector();
74
+ where(collector);
75
+ const conditions = collector.getConditions();
76
+ if (conditions.length > 0) {
77
+ const whereClause = buildConditionsSQL(conditions);
78
+ conflictBuilder.where(whereClause);
79
+ }
80
+ }
81
+ });
82
+ return this;
83
+ }
84
+ toString() {
85
+ return this.builder.toString();
86
+ }
87
+ async run(withMetadata) {
88
+ debugLog(this.relq[INTERNAL]?.config, `ConnectedInsertBuilder.run called for table: ${this.builder.tableName}`);
89
+ const internalRelq = this.relq[INTERNAL];
90
+ for (const row of this.builder.insertData) {
91
+ internalRelq.validateData(this.builder.tableName, row, 'insert');
92
+ }
93
+ const sql = this.builder.toString();
94
+ const result = await internalRelq.executeRun(sql);
95
+ if (withMetadata) {
96
+ return result;
97
+ }
98
+ return result.metadata.rowCount ?? 0;
99
+ }
100
+ returning(columns) {
101
+ if (columns === null) {
102
+ return this;
103
+ }
104
+ requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the INSERT to retrieve inserted data');
105
+ this.builder.returning(columns);
106
+ return new ReturningExecutor(this.builder, this.relq, this.tableName, this.schemaKey);
107
+ }
108
+ }
@@ -0,0 +1,62 @@
1
+ import { debugLog, INTERNAL } from "./methods.js";
2
+ import { ReturningExecutor } from "./ReturningExecutor.js";
3
+ import { requireCapability } from "./capability-guard.js";
4
+ export class ConnectedInsertFromSelectBuilder {
5
+ builder;
6
+ relq;
7
+ tableName;
8
+ schemaKey;
9
+ constructor(builder, relq, tableName, schemaKey) {
10
+ this.builder = builder;
11
+ this.relq = relq;
12
+ this.tableName = tableName;
13
+ this.schemaKey = schemaKey;
14
+ this.setupColumnResolver();
15
+ }
16
+ setupColumnResolver() {
17
+ if (!this.tableName && !this.schemaKey)
18
+ return;
19
+ const internal = this.relq[INTERNAL];
20
+ const tableDef = internal.getTableDef(this.schemaKey || this.tableName);
21
+ if (!tableDef)
22
+ return;
23
+ const tableColumns = tableDef.$columns || tableDef;
24
+ this.builder.setColumnResolver((column) => {
25
+ const columnDef = tableColumns[column];
26
+ if (columnDef) {
27
+ return columnDef.$columnName || column;
28
+ }
29
+ return column;
30
+ });
31
+ }
32
+ doNothing(...args) {
33
+ const columns = [...new Set(args.flat())];
34
+ this.builder.onConflictDoNothing(columns.length > 0 ? columns : undefined);
35
+ return this;
36
+ }
37
+ doUpdate(columns, updateData) {
38
+ const cols = Array.isArray(columns) ? columns : [columns];
39
+ this.builder.onConflictDoUpdate(cols, updateData);
40
+ return this;
41
+ }
42
+ toString() {
43
+ return this.builder.toString();
44
+ }
45
+ async run(withMetadata) {
46
+ debugLog(this.relq[INTERNAL]?.config, `ConnectedInsertFromSelectBuilder.run called for table: ${this.builder.tableName}`);
47
+ const sql = this.builder.toString();
48
+ const result = await this.relq[INTERNAL].executeRun(sql);
49
+ if (withMetadata) {
50
+ return result;
51
+ }
52
+ return result.metadata.rowCount ?? 0;
53
+ }
54
+ returning(columns) {
55
+ if (columns === null) {
56
+ return this;
57
+ }
58
+ requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the INSERT to retrieve inserted data');
59
+ this.builder.returning(columns);
60
+ return new ReturningExecutor(this.builder, this.relq, this.tableName, this.schemaKey);
61
+ }
62
+ }
@@ -0,0 +1,142 @@
1
+ import { CountBuilder } from "../../count/count-builder.js";
2
+ import { DeleteBuilder } from "../../delete/delete-builder.js";
3
+ import { InsertBuilder } from "../../insert/insert-builder.js";
4
+ import { InsertFromSelectBuilder } from "../../insert/insert-from-select-builder.js";
5
+ import { AggregateQueryBuilder } from "../../select/aggregate-builder.js";
6
+ import { SelectBuilder } from "../../select/select-builder.js";
7
+ import { UpdateBuilder } from "../../update/update-builder.js";
8
+ import { ConnectedAggregateBuilder } from "./ConnectedAggregateBuilder.js";
9
+ import { ConnectedCountBuilder } from "./ConnectedCountBuilder.js";
10
+ import { ConnectedDeleteBuilder } from "./ConnectedDeleteBuilder.js";
11
+ import { ConnectedInsertBuilder } from "./ConnectedInsertBuilder.js";
12
+ import { ConnectedInsertFromSelectBuilder } from "./ConnectedInsertFromSelectBuilder.js";
13
+ import { ConnectedSelectBuilder } from "./ConnectedSelectBuilder.js";
14
+ import { ConnectedUpdateBuilder } from "./ConnectedUpdateBuilder.js";
15
+ import { INTERNAL } from "./methods.js";
16
+ import { PaginateBuilder } from "./PaginateBuilder.js";
17
+ import { createTableAccessor } from "../shared/table-accessor.js";
18
+ import { executeFindById, executeFindOne, executeFindMany, executeExists, executeUpsert, executeCreateWith, executeSoftDelete, executeRestore, getPrimaryKeyColumn } from "./query-convenience.js";
19
+ export class ConnectedQueryBuilder {
20
+ tableName;
21
+ relq;
22
+ schemaKey;
23
+ constructor(tableName, relq, schemaKey) {
24
+ this.tableName = tableName;
25
+ this.relq = relq;
26
+ this.schemaKey = schemaKey;
27
+ }
28
+ get ctx() {
29
+ return { relq: this.relq, tableName: this.tableName };
30
+ }
31
+ select(...args) {
32
+ let columns;
33
+ if (args.length === 0) {
34
+ columns = undefined;
35
+ }
36
+ else if (args.length === 1) {
37
+ columns = args[0];
38
+ }
39
+ else {
40
+ columns = args;
41
+ }
42
+ if (columns !== undefined) {
43
+ if (Array.isArray(columns)) {
44
+ if (columns.length === 0) {
45
+ throw new Error('select() requires at least one column. Use .select() without arguments for SELECT *');
46
+ }
47
+ }
48
+ else if (typeof columns === 'string') {
49
+ if (columns === '' || columns === '*') {
50
+ throw new Error(`Invalid column name: "${columns}". Use .select() without arguments for SELECT *, or specify column names`);
51
+ }
52
+ }
53
+ }
54
+ let dbColumns = columns;
55
+ if (columns && this.relq[INTERNAL].hasColumnMapping()) {
56
+ if (Array.isArray(columns)) {
57
+ dbColumns = columns.map(col => {
58
+ if (Array.isArray(col)) {
59
+ const transformed = this.relq[INTERNAL].transformToDbColumns(this.tableName, { [col[0]]: true });
60
+ return [Object.keys(transformed)[0], col[1]];
61
+ }
62
+ else {
63
+ const transformed = this.relq[INTERNAL].transformToDbColumns(this.tableName, { [col]: true });
64
+ return Object.keys(transformed)[0];
65
+ }
66
+ });
67
+ }
68
+ else {
69
+ const transformed = this.relq[INTERNAL].transformToDbColumns(this.tableName, { [columns]: true });
70
+ dbColumns = Object.keys(transformed)[0];
71
+ }
72
+ }
73
+ const builder = new SelectBuilder(this.tableName, dbColumns);
74
+ return new ConnectedSelectBuilder(builder, this.relq, this.tableName, columns, this.schemaKey);
75
+ }
76
+ insert(data) {
77
+ const rows = Array.isArray(data) ? data : [data];
78
+ if (rows.length === 0) {
79
+ const builder = new InsertBuilder(this.tableName, {});
80
+ builder.clear();
81
+ return new ConnectedInsertBuilder(builder, this.relq, this.tableName, this.schemaKey);
82
+ }
83
+ const builder = new InsertBuilder(this.tableName, rows[0]);
84
+ for (let i = 1; i < rows.length; i++) {
85
+ builder.addRow(rows[i]);
86
+ }
87
+ return new ConnectedInsertBuilder(builder, this.relq, this.tableName, this.schemaKey);
88
+ }
89
+ update(data) {
90
+ const builder = new UpdateBuilder(this.tableName, data);
91
+ return new ConnectedUpdateBuilder(builder, this.relq, this.tableName, this.schemaKey);
92
+ }
93
+ delete() {
94
+ const builder = new DeleteBuilder(this.tableName);
95
+ return new ConnectedDeleteBuilder(builder, this.relq, this.tableName, this.schemaKey);
96
+ }
97
+ count() {
98
+ const builder = new CountBuilder(this.tableName);
99
+ return new ConnectedCountBuilder(builder, this.relq, this.tableName);
100
+ }
101
+ aggregate() {
102
+ const builder = new AggregateQueryBuilder(this.tableName);
103
+ return new ConnectedAggregateBuilder(builder, this.relq, this.tableName);
104
+ }
105
+ async findById(id) {
106
+ return executeFindById(this.ctx, id, () => getPrimaryKeyColumn(this.relq, this.tableName));
107
+ }
108
+ async findOne(filter) {
109
+ return executeFindOne(this.ctx, filter);
110
+ }
111
+ async findMany(filter) {
112
+ return executeFindMany(this.ctx, filter);
113
+ }
114
+ async exists(filter) {
115
+ return executeExists(this.ctx, filter);
116
+ }
117
+ async upsert(options) {
118
+ return executeUpsert(this.ctx, {
119
+ where: options.where,
120
+ create: options.create,
121
+ update: options.update,
122
+ });
123
+ }
124
+ insertFrom(columns, selectCallback) {
125
+ const tables = createTableAccessor(this.relq, this.relq.schema);
126
+ const selectQuery = selectCallback(tables);
127
+ const builder = new InsertFromSelectBuilder(this.tableName, columns, selectQuery.toString());
128
+ return new ConnectedInsertFromSelectBuilder(builder, this.relq, this.tableName, this.schemaKey);
129
+ }
130
+ paginate(options = {}) {
131
+ return new PaginateBuilder(this.relq, this.tableName, options.columns, options.where, options.orderBy);
132
+ }
133
+ async createWith(options) {
134
+ return executeCreateWith(this.ctx, options.data, options.with);
135
+ }
136
+ async softDelete(filter) {
137
+ return executeSoftDelete(this.ctx, filter);
138
+ }
139
+ async restore(filter) {
140
+ return executeRestore(this.ctx, filter);
141
+ }
142
+ }
@@ -0,0 +1,42 @@
1
+ import { RawQueryBuilder } from "../../raw/index.js";
2
+ import { INTERNAL } from "./methods.js";
3
+ export class ConnectedRawQueryBuilder {
4
+ query;
5
+ params;
6
+ relq;
7
+ builder;
8
+ constructor(query, params, relq) {
9
+ this.query = query;
10
+ this.params = params;
11
+ this.relq = relq;
12
+ const convertedQuery = this.convertPlaceholders(query);
13
+ this.builder = new RawQueryBuilder(convertedQuery, this.params);
14
+ }
15
+ convertPlaceholders(query) {
16
+ let index = 0;
17
+ return query.replace(/\?/g, () => `$${++index}`);
18
+ }
19
+ async all() {
20
+ const sql = this.builder.toString();
21
+ return this.relq[INTERNAL].executeSelect(sql);
22
+ }
23
+ async get() {
24
+ const sql = this.builder.toString();
25
+ return this.relq[INTERNAL].executeSelectOne(sql);
26
+ }
27
+ async getMany(count) {
28
+ const sql = this.builder.toString();
29
+ const limitedSql = sql.toUpperCase().includes('LIMIT')
30
+ ? sql
31
+ : `${sql} LIMIT ${count}`;
32
+ return this.relq[INTERNAL].executeSelect(limitedSql);
33
+ }
34
+ async run() {
35
+ const sql = this.builder.toString();
36
+ return this.relq[INTERNAL].executeRun(sql);
37
+ }
38
+ async count() {
39
+ const sql = this.builder.toString();
40
+ return this.relq[INTERNAL].executeCount(sql);
41
+ }
42
+ }