@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,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeMysqlFindById = executeMysqlFindById;
4
+ exports.executeMysqlFindOne = executeMysqlFindOne;
5
+ exports.executeMysqlFindMany = executeMysqlFindMany;
6
+ exports.executeMysqlExists = executeMysqlExists;
7
+ exports.executeMysqlUpsert = executeMysqlUpsert;
8
+ exports.executeMysqlSoftDelete = executeMysqlSoftDelete;
9
+ exports.executeMysqlRestore = executeMysqlRestore;
10
+ exports.executeMysqlCreateWith = executeMysqlCreateWith;
11
+ exports.getMysqlPrimaryKeyColumn = getMysqlPrimaryKeyColumn;
12
+ const count_builder_1 = require("../count/count-builder.cjs");
13
+ const insert_builder_1 = require("../insert/insert-builder.cjs");
14
+ const select_builder_1 = require("../select/select-builder.cjs");
15
+ const update_builder_1 = require("../update/update-builder.cjs");
16
+ const fk_resolver_1 = require("../utils/fk-resolver.cjs");
17
+ const methods_1 = require("../../core/helpers/methods.cjs");
18
+ const relq_errors_1 = require("../../shared/errors/relq-errors.cjs");
19
+ async function executeMysqlFindById(ctx, id, getPrimaryKeyColumn) {
20
+ const pkColumn = getPrimaryKeyColumn();
21
+ const dbColumn = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, { [pkColumn]: id });
22
+ const dbColName = Object.keys(dbColumn)[0];
23
+ const builder = new select_builder_1.MysqlSelectBuilder(ctx.tableName, ['*']);
24
+ builder.where(q => q.equal(dbColName, id));
25
+ builder.limit(1);
26
+ const sql = builder.toString();
27
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelectOne(sql, ctx.tableName);
28
+ return result.data;
29
+ }
30
+ async function executeMysqlFindOne(ctx, filter) {
31
+ const builder = new select_builder_1.MysqlSelectBuilder(ctx.tableName, ['*']);
32
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
33
+ builder.where(q => {
34
+ for (const [col, val] of Object.entries(dbFilter)) {
35
+ q.equal(col, val);
36
+ }
37
+ return q;
38
+ });
39
+ builder.limit(1);
40
+ const sql = builder.toString();
41
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelectOne(sql, ctx.tableName);
42
+ return result.data;
43
+ }
44
+ async function executeMysqlFindMany(ctx, filter) {
45
+ const builder = new select_builder_1.MysqlSelectBuilder(ctx.tableName, ['*']);
46
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
47
+ builder.where(q => {
48
+ for (const [col, val] of Object.entries(dbFilter)) {
49
+ q.equal(col, val);
50
+ }
51
+ return q;
52
+ });
53
+ const sql = builder.toString();
54
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelect(sql, ctx.tableName);
55
+ return result.data;
56
+ }
57
+ async function executeMysqlExists(ctx, filter) {
58
+ const builder = new count_builder_1.MysqlCountBuilder(ctx.tableName);
59
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
60
+ builder.where(q => {
61
+ for (const [col, val] of Object.entries(dbFilter)) {
62
+ q.equal(col, val);
63
+ }
64
+ return q;
65
+ });
66
+ const sql = builder.toString();
67
+ const result = await ctx.relq[methods_1.INTERNAL].executeCount(sql);
68
+ return result.count > 0;
69
+ }
70
+ async function executeMysqlUpsert(ctx, options) {
71
+ const internal = ctx.relq[methods_1.INTERNAL];
72
+ const dbCreate = internal.transformToDbColumns(ctx.tableName, options.create);
73
+ const dbUpdate = internal.transformToDbColumns(ctx.tableName, options.update);
74
+ const dbWhere = internal.transformToDbColumns(ctx.tableName, options.where);
75
+ const builder = new insert_builder_1.MysqlInsertBuilder(ctx.tableName, dbCreate);
76
+ builder.onDuplicateKeyUpdate(dup => {
77
+ dup.doUpdate(dbUpdate);
78
+ });
79
+ const sql = builder.toString();
80
+ await internal.executeRun(sql);
81
+ const selectBuilder = new select_builder_1.MysqlSelectBuilder(ctx.tableName, ['*']);
82
+ selectBuilder.where(q => {
83
+ for (const [col, val] of Object.entries(dbWhere)) {
84
+ q.equal(col, val);
85
+ }
86
+ return q;
87
+ });
88
+ selectBuilder.limit(1);
89
+ const selectResult = await internal.executeSelectOne(selectBuilder.toString(), ctx.tableName);
90
+ return selectResult.data;
91
+ }
92
+ async function executeMysqlSoftDelete(ctx, filter) {
93
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
94
+ const builder = new update_builder_1.MysqlUpdateBuilder(ctx.tableName);
95
+ builder.set({ deleted_at: new Date() });
96
+ builder.where(q => {
97
+ for (const [col, val] of Object.entries(dbFilter)) {
98
+ q.equal(col, val);
99
+ }
100
+ return q;
101
+ });
102
+ const sql = builder.toString();
103
+ const result = await ctx.relq[methods_1.INTERNAL].executeRun(sql);
104
+ return result.metadata.rowCount ?? 0;
105
+ }
106
+ async function executeMysqlRestore(ctx, filter) {
107
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
108
+ const builder = new update_builder_1.MysqlUpdateBuilder(ctx.tableName);
109
+ builder.set({ deleted_at: null });
110
+ builder.where(q => {
111
+ for (const [col, val] of Object.entries(dbFilter)) {
112
+ q.equal(col, val);
113
+ }
114
+ return q;
115
+ });
116
+ const sql = builder.toString();
117
+ const result = await ctx.relq[methods_1.INTERNAL].executeRun(sql);
118
+ return result.metadata.rowCount ?? 0;
119
+ }
120
+ async function executeMysqlCreateWith(ctx, parentData, related) {
121
+ const internal = ctx.relq[methods_1.INTERNAL];
122
+ const schema = internal.getSchema();
123
+ if (!schema) {
124
+ throw new relq_errors_1.RelqBuilderError('Cannot use createWith() without schema', { builder: 'createWith', hint: 'Pass schema to your Relq client, or use separate insert calls with a transaction instead' });
125
+ }
126
+ const parentSchemaKey = findSchemaKeyByTableName(schema, ctx.tableName) || ctx.tableName;
127
+ try {
128
+ await internal.executeRun('START TRANSACTION');
129
+ const dbParent = internal.transformToDbColumns(ctx.tableName, parentData);
130
+ const parentBuilder = new insert_builder_1.MysqlInsertBuilder(ctx.tableName, dbParent);
131
+ const parentSQL = parentBuilder.toString();
132
+ await internal.executeRun(parentSQL);
133
+ const pkColumn = getMysqlPrimaryKeyColumn(ctx.relq, parentSchemaKey);
134
+ const dbPkColumn = Object.keys(internal.transformToDbColumns(ctx.tableName, { [pkColumn]: true }))[0] || pkColumn;
135
+ const selectParentSQL = `SELECT * FROM \`${ctx.tableName}\` WHERE \`${dbPkColumn}\` = LAST_INSERT_ID() LIMIT 1`;
136
+ const parentResult = await internal.executeQuery(selectParentSQL);
137
+ if (!parentResult.result.rows || parentResult.result.rows.length === 0) {
138
+ throw new relq_errors_1.RelqBuilderError('Parent insert returned no rows via LAST_INSERT_ID()', { builder: 'createWith', hint: 'Ensure the table has an AUTO_INCREMENT primary key and the insert data is valid' });
139
+ }
140
+ const parentRow = parentResult.result.rows[0];
141
+ for (const [relationKey, childData] of Object.entries(related)) {
142
+ const childTableDef = schema[relationKey];
143
+ if (!childTableDef) {
144
+ throw new relq_errors_1.RelqBuilderError(`Unknown table "${relationKey}" in createWith()`, { builder: 'createWith', hint: 'Verify the relation key matches a table name defined in your schema' });
145
+ }
146
+ const childTableName = childTableDef.$name || relationKey;
147
+ const fk = (0, fk_resolver_1.resolveMysqlForeignKey)(schema, parentSchemaKey, relationKey);
148
+ if (!fk) {
149
+ throw new relq_errors_1.RelqBuilderError(`No FK relationship between "${parentSchemaKey}" and "${relationKey}"`, { builder: 'createWith', hint: 'Define $foreignKeys on your table definitions, or use separate insert calls with explicit FK values' });
150
+ }
151
+ let fkColumn;
152
+ let fkValue;
153
+ if (fk.direction === 'reverse') {
154
+ fkColumn = fk.toColumn;
155
+ fkValue = parentRow[fk.fromColumn];
156
+ }
157
+ else {
158
+ fkColumn = fk.fromColumn;
159
+ fkValue = parentRow[fk.toColumn];
160
+ }
161
+ const rows = Array.isArray(childData) ? childData : [childData];
162
+ if (rows.length === 0)
163
+ continue;
164
+ const firstChildRow = { ...rows[0], [fkColumn]: fkValue };
165
+ const dbFirstChild = internal.transformToDbColumns(childTableName, firstChildRow);
166
+ const childBuilder = new insert_builder_1.MysqlInsertBuilder(childTableName, dbFirstChild);
167
+ for (let i = 1; i < rows.length; i++) {
168
+ const childRow = { ...rows[i], [fkColumn]: fkValue };
169
+ const dbChild = internal.transformToDbColumns(childTableName, childRow);
170
+ childBuilder.addRow(dbChild);
171
+ }
172
+ const childSQL = childBuilder.toString();
173
+ await internal.executeRun(childSQL);
174
+ }
175
+ await internal.executeRun('COMMIT');
176
+ const transformed = internal.transformResultsFromDb(ctx.tableName, [parentRow]);
177
+ return transformed[0];
178
+ }
179
+ catch (error) {
180
+ try {
181
+ await internal.executeRun('ROLLBACK');
182
+ }
183
+ catch {
184
+ }
185
+ throw error;
186
+ }
187
+ }
188
+ function findSchemaKeyByTableName(schema, tableName) {
189
+ for (const [key, def] of Object.entries(schema)) {
190
+ if (def?.$name === tableName || key === tableName) {
191
+ return key;
192
+ }
193
+ }
194
+ return null;
195
+ }
196
+ function getMysqlPrimaryKeyColumn(relq, tableName) {
197
+ const schema = relq.schema;
198
+ if (schema && schema[tableName]) {
199
+ const tableSchema = schema[tableName];
200
+ const columns = tableSchema.$columns || tableSchema;
201
+ for (const [colName, colDef] of Object.entries(columns)) {
202
+ if (colDef && typeof colDef === 'object' &&
203
+ ('$primaryKey' in colDef ||
204
+ colDef.config?.$primaryKey === true)) {
205
+ return colName;
206
+ }
207
+ }
208
+ }
209
+ return 'id';
210
+ }
@@ -0,0 +1,465 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.executeMysqlTypeSafeJoin = executeMysqlTypeSafeJoin;
7
+ exports.executeMysqlCorrelatedSubqueryJoin = executeMysqlCorrelatedSubqueryJoin;
8
+ exports.executeMysqlJoinManyThrough = executeMysqlJoinManyThrough;
9
+ exports.executeMysqlLateralJoin = executeMysqlLateralJoin;
10
+ exports.executeMysqlLateralJoinThrough = executeMysqlLateralJoinThrough;
11
+ const table_proxy_1 = require("../select/table-proxy.cjs");
12
+ const join_condition_builder_1 = require("../select/join-condition-builder.cjs");
13
+ const join_builder_1 = require("../select/join-builder.cjs");
14
+ const join_internals_1 = require("../select/join-internals.cjs");
15
+ const condition_collector_1 = require("../condition/condition-collector.cjs");
16
+ const fk_resolver_1 = require("../utils/fk-resolver.cjs");
17
+ const methods_1 = require("../../core/helpers/methods.cjs");
18
+ const capability_guard_1 = require("../../core/helpers/capability-guard.cjs");
19
+ const relq_errors_1 = require("../../shared/errors/relq-errors.cjs");
20
+ const mysql_format_1 = __importDefault(require("../clients/shared/mysql-format.cjs"));
21
+ function executeMysqlTypeSafeJoin(ctx, joinType, tableOrAlias, callback) {
22
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
23
+ ? tableOrAlias
24
+ : [tableOrAlias, tableOrAlias];
25
+ const internal = ctx.relq[methods_1.INTERNAL];
26
+ const schema = internal.getSchema();
27
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
28
+ const rightTableDef = internal.getTableDef(rightTableKey);
29
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
30
+ const rightTableName = rightTableDef?.$name || rightTableKey;
31
+ const leftAlias = ctx.builder.getTableIdentifier();
32
+ const leftProxy = (0, table_proxy_1.createMysqlTableProxy)(leftTableName, leftAlias, leftTableDef);
33
+ const rightProxy = (0, table_proxy_1.createMysqlTableProxy)(rightTableName, rightAlias, rightTableDef);
34
+ const conditionBuilder = new join_condition_builder_1.MysqlJoinConditionBuilder();
35
+ if (callback) {
36
+ if (joinType === 'RIGHT JOIN') {
37
+ callback(conditionBuilder, leftProxy, rightProxy);
38
+ }
39
+ else {
40
+ callback(conditionBuilder, rightProxy, leftProxy);
41
+ }
42
+ }
43
+ const conditionInternals = conditionBuilder[join_internals_1.MYSQL_JOIN_INTERNAL];
44
+ if (!conditionInternals.hasConditions() && schema) {
45
+ const fkResolution = (0, fk_resolver_1.resolveMysqlForeignKey)(schema, ctx.schemaKey || ctx.tableName, rightTableKey);
46
+ if (fkResolution) {
47
+ const leftCol = leftProxy[fkResolution.fromColumn];
48
+ const rightCol = rightProxy[fkResolution.toColumn];
49
+ conditionBuilder.equal(leftCol, rightCol);
50
+ }
51
+ else {
52
+ throw new relq_errors_1.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))` });
53
+ }
54
+ }
55
+ const selectedProps = conditionInternals.getSelectedColumns();
56
+ let selectColumns;
57
+ const toSnake = (s) => s.replace(/[A-Z]/g, l => `_${l.toLowerCase()}`);
58
+ if (selectedProps && selectedProps.length > 0) {
59
+ const rightColumns = rightTableDef?.$columns || rightTableDef;
60
+ selectColumns = selectedProps.map(prop => {
61
+ const columnDef = rightColumns?.[prop];
62
+ const sqlName = columnDef?.$columnName || toSnake(prop);
63
+ return { property: prop, sqlName };
64
+ });
65
+ }
66
+ else if (rightTableDef) {
67
+ const rightColumns = rightTableDef.$columns || rightTableDef;
68
+ selectColumns = Object.entries(rightColumns)
69
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
70
+ .map(([propName, colDef]) => ({
71
+ property: propName,
72
+ sqlName: colDef.$columnName || toSnake(propName),
73
+ }));
74
+ }
75
+ const joinClause = {
76
+ type: joinType,
77
+ table: rightTableName,
78
+ alias: rightAlias,
79
+ schemaKey: rightTableKey,
80
+ onClause: conditionInternals.toSQL() || undefined,
81
+ usingColumns: conditionInternals.getUsingColumns() || undefined,
82
+ selectColumns,
83
+ };
84
+ ctx.builder.addStructuredJoin(joinClause);
85
+ }
86
+ function executeMysqlCorrelatedSubqueryJoin(ctx, tableOrAlias, callback) {
87
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
88
+ ? tableOrAlias
89
+ : [tableOrAlias, tableOrAlias];
90
+ const internal = ctx.relq[methods_1.INTERNAL];
91
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
92
+ const rightTableDef = internal.getTableDef(rightTableKey);
93
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
94
+ const rightTableName = rightTableDef?.$name || rightTableKey;
95
+ const leftAlias = ctx.builder.getTableIdentifier();
96
+ const leftProxy = (0, table_proxy_1.createMysqlTableProxy)(leftTableName, leftAlias, leftTableDef);
97
+ const rightProxy = (0, table_proxy_1.createMysqlTableProxy)(rightTableName, rightAlias, rightTableDef);
98
+ const builder = new join_builder_1.MysqlJoinManyBuilder();
99
+ callback(builder, rightProxy, leftProxy);
100
+ if (builder.getSelectColumns().length === 0 && rightTableDef) {
101
+ const rightColumns = rightTableDef.$columns || rightTableDef;
102
+ const schemaColumns = Object.entries(rightColumns)
103
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
104
+ .map(([propName, colDef]) => {
105
+ const sqlColumn = colDef.$columnName || propName.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
106
+ return {
107
+ $table: rightTableName,
108
+ $alias: rightAlias,
109
+ $column: propName,
110
+ $sqlColumn: sqlColumn,
111
+ $type: undefined,
112
+ };
113
+ });
114
+ if (schemaColumns.length > 0) {
115
+ builder.selectRefs(schemaColumns);
116
+ }
117
+ }
118
+ const subquerySQL = builder.toCorrelatedSubquerySQL(rightTableName, rightAlias, leftAlias);
119
+ ctx.builder.addIncludeExpression(rightAlias, subquerySQL);
120
+ }
121
+ function executeMysqlJoinManyThrough(ctx, targetTableOrAlias, junctionTableKey, callback) {
122
+ const [targetKey, targetAlias] = Array.isArray(targetTableOrAlias)
123
+ ? targetTableOrAlias
124
+ : [targetTableOrAlias, targetTableOrAlias];
125
+ const internal = ctx.relq[methods_1.INTERNAL];
126
+ const schema = internal.getSchema();
127
+ if (!schema) {
128
+ throw new relq_errors_1.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' });
129
+ }
130
+ const junctionTableDef = internal.getTableDef(junctionTableKey);
131
+ const targetTableDef = internal.getTableDef(targetKey);
132
+ const junctionTableName = junctionTableDef?.$name || junctionTableKey;
133
+ const targetTableName = targetTableDef?.$name || targetKey;
134
+ const leftAlias = ctx.builder.getTableIdentifier();
135
+ const leftToJunction = (0, fk_resolver_1.resolveMysqlForeignKey)(schema, ctx.schemaKey || ctx.tableName, junctionTableKey);
136
+ if (!leftToJunction) {
137
+ throw new relq_errors_1.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' });
138
+ }
139
+ const junctionToTarget = (0, fk_resolver_1.resolveMysqlForeignKey)(schema, junctionTableKey, targetKey);
140
+ if (!junctionToTarget) {
141
+ throw new relq_errors_1.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' });
142
+ }
143
+ const conditionBuilder = new join_builder_1.MysqlJoinManyBuilder();
144
+ if (callback) {
145
+ callback(conditionBuilder);
146
+ }
147
+ const subquerySQL = buildThroughCorrelatedSubquery(junctionTableName, junctionTableKey, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, conditionBuilder, targetTableDef);
148
+ ctx.builder.addIncludeExpression(targetAlias, subquerySQL);
149
+ }
150
+ function buildThroughCorrelatedSubquery(junctionTableName, _junctionAlias, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, builder, targetTableDef) {
151
+ const toSnake = (s) => s.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
152
+ let columnDefs = [];
153
+ const userSelectCols = builder.getSelectColumns();
154
+ if (userSelectCols.length > 0) {
155
+ columnDefs = userSelectCols.map(col => ({
156
+ property: col.$column,
157
+ sqlName: col.$sqlColumn,
158
+ }));
159
+ }
160
+ else if (targetTableDef) {
161
+ const targetColumns = targetTableDef.$columns || targetTableDef;
162
+ columnDefs = Object.entries(targetColumns)
163
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
164
+ .map(([propName, colDef]) => ({
165
+ property: propName,
166
+ sqlName: colDef.$columnName || toSnake(propName),
167
+ }));
168
+ }
169
+ const parts = [];
170
+ parts.push('SELECT');
171
+ if (columnDefs.length > 0) {
172
+ const selectCols = columnDefs.map(col => `${mysql_format_1.default.ident(targetAlias)}.${mysql_format_1.default.ident(col.sqlName)} AS ${mysql_format_1.default.ident(col.property)}`).join(', ');
173
+ parts.push(selectCols);
174
+ }
175
+ else {
176
+ parts.push(`${mysql_format_1.default.ident(targetAlias)}.*`);
177
+ }
178
+ parts.push(`FROM ${mysql_format_1.default.ident(junctionTableName)}`);
179
+ parts.push(`JOIN ${mysql_format_1.default.ident(targetTableName)} AS ${mysql_format_1.default.ident(targetAlias)}` +
180
+ ` ON ${mysql_format_1.default.ident(junctionTableName)}.${mysql_format_1.default.ident(junctionToTarget.fromColumn)}` +
181
+ ` = ${mysql_format_1.default.ident(targetAlias)}.${mysql_format_1.default.ident(junctionToTarget.toColumn)}`);
182
+ let whereClause = `${mysql_format_1.default.ident(junctionTableName)}.${mysql_format_1.default.ident(leftToJunction.toColumn)}` +
183
+ ` = ${mysql_format_1.default.ident(leftAlias)}.${mysql_format_1.default.ident(leftToJunction.fromColumn)}`;
184
+ const conditionInternals = builder[join_internals_1.MYSQL_JOIN_INTERNAL];
185
+ const userWhereSQL = conditionInternals.toSQL();
186
+ if (userWhereSQL) {
187
+ whereClause += ` AND ${userWhereSQL}`;
188
+ }
189
+ parts.push(`WHERE ${whereClause}`);
190
+ const orderSpecs = builder.getOrderBySpecs();
191
+ if (orderSpecs.length > 0) {
192
+ const orderSQL = orderSpecs.map(spec => `${mysql_format_1.default.ident(spec.column.$sqlColumn)} ${spec.direction}`).join(', ');
193
+ parts.push(`ORDER BY ${orderSQL}`);
194
+ }
195
+ const limit = builder.getLimit();
196
+ if (limit !== undefined) {
197
+ parts.push(`LIMIT ${limit}`);
198
+ }
199
+ const offset = builder.getOffset();
200
+ if (offset !== undefined) {
201
+ parts.push(`OFFSET ${offset}`);
202
+ }
203
+ const innerQuery = parts.join(' ');
204
+ let jsonObjectParts;
205
+ if (columnDefs.length > 0) {
206
+ jsonObjectParts = columnDefs
207
+ .map(col => `${mysql_format_1.default.literal(col.property)}, \`sub\`.${mysql_format_1.default.ident(col.property)}`)
208
+ .join(', ');
209
+ }
210
+ else {
211
+ jsonObjectParts = "'__all', `sub`.*";
212
+ }
213
+ const wrappedQuery = `SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(${jsonObjectParts})), CAST('[]' AS JSON))` +
214
+ ` AS ${mysql_format_1.default.ident(targetAlias)} FROM (${innerQuery}) AS \`sub\``;
215
+ return `(${wrappedQuery})`;
216
+ }
217
+ function executeMysqlLateralJoin(ctx, joinType, tableOrAlias, callback) {
218
+ (0, capability_guard_1.requireCapability)(ctx.relq, 'lateral', 'LATERAL JOIN', 'Use the correlated subquery path (.joinMany) which works on all MySQL family dialects.');
219
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
220
+ ? tableOrAlias
221
+ : [tableOrAlias, tableOrAlias];
222
+ const internal = ctx.relq[methods_1.INTERNAL];
223
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
224
+ const rightTableDef = internal.getTableDef(rightTableKey);
225
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
226
+ const rightTableName = rightTableDef?.$name || rightTableKey;
227
+ const leftAlias = ctx.builder.getTableIdentifier();
228
+ const leftProxy = (0, table_proxy_1.createMysqlTableProxy)(leftTableName, leftAlias, leftTableDef);
229
+ const rightProxy = (0, table_proxy_1.createMysqlTableProxy)(rightTableName, rightAlias, rightTableDef);
230
+ const builder = new join_builder_1.MysqlJoinManyBuilder();
231
+ callback(builder, rightProxy, leftProxy);
232
+ if (builder.getSelectColumns().length === 0 && rightTableDef) {
233
+ const rightColumns = rightTableDef.$columns || rightTableDef;
234
+ const schemaColumns = Object.entries(rightColumns)
235
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
236
+ .map(([propName, colDef]) => {
237
+ const sqlColumn = colDef.$columnName || propName.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
238
+ return {
239
+ $table: rightTableName,
240
+ $alias: rightAlias,
241
+ $column: propName,
242
+ $sqlColumn: sqlColumn,
243
+ $type: undefined,
244
+ };
245
+ });
246
+ if (schemaColumns.length > 0) {
247
+ builder.selectRefs(schemaColumns);
248
+ }
249
+ }
250
+ const lateralSQL = buildMysqlLateralSubquery(rightTableName, rightAlias, leftAlias, builder, rightTableDef);
251
+ const lateralJoinType = joinType === 'LEFT JOIN' ? 'LEFT JOIN LATERAL' : 'JOIN LATERAL';
252
+ const joinClause = {
253
+ type: lateralJoinType,
254
+ table: rightTableName,
255
+ alias: rightAlias,
256
+ schemaKey: rightTableKey,
257
+ lateralSubquery: lateralSQL,
258
+ };
259
+ ctx.builder.addStructuredJoin(joinClause);
260
+ }
261
+ function buildMysqlLateralSubquery(tableName, alias, _leftAlias, builder, tableDef) {
262
+ const toSnake = (s) => s.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
263
+ let columnDefs = [];
264
+ const userSelectCols = builder.getSelectColumns();
265
+ if (userSelectCols.length > 0) {
266
+ columnDefs = userSelectCols.map(col => ({
267
+ property: col.$column,
268
+ sqlName: col.$sqlColumn,
269
+ }));
270
+ }
271
+ else if (tableDef) {
272
+ const tableColumns = tableDef.$columns || tableDef;
273
+ columnDefs = Object.entries(tableColumns)
274
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
275
+ .map(([propName, colDef]) => ({
276
+ property: propName,
277
+ sqlName: colDef.$columnName || toSnake(propName),
278
+ }));
279
+ }
280
+ const parts = [];
281
+ parts.push('SELECT');
282
+ if (columnDefs.length > 0) {
283
+ const selectCols = columnDefs.map(col => `${mysql_format_1.default.ident(alias)}.${mysql_format_1.default.ident(col.sqlName)} AS ${mysql_format_1.default.ident(col.property)}`).join(', ');
284
+ parts.push(selectCols);
285
+ }
286
+ else {
287
+ parts.push(`${mysql_format_1.default.ident(alias)}.*`);
288
+ }
289
+ parts.push(`FROM ${mysql_format_1.default.ident(tableName)} AS ${mysql_format_1.default.ident(alias)}`);
290
+ const whereParts = [];
291
+ for (const cond of builder.conditions || []) {
292
+ if (cond.type === 'using' || cond.type === 'raw') {
293
+ if (cond.raw)
294
+ whereParts.push(cond.raw);
295
+ continue;
296
+ }
297
+ if (cond.type === 'ilike') {
298
+ const leftSQL = (0, table_proxy_1.mysqlColumnRefToSQL)(cond.left);
299
+ const rightSQL = formatJoinRightSide(cond.right);
300
+ whereParts.push(`LOWER(${leftSQL}) LIKE LOWER(${rightSQL})`);
301
+ continue;
302
+ }
303
+ const leftSQL = (0, table_proxy_1.mysqlColumnRefToSQL)(cond.left);
304
+ const rightSQL = formatJoinRightSide(cond.right);
305
+ whereParts.push(`${leftSQL} ${cond.operator} ${rightSQL}`);
306
+ }
307
+ if (whereParts.length > 0) {
308
+ parts.push(`WHERE ${whereParts.join(' AND ')}`);
309
+ }
310
+ const groupByColumns = builder.groupByColumns;
311
+ if (groupByColumns && groupByColumns.length > 0) {
312
+ const groupBySQL = groupByColumns
313
+ .map((col) => (0, table_proxy_1.mysqlColumnRefToSQLUnqualified)(col))
314
+ .join(', ');
315
+ parts.push(`GROUP BY ${groupBySQL}`);
316
+ }
317
+ const havingConditions = builder.havingConditions;
318
+ if (havingConditions && havingConditions.length > 0) {
319
+ const havingSQL = (0, condition_collector_1.buildMysqlConditionsSQL)(havingConditions);
320
+ if (havingSQL) {
321
+ parts.push(`HAVING ${havingSQL}`);
322
+ }
323
+ }
324
+ const orderSpecs = builder.getOrderBySpecs();
325
+ if (orderSpecs.length > 0) {
326
+ const orderSQL = orderSpecs.map(spec => `${(0, table_proxy_1.mysqlColumnRefToSQLUnqualified)(spec.column)} ${spec.direction}`).join(', ');
327
+ parts.push(`ORDER BY ${orderSQL}`);
328
+ }
329
+ const limit = builder.getLimit();
330
+ if (limit !== undefined) {
331
+ parts.push(`LIMIT ${limit}`);
332
+ }
333
+ const offset = builder.getOffset();
334
+ if (offset !== undefined) {
335
+ parts.push(`OFFSET ${offset}`);
336
+ }
337
+ const innerQuery = parts.join(' ');
338
+ let jsonObjectParts;
339
+ if (columnDefs.length > 0) {
340
+ jsonObjectParts = columnDefs
341
+ .map(col => `${mysql_format_1.default.literal(col.property)}, \`sub\`.${mysql_format_1.default.ident(col.property)}`)
342
+ .join(', ');
343
+ }
344
+ else {
345
+ jsonObjectParts = "'__all', `sub`.*";
346
+ }
347
+ const outerQuery = `(SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(${jsonObjectParts})), CAST('[]' AS JSON))` +
348
+ ` AS ${mysql_format_1.default.ident(alias)}` +
349
+ ` FROM (${innerQuery}) AS \`sub\`)` +
350
+ ` AS ${mysql_format_1.default.ident(`${alias}_lateral`)}`;
351
+ return outerQuery;
352
+ }
353
+ function formatJoinRightSide(right) {
354
+ if (right && typeof right === 'object' && '$table' in right) {
355
+ return (0, table_proxy_1.mysqlColumnRefToSQL)(right);
356
+ }
357
+ return mysql_format_1.default.literal(right);
358
+ }
359
+ function executeMysqlLateralJoinThrough(ctx, joinType, targetTableOrAlias, junctionTableKey, callback) {
360
+ (0, capability_guard_1.requireCapability)(ctx.relq, 'lateral', 'LATERAL JOIN', 'Use the correlated subquery path (.joinMany with { through }) which works on all MySQL family dialects.');
361
+ const [targetKey, targetAlias] = Array.isArray(targetTableOrAlias)
362
+ ? targetTableOrAlias
363
+ : [targetTableOrAlias, targetTableOrAlias];
364
+ const internal = ctx.relq[methods_1.INTERNAL];
365
+ const schema = internal.getSchema();
366
+ if (!schema) {
367
+ throw new relq_errors_1.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' });
368
+ }
369
+ const junctionTableDef = internal.getTableDef(junctionTableKey);
370
+ const targetTableDef = internal.getTableDef(targetKey);
371
+ const junctionTableName = junctionTableDef?.$name || junctionTableKey;
372
+ const targetTableName = targetTableDef?.$name || targetKey;
373
+ const leftAlias = ctx.builder.getTableIdentifier();
374
+ const leftToJunction = (0, fk_resolver_1.resolveMysqlForeignKey)(schema, ctx.schemaKey || ctx.tableName, junctionTableKey);
375
+ if (!leftToJunction) {
376
+ throw new relq_errors_1.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' });
377
+ }
378
+ const junctionToTarget = (0, fk_resolver_1.resolveMysqlForeignKey)(schema, junctionTableKey, targetKey);
379
+ if (!junctionToTarget) {
380
+ throw new relq_errors_1.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' });
381
+ }
382
+ const conditionBuilder = new join_builder_1.MysqlJoinManyBuilder();
383
+ if (callback) {
384
+ callback(conditionBuilder);
385
+ }
386
+ const lateralSQL = buildMysqlThroughLateralSubquery(junctionTableName, junctionTableKey, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, conditionBuilder, targetTableDef);
387
+ const lateralJoinType = joinType === 'LEFT JOIN' ? 'LEFT JOIN LATERAL' : 'JOIN LATERAL';
388
+ const joinClause = {
389
+ type: lateralJoinType,
390
+ table: targetTableName,
391
+ alias: targetAlias,
392
+ schemaKey: targetKey,
393
+ lateralSubquery: lateralSQL,
394
+ };
395
+ ctx.builder.addStructuredJoin(joinClause);
396
+ }
397
+ function buildMysqlThroughLateralSubquery(junctionTableName, _junctionAlias, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, builder, targetTableDef) {
398
+ const toSnake = (s) => s.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`);
399
+ let columnDefs = [];
400
+ const userSelectCols = builder.getSelectColumns();
401
+ if (userSelectCols.length > 0) {
402
+ columnDefs = userSelectCols.map(col => ({
403
+ property: col.$column,
404
+ sqlName: col.$sqlColumn,
405
+ }));
406
+ }
407
+ else if (targetTableDef) {
408
+ const targetColumns = targetTableDef.$columns || targetTableDef;
409
+ columnDefs = Object.entries(targetColumns)
410
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
411
+ .map(([propName, colDef]) => ({
412
+ property: propName,
413
+ sqlName: colDef.$columnName || toSnake(propName),
414
+ }));
415
+ }
416
+ const parts = [];
417
+ parts.push('SELECT');
418
+ if (columnDefs.length > 0) {
419
+ const selectCols = columnDefs.map(col => `${mysql_format_1.default.ident(targetAlias)}.${mysql_format_1.default.ident(col.sqlName)} AS ${mysql_format_1.default.ident(col.property)}`).join(', ');
420
+ parts.push(selectCols);
421
+ }
422
+ else {
423
+ parts.push(`${mysql_format_1.default.ident(targetAlias)}.*`);
424
+ }
425
+ parts.push(`FROM ${mysql_format_1.default.ident(junctionTableName)}`);
426
+ parts.push(`JOIN ${mysql_format_1.default.ident(targetTableName)} AS ${mysql_format_1.default.ident(targetAlias)}` +
427
+ ` ON ${mysql_format_1.default.ident(junctionTableName)}.${mysql_format_1.default.ident(junctionToTarget.fromColumn)}` +
428
+ ` = ${mysql_format_1.default.ident(targetAlias)}.${mysql_format_1.default.ident(junctionToTarget.toColumn)}`);
429
+ let whereClause = `${mysql_format_1.default.ident(junctionTableName)}.${mysql_format_1.default.ident(leftToJunction.toColumn)}` +
430
+ ` = ${mysql_format_1.default.ident(leftAlias)}.${mysql_format_1.default.ident(leftToJunction.fromColumn)}`;
431
+ const conditionInternals = builder[join_internals_1.MYSQL_JOIN_INTERNAL];
432
+ const userWhereSQL = conditionInternals.toSQL();
433
+ if (userWhereSQL) {
434
+ whereClause += ` AND ${userWhereSQL}`;
435
+ }
436
+ parts.push(`WHERE ${whereClause}`);
437
+ const orderSpecs = builder.getOrderBySpecs();
438
+ if (orderSpecs.length > 0) {
439
+ const orderSQL = orderSpecs.map(spec => `${mysql_format_1.default.ident(spec.column.$sqlColumn)} ${spec.direction}`).join(', ');
440
+ parts.push(`ORDER BY ${orderSQL}`);
441
+ }
442
+ const limit = builder.getLimit();
443
+ if (limit !== undefined) {
444
+ parts.push(`LIMIT ${limit}`);
445
+ }
446
+ const offset = builder.getOffset();
447
+ if (offset !== undefined) {
448
+ parts.push(`OFFSET ${offset}`);
449
+ }
450
+ const innerQuery = parts.join(' ');
451
+ let jsonObjectParts;
452
+ if (columnDefs.length > 0) {
453
+ jsonObjectParts = columnDefs
454
+ .map(col => `${mysql_format_1.default.literal(col.property)}, \`sub\`.${mysql_format_1.default.ident(col.property)}`)
455
+ .join(', ');
456
+ }
457
+ else {
458
+ jsonObjectParts = "'__all', `sub`.*";
459
+ }
460
+ const outerQuery = `(SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(${jsonObjectParts})), CAST('[]' AS JSON))` +
461
+ ` AS ${mysql_format_1.default.ident(targetAlias)}` +
462
+ ` FROM (${innerQuery}) AS \`sub\`)` +
463
+ ` AS ${mysql_format_1.default.ident(`${targetAlias}_lateral`)}`;
464
+ return outerQuery;
465
+ }