@relq/orm 0.1.3 → 0.1.5

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 (412) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +33 -224
  3. package/dist/cjs/addon/cursor.cjs +2 -1407
  4. package/dist/cjs/addon/mysql2.cjs +21143 -0
  5. package/dist/cjs/addon/pg.cjs +5 -5
  6. package/dist/cjs/cache/query-cache.cjs +1 -4
  7. package/dist/cjs/core/cte/cte-accessor.cjs +80 -0
  8. package/dist/cjs/core/cte/cte-types.cjs +24 -0
  9. package/dist/cjs/core/cte/native-cte-builder.cjs +254 -0
  10. package/dist/cjs/core/helpers/index.cjs +14 -14
  11. package/dist/cjs/core/relq-base.cjs +4 -88
  12. package/dist/cjs/core/relq-client.cjs +59 -41
  13. package/dist/cjs/core/shared/column-mapping.cjs +1 -1
  14. package/dist/cjs/core/shared/table-accessor.cjs +1 -1
  15. package/dist/cjs/core/shared/where.cjs +15 -0
  16. package/dist/cjs/index.cjs +40 -5
  17. package/dist/cjs/mysql/clients/index.cjs +17 -0
  18. package/dist/cjs/mysql/clients/mariadb-client/capabilities.cjs +31 -0
  19. package/dist/cjs/mysql/clients/mariadb-client/index.cjs +7 -0
  20. package/dist/cjs/mysql/clients/mariadb-client/relq-mariadb.cjs +14 -0
  21. package/dist/cjs/mysql/clients/mysql-client/capabilities.cjs +31 -0
  22. package/dist/cjs/mysql/clients/mysql-client/index.cjs +7 -0
  23. package/dist/cjs/mysql/clients/mysql-client/relq-mysql.cjs +14 -0
  24. package/dist/cjs/mysql/clients/planetscale-client/capabilities.cjs +31 -0
  25. package/dist/cjs/mysql/clients/planetscale-client/index.cjs +7 -0
  26. package/dist/cjs/mysql/clients/planetscale-client/relq-planetscale.cjs +32 -0
  27. package/dist/cjs/mysql/clients/shared/index.cjs +32 -0
  28. package/dist/cjs/mysql/clients/shared/mysql-base.cjs +362 -0
  29. package/dist/cjs/mysql/clients/shared/mysql-dialect.cjs +141 -0
  30. package/dist/cjs/mysql/clients/shared/mysql-error-parser.cjs +195 -0
  31. package/dist/cjs/mysql/clients/shared/mysql-format.cjs +95 -0
  32. package/dist/cjs/mysql/clients/shared/mysql-type-coercion.cjs +14 -0
  33. package/dist/cjs/mysql/condition/condition-collector.cjs +377 -0
  34. package/dist/cjs/mysql/condition/fulltext-condition-builder.cjs +63 -0
  35. package/dist/cjs/mysql/condition/index.cjs +16 -0
  36. package/dist/cjs/mysql/condition/json-condition-builder.cjs +144 -0
  37. package/dist/cjs/mysql/condition/json-path-proxy.cjs +520 -0
  38. package/dist/cjs/mysql/count/count-builder.cjs +109 -0
  39. package/dist/cjs/mysql/count/index.cjs +5 -0
  40. package/dist/cjs/mysql/delete/delete-builder.cjs +105 -0
  41. package/dist/cjs/mysql/delete/index.cjs +5 -0
  42. package/dist/cjs/mysql/explain/explain-builder.cjs +43 -0
  43. package/dist/cjs/mysql/explain/index.cjs +5 -0
  44. package/dist/cjs/mysql/helpers/MysqlConnectedAggregateBuilder.cjs +132 -0
  45. package/dist/cjs/mysql/helpers/MysqlConnectedCountBuilder.cjs +83 -0
  46. package/dist/cjs/mysql/helpers/MysqlConnectedDeleteBuilder.cjs +91 -0
  47. package/dist/cjs/mysql/helpers/MysqlConnectedInsertBuilder.cjs +75 -0
  48. package/dist/cjs/mysql/helpers/MysqlConnectedInsertFromSelectBuilder.cjs +57 -0
  49. package/dist/cjs/mysql/helpers/MysqlConnectedQueryBuilder.cjs +141 -0
  50. package/dist/cjs/mysql/helpers/MysqlConnectedRawQueryBuilder.cjs +60 -0
  51. package/dist/cjs/mysql/helpers/MysqlConnectedSelectBuilder.cjs +398 -0
  52. package/dist/cjs/mysql/helpers/MysqlConnectedTransactionBuilder.cjs +128 -0
  53. package/dist/cjs/mysql/helpers/MysqlConnectedUpdateBuilder.cjs +92 -0
  54. package/dist/cjs/mysql/helpers/MysqlPaginateBuilder.cjs +186 -0
  55. package/dist/cjs/mysql/helpers/MysqlReturningExecutor.cjs +69 -0
  56. package/dist/cjs/mysql/helpers/index.cjs +45 -0
  57. package/dist/cjs/mysql/helpers/query-convenience.cjs +210 -0
  58. package/dist/cjs/mysql/helpers/select-joins.cjs +465 -0
  59. package/dist/cjs/mysql/helpers/select-pagination.cjs +190 -0
  60. package/dist/cjs/mysql/index.cjs +154 -0
  61. package/dist/cjs/mysql/insert/duplicate-key-builder.cjs +185 -0
  62. package/dist/cjs/mysql/insert/index.cjs +13 -0
  63. package/dist/cjs/mysql/insert/insert-builder.cjs +169 -0
  64. package/dist/cjs/mysql/insert/insert-from-select-builder.cjs +74 -0
  65. package/dist/cjs/mysql/raw/index.cjs +8 -0
  66. package/dist/cjs/mysql/raw/raw-query-builder.cjs +27 -0
  67. package/dist/cjs/mysql/raw/sql-template.cjs +65 -0
  68. package/dist/cjs/mysql/select/aggregate-builder.cjs +211 -0
  69. package/dist/cjs/mysql/select/index.cjs +32 -0
  70. package/dist/cjs/mysql/select/join-builder.cjs +206 -0
  71. package/dist/cjs/mysql/select/join-condition-builder.cjs +205 -0
  72. package/dist/cjs/mysql/select/join-internals.cjs +5 -0
  73. package/dist/cjs/mysql/select/scalar-query-builder.cjs +164 -0
  74. package/dist/cjs/mysql/select/scalar-select-builder.cjs +78 -0
  75. package/dist/cjs/mysql/select/select-builder.cjs +414 -0
  76. package/dist/cjs/mysql/select/sql-expression.cjs +56 -0
  77. package/dist/cjs/mysql/select/table-proxy.cjs +99 -0
  78. package/dist/cjs/mysql/shared/mysql-table-accessor.cjs +22 -0
  79. package/dist/cjs/mysql/transaction/index.cjs +6 -0
  80. package/dist/cjs/mysql/transaction/transaction-builder.cjs +64 -0
  81. package/dist/cjs/mysql/update/column-expression-builder.cjs +49 -0
  82. package/dist/cjs/mysql/update/index.cjs +7 -0
  83. package/dist/cjs/mysql/update/mysql-json-update-builder.cjs +200 -0
  84. package/dist/cjs/mysql/update/update-builder.cjs +167 -0
  85. package/dist/cjs/mysql/utils/addon/mysql/mysql2.cjs +23 -0
  86. package/dist/cjs/mysql/utils/fk-resolver.cjs +187 -0
  87. package/dist/cjs/mysql/utils/index.cjs +16 -0
  88. package/dist/cjs/mysql/utils/type-coercion.cjs +158 -0
  89. package/dist/cjs/mysql/window/index.cjs +5 -0
  90. package/dist/cjs/mysql/window/window-builder.cjs +80 -0
  91. package/dist/cjs/pg/clients/alloydb-client/capabilities.cjs +31 -0
  92. package/dist/cjs/pg/clients/alloydb-client/index.cjs +7 -0
  93. package/dist/cjs/pg/clients/alloydb-client/relq-alloydb.cjs +43 -0
  94. package/dist/cjs/pg/clients/aurora-client/capabilities.cjs +31 -0
  95. package/dist/cjs/pg/clients/aurora-client/index.cjs +7 -0
  96. package/dist/cjs/pg/clients/aurora-client/relq-aurora.cjs +43 -0
  97. package/dist/cjs/pg/clients/citus-client/capabilities.cjs +31 -0
  98. package/dist/cjs/pg/clients/citus-client/index.cjs +7 -0
  99. package/dist/cjs/pg/clients/citus-client/relq-citus.cjs +43 -0
  100. package/dist/cjs/pg/clients/neon-client/capabilities.cjs +31 -0
  101. package/dist/cjs/pg/clients/neon-client/index.cjs +7 -0
  102. package/dist/cjs/pg/clients/neon-client/relq-neon.cjs +43 -0
  103. package/dist/cjs/pg/clients/pg-client/relq-postgres.cjs +56 -0
  104. package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-base.cjs +64 -7
  105. package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-type-coercion.cjs +1 -1
  106. package/dist/cjs/pg/clients/supabase-client/capabilities.cjs +31 -0
  107. package/dist/cjs/pg/clients/supabase-client/index.cjs +7 -0
  108. package/dist/cjs/{core/pg-family/pg-client/relq-postgres.cjs → pg/clients/supabase-client/relq-supabase.cjs} +9 -9
  109. package/dist/cjs/pg/clients/timescale-client/capabilities.cjs +31 -0
  110. package/dist/cjs/pg/clients/timescale-client/index.cjs +7 -0
  111. package/dist/cjs/pg/clients/timescale-client/relq-timescale.cjs +43 -0
  112. package/dist/cjs/pg/clients/yugabytedb-client/capabilities.cjs +31 -0
  113. package/dist/cjs/pg/clients/yugabytedb-client/index.cjs +7 -0
  114. package/dist/cjs/pg/clients/yugabytedb-client/relq-yugabytedb.cjs +16 -0
  115. package/dist/cjs/{condition → pg/condition}/array-condition-builder.cjs +1 -1
  116. package/dist/cjs/pg/condition/array-path-proxy.cjs +379 -0
  117. package/dist/cjs/{condition → pg/condition}/condition-collector.cjs +18 -9
  118. package/dist/cjs/{condition → pg/condition}/fulltext-condition-builder.cjs +1 -1
  119. package/dist/cjs/{condition → pg/condition}/geometric-condition-builder.cjs +1 -1
  120. package/dist/cjs/pg/condition/json-path-proxy.cjs +480 -0
  121. package/dist/cjs/{condition → pg/condition}/jsonb-condition-builder.cjs +1 -1
  122. package/dist/cjs/{condition → pg/condition}/network-condition-builder.cjs +1 -1
  123. package/dist/cjs/{condition → pg/condition}/postgis-condition-builder.cjs +1 -1
  124. package/dist/cjs/{condition → pg/condition}/range-condition-builder.cjs +1 -1
  125. package/dist/cjs/{count → pg/count}/count-builder.cjs +10 -5
  126. package/dist/cjs/{delete → pg/delete}/delete-builder.cjs +10 -5
  127. package/dist/cjs/{core → pg}/helpers/ConnectedAggregateBuilder.cjs +16 -3
  128. package/dist/cjs/{core → pg}/helpers/ConnectedCountBuilder.cjs +16 -3
  129. package/dist/cjs/{core → pg}/helpers/ConnectedDeleteBuilder.cjs +27 -7
  130. package/dist/cjs/{core → pg}/helpers/ConnectedInsertBuilder.cjs +16 -8
  131. package/dist/cjs/{core → pg}/helpers/ConnectedInsertFromSelectBuilder.cjs +9 -5
  132. package/dist/cjs/{core → pg}/helpers/ConnectedQueryBuilder.cjs +14 -19
  133. package/dist/cjs/pg/helpers/ConnectedRawQueryBuilder.cjs +67 -0
  134. package/dist/cjs/{core → pg}/helpers/ConnectedSelectBuilder.cjs +121 -25
  135. package/dist/cjs/{core → pg}/helpers/ConnectedTransactionBuilder.cjs +34 -4
  136. package/dist/cjs/{core → pg}/helpers/ConnectedUpdateBuilder.cjs +27 -7
  137. package/dist/cjs/{core → pg}/helpers/PaginateBuilder.cjs +3 -3
  138. package/dist/cjs/{core → pg}/helpers/ReturningExecutor.cjs +3 -3
  139. package/dist/cjs/{core → pg}/helpers/query-convenience.cjs +11 -12
  140. package/dist/cjs/{core → pg}/helpers/select-joins.cjs +17 -14
  141. package/dist/cjs/{core → pg}/helpers/select-pagination.cjs +1 -1
  142. package/dist/cjs/{insert → pg/insert}/conflict-builder.cjs +2 -2
  143. package/dist/cjs/{insert → pg/insert}/insert-builder.cjs +8 -5
  144. package/dist/cjs/{insert → pg/insert}/insert-from-select-builder.cjs +1 -1
  145. package/dist/cjs/{pubsub → pg/pubsub}/listen-notify-builder.cjs +1 -1
  146. package/dist/cjs/{pubsub → pg/pubsub}/listener-connection.cjs +2 -2
  147. package/dist/cjs/{raw → pg/raw}/raw-query-builder.cjs +2 -2
  148. package/dist/cjs/{raw → pg/raw}/sql-template.cjs +1 -6
  149. package/dist/cjs/{select → pg/select}/aggregate-builder.cjs +10 -5
  150. package/dist/cjs/{select → pg/select}/join-builder.cjs +2 -2
  151. package/dist/cjs/{select → pg/select}/join-condition-builder.cjs +11 -1
  152. package/dist/cjs/{select → pg/select}/join-many-condition-builder.cjs +3 -4
  153. package/dist/cjs/{select → pg/select}/scalar-query-builder.cjs +31 -1
  154. package/dist/cjs/{select → pg/select}/scalar-select-builder.cjs +1 -1
  155. package/dist/cjs/{select → pg/select}/select-builder.cjs +40 -7
  156. package/dist/cjs/pg/select/sql-expression.cjs +56 -0
  157. package/dist/cjs/{transaction → pg/transaction}/transaction-builder.cjs +1 -1
  158. package/dist/cjs/{update → pg/update}/array-update-builder.cjs +2 -5
  159. package/dist/cjs/pg/update/column-expression-builder.cjs +49 -0
  160. package/dist/cjs/{update → pg/update}/jsonb-update-builder.cjs +1 -1
  161. package/dist/cjs/{update → pg/update}/update-builder.cjs +14 -7
  162. package/dist/cjs/{utils → pg/utils}/addon/pg/cursor.cjs +1 -1
  163. package/dist/cjs/{utils → pg/utils}/addon/pg/pg.cjs +2 -2
  164. package/dist/cjs/{utils → pg/utils}/fk-resolver.cjs +47 -30
  165. package/dist/cjs/{window → pg/window}/window-builder.cjs +1 -1
  166. package/dist/cjs/shared/errors/relq-errors.cjs +496 -35
  167. package/dist/cjs/shared/types/config-types.cjs +2 -2
  168. package/dist/cjs/utils/env-resolver.cjs +76 -13
  169. package/dist/cjs/utils/index.cjs +1 -1
  170. package/dist/esm/addon/cursor.js +1 -1438
  171. package/dist/esm/addon/mysql2.js +21129 -0
  172. package/dist/esm/addon/pg.js +5 -5
  173. package/dist/esm/cache/query-cache.js +1 -4
  174. package/dist/esm/core/cte/cte-accessor.js +75 -0
  175. package/dist/esm/core/cte/cte-types.js +20 -0
  176. package/dist/esm/core/cte/native-cte-builder.js +250 -0
  177. package/dist/esm/core/helpers/index.js +12 -12
  178. package/dist/esm/core/relq-base.js +5 -56
  179. package/dist/esm/core/relq-client.js +54 -32
  180. package/dist/esm/core/shared/column-mapping.js +1 -1
  181. package/dist/esm/core/shared/table-accessor.js +1 -1
  182. package/dist/esm/core/shared/where.js +12 -0
  183. package/dist/esm/index.js +17 -5
  184. package/dist/esm/mysql/clients/index.js +5 -0
  185. package/dist/esm/mysql/clients/mariadb-client/capabilities.js +28 -0
  186. package/dist/esm/mysql/clients/mariadb-client/index.js +2 -0
  187. package/dist/esm/mysql/clients/mariadb-client/relq-mariadb.js +10 -0
  188. package/dist/esm/mysql/clients/mysql-client/capabilities.js +28 -0
  189. package/dist/esm/mysql/clients/mysql-client/index.js +2 -0
  190. package/dist/esm/mysql/clients/mysql-client/relq-mysql.js +10 -0
  191. package/dist/esm/mysql/clients/planetscale-client/capabilities.js +28 -0
  192. package/dist/esm/mysql/clients/planetscale-client/index.js +2 -0
  193. package/dist/esm/mysql/clients/planetscale-client/relq-planetscale.js +28 -0
  194. package/dist/esm/mysql/clients/shared/index.js +7 -0
  195. package/dist/esm/mysql/clients/shared/mysql-base.js +321 -0
  196. package/dist/esm/mysql/clients/shared/mysql-dialect.js +136 -0
  197. package/dist/esm/mysql/clients/shared/mysql-error-parser.js +188 -0
  198. package/dist/esm/mysql/clients/shared/mysql-format.js +92 -0
  199. package/dist/esm/mysql/clients/shared/mysql-type-coercion.js +6 -0
  200. package/dist/esm/mysql/condition/condition-collector.js +368 -0
  201. package/dist/esm/mysql/condition/fulltext-condition-builder.js +55 -0
  202. package/dist/esm/mysql/condition/index.js +4 -0
  203. package/dist/esm/mysql/condition/json-condition-builder.js +136 -0
  204. package/dist/esm/mysql/condition/json-path-proxy.js +513 -0
  205. package/dist/esm/mysql/count/count-builder.js +102 -0
  206. package/dist/esm/mysql/count/index.js +1 -0
  207. package/dist/esm/mysql/delete/delete-builder.js +98 -0
  208. package/dist/esm/mysql/delete/index.js +1 -0
  209. package/dist/esm/mysql/explain/explain-builder.js +39 -0
  210. package/dist/esm/mysql/explain/index.js +1 -0
  211. package/dist/esm/mysql/helpers/MysqlConnectedAggregateBuilder.js +128 -0
  212. package/dist/esm/{core/helpers/ConnectedCountBuilder.js → mysql/helpers/MysqlConnectedCountBuilder.js} +15 -5
  213. package/dist/esm/mysql/helpers/MysqlConnectedDeleteBuilder.js +87 -0
  214. package/dist/esm/mysql/helpers/MysqlConnectedInsertBuilder.js +71 -0
  215. package/dist/esm/mysql/helpers/MysqlConnectedInsertFromSelectBuilder.js +53 -0
  216. package/dist/esm/mysql/helpers/MysqlConnectedQueryBuilder.js +137 -0
  217. package/dist/esm/mysql/helpers/MysqlConnectedRawQueryBuilder.js +56 -0
  218. package/dist/esm/mysql/helpers/MysqlConnectedSelectBuilder.js +391 -0
  219. package/dist/esm/mysql/helpers/MysqlConnectedTransactionBuilder.js +123 -0
  220. package/dist/esm/mysql/helpers/MysqlConnectedUpdateBuilder.js +88 -0
  221. package/dist/esm/mysql/helpers/MysqlPaginateBuilder.js +182 -0
  222. package/dist/esm/mysql/helpers/MysqlReturningExecutor.js +65 -0
  223. package/dist/esm/mysql/helpers/index.js +15 -0
  224. package/dist/esm/mysql/helpers/query-convenience.js +199 -0
  225. package/dist/esm/mysql/helpers/select-joins.js +455 -0
  226. package/dist/esm/mysql/helpers/select-pagination.js +186 -0
  227. package/dist/esm/mysql/index.js +47 -0
  228. package/dist/esm/mysql/insert/duplicate-key-builder.js +174 -0
  229. package/dist/esm/mysql/insert/index.js +3 -0
  230. package/dist/esm/mysql/insert/insert-builder.js +162 -0
  231. package/dist/esm/mysql/insert/insert-from-select-builder.js +67 -0
  232. package/dist/esm/mysql/raw/index.js +2 -0
  233. package/dist/esm/mysql/raw/raw-query-builder.js +20 -0
  234. package/dist/esm/mysql/raw/sql-template.js +58 -0
  235. package/dist/esm/mysql/select/aggregate-builder.js +204 -0
  236. package/dist/esm/mysql/select/index.js +9 -0
  237. package/dist/esm/mysql/select/join-builder.js +198 -0
  238. package/dist/esm/mysql/select/join-condition-builder.js +197 -0
  239. package/dist/esm/mysql/select/join-internals.js +2 -0
  240. package/dist/esm/mysql/select/scalar-query-builder.js +156 -0
  241. package/dist/esm/mysql/select/scalar-select-builder.js +70 -0
  242. package/dist/esm/mysql/select/select-builder.js +407 -0
  243. package/dist/esm/mysql/select/sql-expression.js +51 -0
  244. package/dist/esm/mysql/select/table-proxy.js +91 -0
  245. package/dist/esm/mysql/shared/mysql-table-accessor.js +19 -0
  246. package/dist/esm/mysql/transaction/index.js +1 -0
  247. package/dist/esm/mysql/transaction/transaction-builder.js +56 -0
  248. package/dist/esm/mysql/update/column-expression-builder.js +42 -0
  249. package/dist/esm/mysql/update/index.js +2 -0
  250. package/dist/esm/mysql/update/mysql-json-update-builder.js +193 -0
  251. package/dist/esm/mysql/update/update-builder.js +160 -0
  252. package/dist/esm/mysql/utils/addon/mysql/mysql2.js +2 -0
  253. package/dist/esm/mysql/utils/fk-resolver.js +179 -0
  254. package/dist/esm/mysql/utils/index.js +2 -0
  255. package/dist/esm/mysql/utils/type-coercion.js +150 -0
  256. package/dist/esm/mysql/window/index.js +1 -0
  257. package/dist/esm/mysql/window/window-builder.js +73 -0
  258. package/dist/esm/pg/clients/alloydb-client/capabilities.js +28 -0
  259. package/dist/esm/pg/clients/alloydb-client/index.js +2 -0
  260. package/dist/esm/{core/pg-family/pg-client/relq-postgres.js → pg/clients/alloydb-client/relq-alloydb.js} +8 -8
  261. package/dist/esm/pg/clients/aurora-client/capabilities.js +28 -0
  262. package/dist/esm/pg/clients/aurora-client/index.js +2 -0
  263. package/dist/esm/pg/clients/aurora-client/relq-aurora.js +39 -0
  264. package/dist/esm/pg/clients/citus-client/capabilities.js +28 -0
  265. package/dist/esm/pg/clients/citus-client/index.js +2 -0
  266. package/dist/esm/pg/clients/citus-client/relq-citus.js +39 -0
  267. package/dist/esm/pg/clients/neon-client/capabilities.js +28 -0
  268. package/dist/esm/pg/clients/neon-client/index.js +2 -0
  269. package/dist/esm/pg/clients/neon-client/relq-neon.js +39 -0
  270. package/dist/esm/pg/clients/pg-client/relq-postgres.js +52 -0
  271. package/dist/esm/{core/pg-family → pg/clients}/shared/pg-base.js +64 -7
  272. package/dist/esm/{core/pg-family → pg/clients}/shared/pg-type-coercion.js +1 -1
  273. package/dist/esm/pg/clients/supabase-client/capabilities.js +28 -0
  274. package/dist/esm/pg/clients/supabase-client/index.js +2 -0
  275. package/dist/esm/pg/clients/supabase-client/relq-supabase.js +39 -0
  276. package/dist/esm/pg/clients/timescale-client/capabilities.js +28 -0
  277. package/dist/esm/pg/clients/timescale-client/index.js +2 -0
  278. package/dist/esm/pg/clients/timescale-client/relq-timescale.js +39 -0
  279. package/dist/esm/pg/clients/yugabytedb-client/capabilities.js +28 -0
  280. package/dist/esm/pg/clients/yugabytedb-client/index.js +2 -0
  281. package/dist/esm/pg/clients/yugabytedb-client/relq-yugabytedb.js +12 -0
  282. package/dist/esm/{condition → pg/condition}/array-condition-builder.js +1 -1
  283. package/dist/esm/pg/condition/array-path-proxy.js +372 -0
  284. package/dist/esm/{condition → pg/condition}/condition-collector.js +20 -11
  285. package/dist/esm/{condition → pg/condition}/fulltext-condition-builder.js +1 -1
  286. package/dist/esm/{condition → pg/condition}/geometric-condition-builder.js +1 -1
  287. package/dist/esm/pg/condition/json-path-proxy.js +473 -0
  288. package/dist/esm/{condition → pg/condition}/jsonb-condition-builder.js +1 -1
  289. package/dist/esm/{condition → pg/condition}/network-condition-builder.js +1 -1
  290. package/dist/esm/{condition → pg/condition}/postgis-condition-builder.js +1 -1
  291. package/dist/esm/{condition → pg/condition}/range-condition-builder.js +1 -1
  292. package/dist/esm/{count → pg/count}/count-builder.js +10 -5
  293. package/dist/esm/{delete → pg/delete}/delete-builder.js +10 -5
  294. package/dist/esm/{core → pg}/helpers/ConnectedAggregateBuilder.js +16 -3
  295. package/dist/esm/pg/helpers/ConnectedCountBuilder.js +82 -0
  296. package/dist/esm/{core → pg}/helpers/ConnectedDeleteBuilder.js +27 -7
  297. package/dist/esm/{core → pg}/helpers/ConnectedInsertBuilder.js +16 -8
  298. package/dist/esm/{core → pg}/helpers/ConnectedInsertFromSelectBuilder.js +9 -5
  299. package/dist/esm/{core → pg}/helpers/ConnectedQueryBuilder.js +15 -20
  300. package/dist/esm/pg/helpers/ConnectedRawQueryBuilder.js +63 -0
  301. package/dist/esm/{core → pg}/helpers/ConnectedSelectBuilder.js +118 -25
  302. package/dist/esm/{core → pg}/helpers/ConnectedTransactionBuilder.js +34 -4
  303. package/dist/esm/{core → pg}/helpers/ConnectedUpdateBuilder.js +27 -7
  304. package/dist/esm/{core → pg}/helpers/PaginateBuilder.js +3 -3
  305. package/dist/esm/{core → pg}/helpers/ReturningExecutor.js +3 -3
  306. package/dist/esm/{core → pg}/helpers/query-convenience.js +11 -12
  307. package/dist/esm/{core → pg}/helpers/select-joins.js +18 -15
  308. package/dist/esm/{core → pg}/helpers/select-pagination.js +1 -1
  309. package/dist/esm/{insert → pg/insert}/conflict-builder.js +2 -2
  310. package/dist/esm/{insert → pg/insert}/insert-builder.js +8 -5
  311. package/dist/esm/{insert → pg/insert}/insert-from-select-builder.js +1 -1
  312. package/dist/esm/{pubsub → pg/pubsub}/listen-notify-builder.js +1 -1
  313. package/dist/esm/{pubsub → pg/pubsub}/listener-connection.js +2 -2
  314. package/dist/esm/{raw → pg/raw}/raw-query-builder.js +2 -2
  315. package/dist/esm/{raw → pg/raw}/sql-template.js +1 -6
  316. package/dist/esm/{select → pg/select}/aggregate-builder.js +10 -5
  317. package/dist/esm/{select → pg/select}/join-builder.js +2 -2
  318. package/dist/esm/{select → pg/select}/join-condition-builder.js +11 -1
  319. package/dist/esm/{select → pg/select}/join-many-condition-builder.js +3 -4
  320. package/dist/esm/{select → pg/select}/scalar-query-builder.js +31 -1
  321. package/dist/esm/{select → pg/select}/scalar-select-builder.js +1 -1
  322. package/dist/esm/{select → pg/select}/select-builder.js +40 -7
  323. package/dist/esm/pg/select/sql-expression.js +51 -0
  324. package/dist/esm/{transaction → pg/transaction}/transaction-builder.js +1 -1
  325. package/dist/esm/{update → pg/update}/array-update-builder.js +2 -5
  326. package/dist/esm/pg/update/column-expression-builder.js +42 -0
  327. package/dist/esm/{update → pg/update}/jsonb-update-builder.js +1 -1
  328. package/dist/esm/{update → pg/update}/update-builder.js +14 -7
  329. package/dist/esm/pg/utils/addon/pg/cursor.js +1 -0
  330. package/dist/esm/pg/utils/addon/pg/pg.js +2 -0
  331. package/dist/esm/{utils → pg/utils}/fk-resolver.js +47 -30
  332. package/dist/esm/{window → pg/window}/window-builder.js +1 -1
  333. package/dist/esm/shared/errors/relq-errors.js +486 -34
  334. package/dist/esm/shared/types/config-types.js +2 -2
  335. package/dist/esm/utils/env-resolver.js +74 -13
  336. package/dist/esm/utils/index.js +1 -1
  337. package/dist/index.d.ts +9629 -3974
  338. package/package.json +6 -3
  339. package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +0 -53
  340. package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +0 -46
  341. package/dist/cjs/select/sql-expression.cjs +0 -38
  342. package/dist/esm/core/helpers/ConnectedCTEBuilder.js +0 -49
  343. package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +0 -42
  344. package/dist/esm/select/sql-expression.js +0 -33
  345. package/dist/esm/utils/addon/pg/cursor.js +0 -1
  346. package/dist/esm/utils/addon/pg/pg.js +0 -2
  347. /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/capabilities.cjs +0 -0
  348. /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/index.cjs +0 -0
  349. /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/relq-cockroach.cjs +0 -0
  350. /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/capabilities.cjs +0 -0
  351. /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/index.cjs +0 -0
  352. /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/relq-dsql.cjs +0 -0
  353. /package/dist/cjs/{core/pg-family → pg/clients}/index.cjs +0 -0
  354. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/capabilities.cjs +0 -0
  355. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/index.cjs +0 -0
  356. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/relq-nile.cjs +0 -0
  357. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/tenant-context.cjs +0 -0
  358. /package/dist/cjs/{core/pg-family → pg/clients}/pg-client/capabilities.cjs +0 -0
  359. /package/dist/cjs/{core/pg-family → pg/clients}/pg-client/index.cjs +0 -0
  360. /package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-dialect.cjs +0 -0
  361. /package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-error-parser.cjs +0 -0
  362. /package/dist/cjs/{condition → pg/condition}/array-numeric-condition-builder.cjs +0 -0
  363. /package/dist/cjs/{condition → pg/condition}/array-specialized-condition-builder.cjs +0 -0
  364. /package/dist/cjs/{condition → pg/condition}/array-string-condition-builder.cjs +0 -0
  365. /package/dist/cjs/{condition → pg/condition}/index.cjs +0 -0
  366. /package/dist/cjs/{count → pg/count}/index.cjs +0 -0
  367. /package/dist/cjs/{delete → pg/delete}/index.cjs +0 -0
  368. /package/dist/cjs/{explain → pg/explain}/explain-builder.cjs +0 -0
  369. /package/dist/cjs/{explain → pg/explain}/index.cjs +0 -0
  370. /package/dist/cjs/{insert → pg/insert}/index.cjs +0 -0
  371. /package/dist/cjs/{pubsub → pg/pubsub}/index.cjs +0 -0
  372. /package/dist/cjs/{raw → pg/raw}/index.cjs +0 -0
  373. /package/dist/cjs/{select → pg/select}/index.cjs +0 -0
  374. /package/dist/cjs/{select → pg/select}/join-internals.cjs +0 -0
  375. /package/dist/cjs/{select → pg/select}/table-proxy.cjs +0 -0
  376. /package/dist/cjs/{transaction → pg/transaction}/index.cjs +0 -0
  377. /package/dist/cjs/{update → pg/update}/index.cjs +0 -0
  378. /package/dist/cjs/{utils → pg/utils}/type-coercion.cjs +0 -0
  379. /package/dist/cjs/{window → pg/window}/index.cjs +0 -0
  380. /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/capabilities.js +0 -0
  381. /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/index.js +0 -0
  382. /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/relq-cockroach.js +0 -0
  383. /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/capabilities.js +0 -0
  384. /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/index.js +0 -0
  385. /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/relq-dsql.js +0 -0
  386. /package/dist/esm/{core/pg-family → pg/clients}/index.js +0 -0
  387. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/capabilities.js +0 -0
  388. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/index.js +0 -0
  389. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/relq-nile.js +0 -0
  390. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/tenant-context.js +0 -0
  391. /package/dist/esm/{core/pg-family → pg/clients}/pg-client/capabilities.js +0 -0
  392. /package/dist/esm/{core/pg-family → pg/clients}/pg-client/index.js +0 -0
  393. /package/dist/esm/{core/pg-family → pg/clients}/shared/pg-dialect.js +0 -0
  394. /package/dist/esm/{core/pg-family → pg/clients}/shared/pg-error-parser.js +0 -0
  395. /package/dist/esm/{condition → pg/condition}/array-numeric-condition-builder.js +0 -0
  396. /package/dist/esm/{condition → pg/condition}/array-specialized-condition-builder.js +0 -0
  397. /package/dist/esm/{condition → pg/condition}/array-string-condition-builder.js +0 -0
  398. /package/dist/esm/{condition → pg/condition}/index.js +0 -0
  399. /package/dist/esm/{count → pg/count}/index.js +0 -0
  400. /package/dist/esm/{delete → pg/delete}/index.js +0 -0
  401. /package/dist/esm/{explain → pg/explain}/explain-builder.js +0 -0
  402. /package/dist/esm/{explain → pg/explain}/index.js +0 -0
  403. /package/dist/esm/{insert → pg/insert}/index.js +0 -0
  404. /package/dist/esm/{pubsub → pg/pubsub}/index.js +0 -0
  405. /package/dist/esm/{raw → pg/raw}/index.js +0 -0
  406. /package/dist/esm/{select → pg/select}/index.js +0 -0
  407. /package/dist/esm/{select → pg/select}/join-internals.js +0 -0
  408. /package/dist/esm/{select → pg/select}/table-proxy.js +0 -0
  409. /package/dist/esm/{transaction → pg/transaction}/index.js +0 -0
  410. /package/dist/esm/{update → pg/update}/index.js +0 -0
  411. /package/dist/esm/{utils → pg/utils}/type-coercion.js +0 -0
  412. /package/dist/esm/{window → pg/window}/index.js +0 -0
@@ -0,0 +1,455 @@
1
+ import { createMysqlTableProxy, mysqlColumnRefToSQL, mysqlColumnRefToSQLUnqualified } from "../select/table-proxy.js";
2
+ import { MysqlJoinConditionBuilder } from "../select/join-condition-builder.js";
3
+ import { MysqlJoinManyBuilder } from "../select/join-builder.js";
4
+ import { MYSQL_JOIN_INTERNAL } from "../select/join-internals.js";
5
+ import { buildMysqlConditionsSQL } from "../condition/condition-collector.js";
6
+ import { resolveMysqlForeignKey } from "../utils/fk-resolver.js";
7
+ import { INTERNAL } from "../../core/helpers/methods.js";
8
+ import { requireCapability } from "../../core/helpers/capability-guard.js";
9
+ import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
10
+ import mysqlFormat from "../clients/shared/mysql-format.js";
11
+ export function executeMysqlTypeSafeJoin(ctx, joinType, tableOrAlias, callback) {
12
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
13
+ ? tableOrAlias
14
+ : [tableOrAlias, tableOrAlias];
15
+ const internal = ctx.relq[INTERNAL];
16
+ const schema = internal.getSchema();
17
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
18
+ const rightTableDef = internal.getTableDef(rightTableKey);
19
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
20
+ const rightTableName = rightTableDef?.$name || rightTableKey;
21
+ const leftAlias = ctx.builder.getTableIdentifier();
22
+ const leftProxy = createMysqlTableProxy(leftTableName, leftAlias, leftTableDef);
23
+ const rightProxy = createMysqlTableProxy(rightTableName, rightAlias, rightTableDef);
24
+ const conditionBuilder = new MysqlJoinConditionBuilder();
25
+ if (callback) {
26
+ if (joinType === 'RIGHT JOIN') {
27
+ callback(conditionBuilder, leftProxy, rightProxy);
28
+ }
29
+ else {
30
+ callback(conditionBuilder, rightProxy, leftProxy);
31
+ }
32
+ }
33
+ const conditionInternals = conditionBuilder[MYSQL_JOIN_INTERNAL];
34
+ if (!conditionInternals.hasConditions() && schema) {
35
+ const fkResolution = resolveMysqlForeignKey(schema, ctx.schemaKey || ctx.tableName, rightTableKey);
36
+ if (fkResolution) {
37
+ const leftCol = leftProxy[fkResolution.fromColumn];
38
+ const rightCol = rightProxy[fkResolution.toColumn];
39
+ conditionBuilder.equal(leftCol, rightCol);
40
+ }
41
+ else {
42
+ throw new RelqBuilderError(`Cannot auto-resolve FK relationship between "${ctx.schemaKey || ctx.tableName}" and "${rightTableKey}"`, { builder: 'join', hint: `Provide a callback with explicit join conditions, or define $foreignKeys on your table definition. Example: .join('${rightTableKey}', (on, ${rightTableKey}, source) => on.equal(${rightTableKey}.id, source.columnName))` });
43
+ }
44
+ }
45
+ const selectedProps = conditionInternals.getSelectedColumns();
46
+ let selectColumns;
47
+ const toSnake = (s) => s.replace(/[A-Z]/g, l => `_${l.toLowerCase()}`);
48
+ if (selectedProps && selectedProps.length > 0) {
49
+ const rightColumns = rightTableDef?.$columns || rightTableDef;
50
+ selectColumns = selectedProps.map(prop => {
51
+ const columnDef = rightColumns?.[prop];
52
+ const sqlName = columnDef?.$columnName || toSnake(prop);
53
+ return { property: prop, sqlName };
54
+ });
55
+ }
56
+ else if (rightTableDef) {
57
+ const rightColumns = rightTableDef.$columns || rightTableDef;
58
+ selectColumns = Object.entries(rightColumns)
59
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
60
+ .map(([propName, colDef]) => ({
61
+ property: propName,
62
+ sqlName: colDef.$columnName || toSnake(propName),
63
+ }));
64
+ }
65
+ const joinClause = {
66
+ type: joinType,
67
+ table: rightTableName,
68
+ alias: rightAlias,
69
+ schemaKey: rightTableKey,
70
+ onClause: conditionInternals.toSQL() || undefined,
71
+ usingColumns: conditionInternals.getUsingColumns() || undefined,
72
+ selectColumns,
73
+ };
74
+ ctx.builder.addStructuredJoin(joinClause);
75
+ }
76
+ export function executeMysqlCorrelatedSubqueryJoin(ctx, tableOrAlias, callback) {
77
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
78
+ ? tableOrAlias
79
+ : [tableOrAlias, tableOrAlias];
80
+ const internal = ctx.relq[INTERNAL];
81
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
82
+ const rightTableDef = internal.getTableDef(rightTableKey);
83
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
84
+ const rightTableName = rightTableDef?.$name || rightTableKey;
85
+ const leftAlias = ctx.builder.getTableIdentifier();
86
+ const leftProxy = createMysqlTableProxy(leftTableName, leftAlias, leftTableDef);
87
+ const rightProxy = createMysqlTableProxy(rightTableName, rightAlias, rightTableDef);
88
+ const builder = new MysqlJoinManyBuilder();
89
+ callback(builder, rightProxy, leftProxy);
90
+ if (builder.getSelectColumns().length === 0 && rightTableDef) {
91
+ const rightColumns = rightTableDef.$columns || rightTableDef;
92
+ const schemaColumns = Object.entries(rightColumns)
93
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
94
+ .map(([propName, colDef]) => {
95
+ const sqlColumn = colDef.$columnName || propName.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
96
+ return {
97
+ $table: rightTableName,
98
+ $alias: rightAlias,
99
+ $column: propName,
100
+ $sqlColumn: sqlColumn,
101
+ $type: undefined,
102
+ };
103
+ });
104
+ if (schemaColumns.length > 0) {
105
+ builder.selectRefs(schemaColumns);
106
+ }
107
+ }
108
+ const subquerySQL = builder.toCorrelatedSubquerySQL(rightTableName, rightAlias, leftAlias);
109
+ ctx.builder.addIncludeExpression(rightAlias, subquerySQL);
110
+ }
111
+ export function executeMysqlJoinManyThrough(ctx, targetTableOrAlias, junctionTableKey, callback) {
112
+ const [targetKey, targetAlias] = Array.isArray(targetTableOrAlias)
113
+ ? targetTableOrAlias
114
+ : [targetTableOrAlias, targetTableOrAlias];
115
+ const internal = ctx.relq[INTERNAL];
116
+ const schema = internal.getSchema();
117
+ if (!schema) {
118
+ throw new RelqBuilderError('Cannot use { through } without schema', { builder: 'joinMany', hint: 'Define $foreignKeys on your tables to use the { through } pattern, or use the callback form of joinMany instead' });
119
+ }
120
+ const junctionTableDef = internal.getTableDef(junctionTableKey);
121
+ const targetTableDef = internal.getTableDef(targetKey);
122
+ const junctionTableName = junctionTableDef?.$name || junctionTableKey;
123
+ const targetTableName = targetTableDef?.$name || targetKey;
124
+ const leftAlias = ctx.builder.getTableIdentifier();
125
+ const leftToJunction = resolveMysqlForeignKey(schema, ctx.schemaKey || ctx.tableName, junctionTableKey);
126
+ if (!leftToJunction) {
127
+ throw new RelqBuilderError(`Cannot resolve FK between "${ctx.schemaKey || ctx.tableName}" and junction table "${junctionTableKey}"`, { builder: 'joinMany', hint: 'Define $foreignKeys on your table definitions, or use the callback form of joinMany instead' });
128
+ }
129
+ const junctionToTarget = resolveMysqlForeignKey(schema, junctionTableKey, targetKey);
130
+ if (!junctionToTarget) {
131
+ throw new RelqBuilderError(`Cannot resolve FK between junction table "${junctionTableKey}" and target table "${targetKey}"`, { builder: 'joinMany', hint: 'Define $foreignKeys on your table definitions, or use the callback form of joinMany instead' });
132
+ }
133
+ const conditionBuilder = new MysqlJoinManyBuilder();
134
+ if (callback) {
135
+ callback(conditionBuilder);
136
+ }
137
+ const subquerySQL = buildThroughCorrelatedSubquery(junctionTableName, junctionTableKey, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, conditionBuilder, targetTableDef);
138
+ ctx.builder.addIncludeExpression(targetAlias, subquerySQL);
139
+ }
140
+ function buildThroughCorrelatedSubquery(junctionTableName, _junctionAlias, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, builder, targetTableDef) {
141
+ const toSnake = (s) => s.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
142
+ let columnDefs = [];
143
+ const userSelectCols = builder.getSelectColumns();
144
+ if (userSelectCols.length > 0) {
145
+ columnDefs = userSelectCols.map(col => ({
146
+ property: col.$column,
147
+ sqlName: col.$sqlColumn,
148
+ }));
149
+ }
150
+ else if (targetTableDef) {
151
+ const targetColumns = targetTableDef.$columns || targetTableDef;
152
+ columnDefs = Object.entries(targetColumns)
153
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
154
+ .map(([propName, colDef]) => ({
155
+ property: propName,
156
+ sqlName: colDef.$columnName || toSnake(propName),
157
+ }));
158
+ }
159
+ const parts = [];
160
+ parts.push('SELECT');
161
+ if (columnDefs.length > 0) {
162
+ const selectCols = columnDefs.map(col => `${mysqlFormat.ident(targetAlias)}.${mysqlFormat.ident(col.sqlName)} AS ${mysqlFormat.ident(col.property)}`).join(', ');
163
+ parts.push(selectCols);
164
+ }
165
+ else {
166
+ parts.push(`${mysqlFormat.ident(targetAlias)}.*`);
167
+ }
168
+ parts.push(`FROM ${mysqlFormat.ident(junctionTableName)}`);
169
+ parts.push(`JOIN ${mysqlFormat.ident(targetTableName)} AS ${mysqlFormat.ident(targetAlias)}` +
170
+ ` ON ${mysqlFormat.ident(junctionTableName)}.${mysqlFormat.ident(junctionToTarget.fromColumn)}` +
171
+ ` = ${mysqlFormat.ident(targetAlias)}.${mysqlFormat.ident(junctionToTarget.toColumn)}`);
172
+ let whereClause = `${mysqlFormat.ident(junctionTableName)}.${mysqlFormat.ident(leftToJunction.toColumn)}` +
173
+ ` = ${mysqlFormat.ident(leftAlias)}.${mysqlFormat.ident(leftToJunction.fromColumn)}`;
174
+ const conditionInternals = builder[MYSQL_JOIN_INTERNAL];
175
+ const userWhereSQL = conditionInternals.toSQL();
176
+ if (userWhereSQL) {
177
+ whereClause += ` AND ${userWhereSQL}`;
178
+ }
179
+ parts.push(`WHERE ${whereClause}`);
180
+ const orderSpecs = builder.getOrderBySpecs();
181
+ if (orderSpecs.length > 0) {
182
+ const orderSQL = orderSpecs.map(spec => `${mysqlFormat.ident(spec.column.$sqlColumn)} ${spec.direction}`).join(', ');
183
+ parts.push(`ORDER BY ${orderSQL}`);
184
+ }
185
+ const limit = builder.getLimit();
186
+ if (limit !== undefined) {
187
+ parts.push(`LIMIT ${limit}`);
188
+ }
189
+ const offset = builder.getOffset();
190
+ if (offset !== undefined) {
191
+ parts.push(`OFFSET ${offset}`);
192
+ }
193
+ const innerQuery = parts.join(' ');
194
+ let jsonObjectParts;
195
+ if (columnDefs.length > 0) {
196
+ jsonObjectParts = columnDefs
197
+ .map(col => `${mysqlFormat.literal(col.property)}, \`sub\`.${mysqlFormat.ident(col.property)}`)
198
+ .join(', ');
199
+ }
200
+ else {
201
+ jsonObjectParts = "'__all', `sub`.*";
202
+ }
203
+ const wrappedQuery = `SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(${jsonObjectParts})), CAST('[]' AS JSON))` +
204
+ ` AS ${mysqlFormat.ident(targetAlias)} FROM (${innerQuery}) AS \`sub\``;
205
+ return `(${wrappedQuery})`;
206
+ }
207
+ export function executeMysqlLateralJoin(ctx, joinType, tableOrAlias, callback) {
208
+ requireCapability(ctx.relq, 'lateral', 'LATERAL JOIN', 'Use the correlated subquery path (.joinMany) which works on all MySQL family dialects.');
209
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
210
+ ? tableOrAlias
211
+ : [tableOrAlias, tableOrAlias];
212
+ const internal = ctx.relq[INTERNAL];
213
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
214
+ const rightTableDef = internal.getTableDef(rightTableKey);
215
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
216
+ const rightTableName = rightTableDef?.$name || rightTableKey;
217
+ const leftAlias = ctx.builder.getTableIdentifier();
218
+ const leftProxy = createMysqlTableProxy(leftTableName, leftAlias, leftTableDef);
219
+ const rightProxy = createMysqlTableProxy(rightTableName, rightAlias, rightTableDef);
220
+ const builder = new MysqlJoinManyBuilder();
221
+ callback(builder, rightProxy, leftProxy);
222
+ if (builder.getSelectColumns().length === 0 && rightTableDef) {
223
+ const rightColumns = rightTableDef.$columns || rightTableDef;
224
+ const schemaColumns = Object.entries(rightColumns)
225
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
226
+ .map(([propName, colDef]) => {
227
+ const sqlColumn = colDef.$columnName || propName.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
228
+ return {
229
+ $table: rightTableName,
230
+ $alias: rightAlias,
231
+ $column: propName,
232
+ $sqlColumn: sqlColumn,
233
+ $type: undefined,
234
+ };
235
+ });
236
+ if (schemaColumns.length > 0) {
237
+ builder.selectRefs(schemaColumns);
238
+ }
239
+ }
240
+ const lateralSQL = buildMysqlLateralSubquery(rightTableName, rightAlias, leftAlias, builder, rightTableDef);
241
+ const lateralJoinType = joinType === 'LEFT JOIN' ? 'LEFT JOIN LATERAL' : 'JOIN LATERAL';
242
+ const joinClause = {
243
+ type: lateralJoinType,
244
+ table: rightTableName,
245
+ alias: rightAlias,
246
+ schemaKey: rightTableKey,
247
+ lateralSubquery: lateralSQL,
248
+ };
249
+ ctx.builder.addStructuredJoin(joinClause);
250
+ }
251
+ function buildMysqlLateralSubquery(tableName, alias, _leftAlias, builder, tableDef) {
252
+ const toSnake = (s) => s.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
253
+ let columnDefs = [];
254
+ const userSelectCols = builder.getSelectColumns();
255
+ if (userSelectCols.length > 0) {
256
+ columnDefs = userSelectCols.map(col => ({
257
+ property: col.$column,
258
+ sqlName: col.$sqlColumn,
259
+ }));
260
+ }
261
+ else if (tableDef) {
262
+ const tableColumns = tableDef.$columns || tableDef;
263
+ columnDefs = Object.entries(tableColumns)
264
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
265
+ .map(([propName, colDef]) => ({
266
+ property: propName,
267
+ sqlName: colDef.$columnName || toSnake(propName),
268
+ }));
269
+ }
270
+ const parts = [];
271
+ parts.push('SELECT');
272
+ if (columnDefs.length > 0) {
273
+ const selectCols = columnDefs.map(col => `${mysqlFormat.ident(alias)}.${mysqlFormat.ident(col.sqlName)} AS ${mysqlFormat.ident(col.property)}`).join(', ');
274
+ parts.push(selectCols);
275
+ }
276
+ else {
277
+ parts.push(`${mysqlFormat.ident(alias)}.*`);
278
+ }
279
+ parts.push(`FROM ${mysqlFormat.ident(tableName)} AS ${mysqlFormat.ident(alias)}`);
280
+ const whereParts = [];
281
+ for (const cond of builder.conditions || []) {
282
+ if (cond.type === 'using' || cond.type === 'raw') {
283
+ if (cond.raw)
284
+ whereParts.push(cond.raw);
285
+ continue;
286
+ }
287
+ if (cond.type === 'ilike') {
288
+ const leftSQL = mysqlColumnRefToSQL(cond.left);
289
+ const rightSQL = formatJoinRightSide(cond.right);
290
+ whereParts.push(`LOWER(${leftSQL}) LIKE LOWER(${rightSQL})`);
291
+ continue;
292
+ }
293
+ const leftSQL = mysqlColumnRefToSQL(cond.left);
294
+ const rightSQL = formatJoinRightSide(cond.right);
295
+ whereParts.push(`${leftSQL} ${cond.operator} ${rightSQL}`);
296
+ }
297
+ if (whereParts.length > 0) {
298
+ parts.push(`WHERE ${whereParts.join(' AND ')}`);
299
+ }
300
+ const groupByColumns = builder.groupByColumns;
301
+ if (groupByColumns && groupByColumns.length > 0) {
302
+ const groupBySQL = groupByColumns
303
+ .map((col) => mysqlColumnRefToSQLUnqualified(col))
304
+ .join(', ');
305
+ parts.push(`GROUP BY ${groupBySQL}`);
306
+ }
307
+ const havingConditions = builder.havingConditions;
308
+ if (havingConditions && havingConditions.length > 0) {
309
+ const havingSQL = buildMysqlConditionsSQL(havingConditions);
310
+ if (havingSQL) {
311
+ parts.push(`HAVING ${havingSQL}`);
312
+ }
313
+ }
314
+ const orderSpecs = builder.getOrderBySpecs();
315
+ if (orderSpecs.length > 0) {
316
+ const orderSQL = orderSpecs.map(spec => `${mysqlColumnRefToSQLUnqualified(spec.column)} ${spec.direction}`).join(', ');
317
+ parts.push(`ORDER BY ${orderSQL}`);
318
+ }
319
+ const limit = builder.getLimit();
320
+ if (limit !== undefined) {
321
+ parts.push(`LIMIT ${limit}`);
322
+ }
323
+ const offset = builder.getOffset();
324
+ if (offset !== undefined) {
325
+ parts.push(`OFFSET ${offset}`);
326
+ }
327
+ const innerQuery = parts.join(' ');
328
+ let jsonObjectParts;
329
+ if (columnDefs.length > 0) {
330
+ jsonObjectParts = columnDefs
331
+ .map(col => `${mysqlFormat.literal(col.property)}, \`sub\`.${mysqlFormat.ident(col.property)}`)
332
+ .join(', ');
333
+ }
334
+ else {
335
+ jsonObjectParts = "'__all', `sub`.*";
336
+ }
337
+ const outerQuery = `(SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(${jsonObjectParts})), CAST('[]' AS JSON))` +
338
+ ` AS ${mysqlFormat.ident(alias)}` +
339
+ ` FROM (${innerQuery}) AS \`sub\`)` +
340
+ ` AS ${mysqlFormat.ident(`${alias}_lateral`)}`;
341
+ return outerQuery;
342
+ }
343
+ function formatJoinRightSide(right) {
344
+ if (right && typeof right === 'object' && '$table' in right) {
345
+ return mysqlColumnRefToSQL(right);
346
+ }
347
+ return mysqlFormat.literal(right);
348
+ }
349
+ export function executeMysqlLateralJoinThrough(ctx, joinType, targetTableOrAlias, junctionTableKey, callback) {
350
+ requireCapability(ctx.relq, 'lateral', 'LATERAL JOIN', 'Use the correlated subquery path (.joinMany with { through }) which works on all MySQL family dialects.');
351
+ const [targetKey, targetAlias] = Array.isArray(targetTableOrAlias)
352
+ ? targetTableOrAlias
353
+ : [targetTableOrAlias, targetTableOrAlias];
354
+ const internal = ctx.relq[INTERNAL];
355
+ const schema = internal.getSchema();
356
+ if (!schema) {
357
+ throw new RelqBuilderError('Cannot use { through } without schema', { builder: 'joinManyLateral', hint: 'Define $foreignKeys on your tables to use the { through } pattern, or use the callback form of joinMany instead' });
358
+ }
359
+ const junctionTableDef = internal.getTableDef(junctionTableKey);
360
+ const targetTableDef = internal.getTableDef(targetKey);
361
+ const junctionTableName = junctionTableDef?.$name || junctionTableKey;
362
+ const targetTableName = targetTableDef?.$name || targetKey;
363
+ const leftAlias = ctx.builder.getTableIdentifier();
364
+ const leftToJunction = resolveMysqlForeignKey(schema, ctx.schemaKey || ctx.tableName, junctionTableKey);
365
+ if (!leftToJunction) {
366
+ throw new RelqBuilderError(`Cannot resolve FK between "${ctx.schemaKey || ctx.tableName}" and junction table "${junctionTableKey}"`, { builder: 'joinManyLateral', hint: 'Define $foreignKeys on your table definitions, or use the callback form of joinMany instead' });
367
+ }
368
+ const junctionToTarget = resolveMysqlForeignKey(schema, junctionTableKey, targetKey);
369
+ if (!junctionToTarget) {
370
+ throw new RelqBuilderError(`Cannot resolve FK between junction table "${junctionTableKey}" and target table "${targetKey}"`, { builder: 'joinManyLateral', hint: 'Define $foreignKeys on your table definitions, or use the callback form of joinMany instead' });
371
+ }
372
+ const conditionBuilder = new MysqlJoinManyBuilder();
373
+ if (callback) {
374
+ callback(conditionBuilder);
375
+ }
376
+ const lateralSQL = buildMysqlThroughLateralSubquery(junctionTableName, junctionTableKey, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, conditionBuilder, targetTableDef);
377
+ const lateralJoinType = joinType === 'LEFT JOIN' ? 'LEFT JOIN LATERAL' : 'JOIN LATERAL';
378
+ const joinClause = {
379
+ type: lateralJoinType,
380
+ table: targetTableName,
381
+ alias: targetAlias,
382
+ schemaKey: targetKey,
383
+ lateralSubquery: lateralSQL,
384
+ };
385
+ ctx.builder.addStructuredJoin(joinClause);
386
+ }
387
+ function buildMysqlThroughLateralSubquery(junctionTableName, _junctionAlias, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, builder, targetTableDef) {
388
+ const toSnake = (s) => s.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
389
+ let columnDefs = [];
390
+ const userSelectCols = builder.getSelectColumns();
391
+ if (userSelectCols.length > 0) {
392
+ columnDefs = userSelectCols.map(col => ({
393
+ property: col.$column,
394
+ sqlName: col.$sqlColumn,
395
+ }));
396
+ }
397
+ else if (targetTableDef) {
398
+ const targetColumns = targetTableDef.$columns || targetTableDef;
399
+ columnDefs = Object.entries(targetColumns)
400
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
401
+ .map(([propName, colDef]) => ({
402
+ property: propName,
403
+ sqlName: colDef.$columnName || toSnake(propName),
404
+ }));
405
+ }
406
+ const parts = [];
407
+ parts.push('SELECT');
408
+ if (columnDefs.length > 0) {
409
+ const selectCols = columnDefs.map(col => `${mysqlFormat.ident(targetAlias)}.${mysqlFormat.ident(col.sqlName)} AS ${mysqlFormat.ident(col.property)}`).join(', ');
410
+ parts.push(selectCols);
411
+ }
412
+ else {
413
+ parts.push(`${mysqlFormat.ident(targetAlias)}.*`);
414
+ }
415
+ parts.push(`FROM ${mysqlFormat.ident(junctionTableName)}`);
416
+ parts.push(`JOIN ${mysqlFormat.ident(targetTableName)} AS ${mysqlFormat.ident(targetAlias)}` +
417
+ ` ON ${mysqlFormat.ident(junctionTableName)}.${mysqlFormat.ident(junctionToTarget.fromColumn)}` +
418
+ ` = ${mysqlFormat.ident(targetAlias)}.${mysqlFormat.ident(junctionToTarget.toColumn)}`);
419
+ let whereClause = `${mysqlFormat.ident(junctionTableName)}.${mysqlFormat.ident(leftToJunction.toColumn)}` +
420
+ ` = ${mysqlFormat.ident(leftAlias)}.${mysqlFormat.ident(leftToJunction.fromColumn)}`;
421
+ const conditionInternals = builder[MYSQL_JOIN_INTERNAL];
422
+ const userWhereSQL = conditionInternals.toSQL();
423
+ if (userWhereSQL) {
424
+ whereClause += ` AND ${userWhereSQL}`;
425
+ }
426
+ parts.push(`WHERE ${whereClause}`);
427
+ const orderSpecs = builder.getOrderBySpecs();
428
+ if (orderSpecs.length > 0) {
429
+ const orderSQL = orderSpecs.map(spec => `${mysqlFormat.ident(spec.column.$sqlColumn)} ${spec.direction}`).join(', ');
430
+ parts.push(`ORDER BY ${orderSQL}`);
431
+ }
432
+ const limit = builder.getLimit();
433
+ if (limit !== undefined) {
434
+ parts.push(`LIMIT ${limit}`);
435
+ }
436
+ const offset = builder.getOffset();
437
+ if (offset !== undefined) {
438
+ parts.push(`OFFSET ${offset}`);
439
+ }
440
+ const innerQuery = parts.join(' ');
441
+ let jsonObjectParts;
442
+ if (columnDefs.length > 0) {
443
+ jsonObjectParts = columnDefs
444
+ .map(col => `${mysqlFormat.literal(col.property)}, \`sub\`.${mysqlFormat.ident(col.property)}`)
445
+ .join(', ');
446
+ }
447
+ else {
448
+ jsonObjectParts = "'__all', `sub`.*";
449
+ }
450
+ const outerQuery = `(SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(${jsonObjectParts})), CAST('[]' AS JSON))` +
451
+ ` AS ${mysqlFormat.ident(targetAlias)}` +
452
+ ` FROM (${innerQuery}) AS \`sub\`)` +
453
+ ` AS ${mysqlFormat.ident(`${targetAlias}_lateral`)}`;
454
+ return outerQuery;
455
+ }
@@ -0,0 +1,186 @@
1
+ import { randomLimit, } from "../../types/pagination-types.js";
2
+ import { INTERNAL } from "../../core/helpers/methods.js";
3
+ import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
4
+ export async function executeMysqlCursorEach(ctx, callback, options = {}) {
5
+ const batchSize = options.batchSize ?? 100;
6
+ const baseSql = ctx.builder.toString();
7
+ const cleanSql = baseSql
8
+ .replace(/\s+LIMIT\s+\d+/gi, '')
9
+ .replace(/\s+OFFSET\s+\d+/gi, '');
10
+ let offset = 0;
11
+ let index = 0;
12
+ let shouldContinue = true;
13
+ while (shouldContinue) {
14
+ const batchSql = `${cleanSql} LIMIT ${batchSize} OFFSET ${offset}`;
15
+ const result = await ctx.relq[INTERNAL].executeSelect(batchSql, ctx.tableName);
16
+ if (result.data.length === 0) {
17
+ break;
18
+ }
19
+ for (const row of result.data) {
20
+ const callbackResult = await callback(row, index++);
21
+ if (callbackResult === false) {
22
+ shouldContinue = false;
23
+ break;
24
+ }
25
+ }
26
+ if (result.data.length < batchSize) {
27
+ break;
28
+ }
29
+ offset += batchSize;
30
+ }
31
+ }
32
+ export async function executeMysqlPagination(ctx, options, recurse) {
33
+ if (!options.mode || !['paging', 'offset'].includes(options.mode)) {
34
+ throw new RelqBuilderError('pagination() requires "mode" to be one of: \'paging\', \'offset\'', { builder: 'paginate', hint: 'Use .paging({ page, perPage }) for page-based or .offset({ position, limit }) for offset-based pagination' });
35
+ }
36
+ const orderByArr = options.orderBy
37
+ ? (Array.isArray(options.orderBy[0]) ? options.orderBy : [options.orderBy])
38
+ : [];
39
+ for (const [column, direction] of orderByArr) {
40
+ const dbColumn = ctx.relq[INTERNAL].hasColumnMapping()
41
+ ? Object.keys(ctx.relq[INTERNAL].transformToDbColumns(ctx.tableName, { [column]: true }))[0]
42
+ : column;
43
+ ctx.builder.orderBy(dbColumn, direction);
44
+ }
45
+ const isPaging = options.mode === 'paging';
46
+ const shouldCount = options.count ?? isPaging;
47
+ let total = 0;
48
+ if (shouldCount) {
49
+ const countSql = ctx.builder.toCountSQL();
50
+ const countResult = await ctx.relq[INTERNAL].executeCount(countSql);
51
+ total = countResult.count;
52
+ }
53
+ if (isPaging) {
54
+ return executePagingMode(ctx, options, total, recurse);
55
+ }
56
+ if (options.mode === 'offset') {
57
+ return executeOffsetMode(ctx, options, total, shouldCount, recurse);
58
+ }
59
+ throw new RelqBuilderError('Invalid pagination mode', { builder: 'paginate', hint: 'Use .paging({ page, perPage }) or .offset({ position, limit })' });
60
+ }
61
+ async function executePagingMode(ctx, options, total, recurse) {
62
+ const { page, perPage } = options;
63
+ if (typeof page !== 'number' || isNaN(page) || page < 1) {
64
+ throw new RelqBuilderError('pagination() paging mode requires "page" as a positive number (1-indexed)', { builder: 'paginate', hint: 'Page numbers are 1-indexed, starting from 1' });
65
+ }
66
+ if (typeof perPage !== 'number' || isNaN(perPage) || perPage < 1) {
67
+ throw new RelqBuilderError('pagination() paging mode requires "perPage" as a positive number', { builder: 'paginate', hint: 'Set perPage to the number of items you want per page (e.g. 20)' });
68
+ }
69
+ const offset = (page - 1) * perPage;
70
+ ctx.builder.limit(perPage);
71
+ ctx.builder.offset(offset);
72
+ const sql = ctx.builder.toString();
73
+ const result = await ctx.relq[INTERNAL].executeSelect(sql, ctx.tableName);
74
+ const totalPages = Math.ceil(total / perPage);
75
+ const hasNext = page < totalPages;
76
+ const hasPrev = page > 1;
77
+ const pagination = {
78
+ page,
79
+ perPage,
80
+ total,
81
+ totalPages,
82
+ };
83
+ if (hasNext) {
84
+ pagination.hasNext = true;
85
+ pagination.nextPage = page + 1;
86
+ Object.defineProperty(pagination, 'loadNext', {
87
+ value: () => recurse({ ...options, page: page + 1 }),
88
+ enumerable: false,
89
+ configurable: false,
90
+ });
91
+ }
92
+ else {
93
+ pagination.hasNext = false;
94
+ }
95
+ if (hasPrev) {
96
+ pagination.hasPrev = true;
97
+ pagination.prevPage = page - 1;
98
+ Object.defineProperty(pagination, 'loadPrev', {
99
+ value: () => recurse({ ...options, page: page - 1 }),
100
+ enumerable: false,
101
+ configurable: false,
102
+ });
103
+ }
104
+ else {
105
+ pagination.hasPrev = false;
106
+ }
107
+ addInspectProperties(pagination, () => {
108
+ const visible = { page, perPage, total, totalPages, hasNext };
109
+ if (hasNext)
110
+ visible.nextPage = page + 1;
111
+ visible.hasPrev = hasPrev;
112
+ if (hasPrev)
113
+ visible.prevPage = page - 1;
114
+ return visible;
115
+ });
116
+ return { data: result.data, pagination };
117
+ }
118
+ async function executeOffsetMode(ctx, options, total, shouldCount, recurse) {
119
+ const { position, limit: limitOpt } = options;
120
+ if (typeof position !== 'number' || isNaN(position)) {
121
+ throw new RelqBuilderError('pagination() offset mode requires "position" as a number', { builder: 'paginate', hint: 'Set position to the starting row offset (0-indexed)' });
122
+ }
123
+ if (limitOpt === undefined || (typeof limitOpt !== 'number' && !Array.isArray(limitOpt))) {
124
+ throw new RelqBuilderError('pagination() offset mode requires "limit" as a number or [min, max] array', { builder: 'paginate', hint: 'Pass limit as a number (e.g. 50) or a [min, max] tuple for random limit' });
125
+ }
126
+ const limit = Array.isArray(limitOpt) ? randomLimit(limitOpt) : limitOpt;
127
+ ctx.builder.limit(limit + 1);
128
+ ctx.builder.offset(position);
129
+ const sql = ctx.builder.toString();
130
+ const result = await ctx.relq[INTERNAL].executeSelect(sql, ctx.tableName);
131
+ const hasMore = result.data.length > limit;
132
+ const hasPrev = position > 0;
133
+ const data = hasMore ? result.data.slice(0, limit) : result.data;
134
+ const pagination = {
135
+ position,
136
+ limit,
137
+ ...(shouldCount && { total }),
138
+ };
139
+ if (hasMore) {
140
+ pagination.hasMore = true;
141
+ pagination.nextPos = position + limit;
142
+ Object.defineProperty(pagination, 'loadNext', {
143
+ value: () => recurse({ ...options, position: position + limit }),
144
+ enumerable: false,
145
+ configurable: false,
146
+ });
147
+ }
148
+ else {
149
+ pagination.hasMore = false;
150
+ }
151
+ if (hasPrev) {
152
+ pagination.hasPrev = true;
153
+ pagination.prevPos = Math.max(0, position - limit);
154
+ Object.defineProperty(pagination, 'loadPrev', {
155
+ value: () => recurse({ ...options, position: Math.max(0, position - limit) }),
156
+ enumerable: false,
157
+ configurable: false,
158
+ });
159
+ }
160
+ else {
161
+ pagination.hasPrev = false;
162
+ }
163
+ addInspectProperties(pagination, () => {
164
+ const visible = { position, limit };
165
+ if (shouldCount)
166
+ visible.total = total;
167
+ visible.hasMore = hasMore;
168
+ if (hasMore)
169
+ visible.nextPos = position + limit;
170
+ visible.hasPrev = hasPrev;
171
+ if (hasPrev)
172
+ visible.prevPos = Math.max(0, position - limit);
173
+ return visible;
174
+ });
175
+ return { data, pagination };
176
+ }
177
+ function addInspectProperties(obj, getVisibleProps) {
178
+ Object.defineProperty(obj, Symbol.for('nodejs.util.inspect.custom'), {
179
+ value: () => getVisibleProps(),
180
+ enumerable: false,
181
+ });
182
+ Object.defineProperty(obj, 'toJSON', {
183
+ value: () => getVisibleProps(),
184
+ enumerable: false,
185
+ });
186
+ }