typhex 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +417 -0
  4. package/SECURITY.md +32 -0
  5. package/dist/arrow/aggregates.d.ts +12 -0
  6. package/dist/arrow/aggregates.d.ts.map +1 -0
  7. package/dist/arrow/aggregates.js +32 -0
  8. package/dist/arrow/aggregates.js.map +1 -0
  9. package/dist/arrow/constants.d.ts +15 -0
  10. package/dist/arrow/constants.d.ts.map +1 -0
  11. package/dist/arrow/constants.js +42 -0
  12. package/dist/arrow/constants.js.map +1 -0
  13. package/dist/arrow/index.d.ts +7 -0
  14. package/dist/arrow/index.d.ts.map +1 -0
  15. package/dist/arrow/index.js +7 -0
  16. package/dist/arrow/index.js.map +1 -0
  17. package/dist/config/index.d.ts +6 -0
  18. package/dist/config/index.d.ts.map +1 -0
  19. package/dist/config/index.js +4 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/config/load-config.d.ts +19 -0
  22. package/dist/config/load-config.d.ts.map +1 -0
  23. package/dist/config/load-config.js +84 -0
  24. package/dist/config/load-config.js.map +1 -0
  25. package/dist/config/load-env.d.ts +7 -0
  26. package/dist/config/load-env.d.ts.map +1 -0
  27. package/dist/config/load-env.js +62 -0
  28. package/dist/config/load-env.js.map +1 -0
  29. package/dist/config/types.d.ts +20 -0
  30. package/dist/config/types.d.ts.map +1 -0
  31. package/dist/config/types.js +10 -0
  32. package/dist/config/types.js.map +1 -0
  33. package/dist/dbs/base-migrator.d.ts +20 -0
  34. package/dist/dbs/base-migrator.d.ts.map +1 -0
  35. package/dist/dbs/base-migrator.js +112 -0
  36. package/dist/dbs/base-migrator.js.map +1 -0
  37. package/dist/dbs/index.d.ts +9 -0
  38. package/dist/dbs/index.d.ts.map +1 -0
  39. package/dist/dbs/index.js +17 -0
  40. package/dist/dbs/index.js.map +1 -0
  41. package/dist/dbs/postgres/dialect.d.ts +8 -0
  42. package/dist/dbs/postgres/dialect.d.ts.map +1 -0
  43. package/dist/dbs/postgres/dialect.js +17 -0
  44. package/dist/dbs/postgres/dialect.js.map +1 -0
  45. package/dist/dbs/postgres/driver.d.ts +42 -0
  46. package/dist/dbs/postgres/driver.d.ts.map +1 -0
  47. package/dist/dbs/postgres/driver.js +111 -0
  48. package/dist/dbs/postgres/driver.js.map +1 -0
  49. package/dist/dbs/postgres/index.d.ts +6 -0
  50. package/dist/dbs/postgres/index.d.ts.map +1 -0
  51. package/dist/dbs/postgres/index.js +5 -0
  52. package/dist/dbs/postgres/index.js.map +1 -0
  53. package/dist/dbs/postgres/migrator.d.ts +13 -0
  54. package/dist/dbs/postgres/migrator.d.ts.map +1 -0
  55. package/dist/dbs/postgres/migrator.js +22 -0
  56. package/dist/dbs/postgres/migrator.js.map +1 -0
  57. package/dist/dbs/postgres/query-compiler.d.ts +22 -0
  58. package/dist/dbs/postgres/query-compiler.d.ts.map +1 -0
  59. package/dist/dbs/postgres/query-compiler.js +140 -0
  60. package/dist/dbs/postgres/query-compiler.js.map +1 -0
  61. package/dist/dbs/postgres/trx.d.ts +16 -0
  62. package/dist/dbs/postgres/trx.d.ts.map +1 -0
  63. package/dist/dbs/postgres/trx.js +68 -0
  64. package/dist/dbs/postgres/trx.js.map +1 -0
  65. package/dist/dbs/query-compiler.d.ts +135 -0
  66. package/dist/dbs/query-compiler.d.ts.map +1 -0
  67. package/dist/dbs/query-compiler.js +775 -0
  68. package/dist/dbs/query-compiler.js.map +1 -0
  69. package/dist/dbs/sqlite/dialect.d.ts +8 -0
  70. package/dist/dbs/sqlite/dialect.d.ts.map +1 -0
  71. package/dist/dbs/sqlite/dialect.js +17 -0
  72. package/dist/dbs/sqlite/dialect.js.map +1 -0
  73. package/dist/dbs/sqlite/driver.d.ts +9 -0
  74. package/dist/dbs/sqlite/driver.d.ts.map +1 -0
  75. package/dist/dbs/sqlite/driver.js +66 -0
  76. package/dist/dbs/sqlite/driver.js.map +1 -0
  77. package/dist/dbs/sqlite/index.d.ts +6 -0
  78. package/dist/dbs/sqlite/index.d.ts.map +1 -0
  79. package/dist/dbs/sqlite/index.js +5 -0
  80. package/dist/dbs/sqlite/index.js.map +1 -0
  81. package/dist/dbs/sqlite/migrator.d.ts +13 -0
  82. package/dist/dbs/sqlite/migrator.d.ts.map +1 -0
  83. package/dist/dbs/sqlite/migrator.js +22 -0
  84. package/dist/dbs/sqlite/migrator.js.map +1 -0
  85. package/dist/dbs/sqlite/query-compiler.d.ts +26 -0
  86. package/dist/dbs/sqlite/query-compiler.d.ts.map +1 -0
  87. package/dist/dbs/sqlite/query-compiler.js +80 -0
  88. package/dist/dbs/sqlite/query-compiler.js.map +1 -0
  89. package/dist/dbs/sqlite/trx.d.ts +13 -0
  90. package/dist/dbs/sqlite/trx.d.ts.map +1 -0
  91. package/dist/dbs/sqlite/trx.js +69 -0
  92. package/dist/dbs/sqlite/trx.js.map +1 -0
  93. package/dist/dbs/types.d.ts +92 -0
  94. package/dist/dbs/types.d.ts.map +1 -0
  95. package/dist/dbs/types.js +26 -0
  96. package/dist/dbs/types.js.map +1 -0
  97. package/dist/dialect.d.ts +3 -0
  98. package/dist/dialect.d.ts.map +1 -0
  99. package/dist/dialect.js +2 -0
  100. package/dist/dialect.js.map +1 -0
  101. package/dist/driver/factory.d.ts +19 -0
  102. package/dist/driver/factory.d.ts.map +1 -0
  103. package/dist/driver/factory.js +24 -0
  104. package/dist/driver/factory.js.map +1 -0
  105. package/dist/driver/index.d.ts +6 -0
  106. package/dist/driver/index.d.ts.map +1 -0
  107. package/dist/driver/index.js +3 -0
  108. package/dist/driver/index.js.map +1 -0
  109. package/dist/driver/sqlite.d.ts +15 -0
  110. package/dist/driver/sqlite.d.ts.map +1 -0
  111. package/dist/driver/sqlite.js +74 -0
  112. package/dist/driver/sqlite.js.map +1 -0
  113. package/dist/driver/types.d.ts +75 -0
  114. package/dist/driver/types.d.ts.map +1 -0
  115. package/dist/driver/types.js +2 -0
  116. package/dist/driver/types.js.map +1 -0
  117. package/dist/entity/entity.d.ts +67 -0
  118. package/dist/entity/entity.d.ts.map +1 -0
  119. package/dist/entity/entity.js +139 -0
  120. package/dist/entity/entity.js.map +1 -0
  121. package/dist/entity/global-driver.d.ts +38 -0
  122. package/dist/entity/global-driver.d.ts.map +1 -0
  123. package/dist/entity/global-driver.js +109 -0
  124. package/dist/entity/global-driver.js.map +1 -0
  125. package/dist/entity/index.d.ts +8 -0
  126. package/dist/entity/index.d.ts.map +1 -0
  127. package/dist/entity/index.js +3 -0
  128. package/dist/entity/index.js.map +1 -0
  129. package/dist/entity/pk-columns.d.ts +5 -0
  130. package/dist/entity/pk-columns.d.ts.map +1 -0
  131. package/dist/entity/pk-columns.js +14 -0
  132. package/dist/entity/pk-columns.js.map +1 -0
  133. package/dist/entity/relations.d.ts +134 -0
  134. package/dist/entity/relations.d.ts.map +1 -0
  135. package/dist/entity/relations.js +23 -0
  136. package/dist/entity/relations.js.map +1 -0
  137. package/dist/entity/schema-inference.d.ts +77 -0
  138. package/dist/entity/schema-inference.d.ts.map +1 -0
  139. package/dist/entity/schema-inference.js +6 -0
  140. package/dist/entity/schema-inference.js.map +1 -0
  141. package/dist/entity/types.d.ts +30 -0
  142. package/dist/entity/types.d.ts.map +1 -0
  143. package/dist/entity/types.js +5 -0
  144. package/dist/entity/types.js.map +1 -0
  145. package/dist/index.d.ts +25 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/ir/index.d.ts +2 -0
  150. package/dist/ir/index.d.ts.map +1 -0
  151. package/dist/ir/index.js +2 -0
  152. package/dist/ir/index.js.map +1 -0
  153. package/dist/ir/types.d.ts +148 -0
  154. package/dist/ir/types.d.ts.map +1 -0
  155. package/dist/ir/types.js +97 -0
  156. package/dist/ir/types.js.map +1 -0
  157. package/dist/migration/cli.d.ts +18 -0
  158. package/dist/migration/cli.d.ts.map +1 -0
  159. package/dist/migration/cli.js +236 -0
  160. package/dist/migration/cli.js.map +1 -0
  161. package/dist/migration/diff.d.ts +10 -0
  162. package/dist/migration/diff.d.ts.map +1 -0
  163. package/dist/migration/diff.js +10 -0
  164. package/dist/migration/diff.js.map +1 -0
  165. package/dist/migration/generator.d.ts +12 -0
  166. package/dist/migration/generator.d.ts.map +1 -0
  167. package/dist/migration/generator.js +98 -0
  168. package/dist/migration/generator.js.map +1 -0
  169. package/dist/migration/index.d.ts +7 -0
  170. package/dist/migration/index.d.ts.map +1 -0
  171. package/dist/migration/index.js +5 -0
  172. package/dist/migration/index.js.map +1 -0
  173. package/dist/migration/runner.d.ts +32 -0
  174. package/dist/migration/runner.d.ts.map +1 -0
  175. package/dist/migration/runner.js +279 -0
  176. package/dist/migration/runner.js.map +1 -0
  177. package/dist/migration/topo-sort.d.ts +12 -0
  178. package/dist/migration/topo-sort.d.ts.map +1 -0
  179. package/dist/migration/topo-sort.js +42 -0
  180. package/dist/migration/topo-sort.js.map +1 -0
  181. package/dist/migration/types.d.ts +45 -0
  182. package/dist/migration/types.d.ts.map +1 -0
  183. package/dist/migration/types.js +2 -0
  184. package/dist/migration/types.js.map +1 -0
  185. package/dist/orm/aggregates.d.ts +19 -0
  186. package/dist/orm/aggregates.d.ts.map +1 -0
  187. package/dist/orm/aggregates.js +32 -0
  188. package/dist/orm/aggregates.js.map +1 -0
  189. package/dist/orm/db.d.ts +105 -0
  190. package/dist/orm/db.d.ts.map +1 -0
  191. package/dist/orm/db.js +172 -0
  192. package/dist/orm/db.js.map +1 -0
  193. package/dist/orm/expr.d.ts +125 -0
  194. package/dist/orm/expr.d.ts.map +1 -0
  195. package/dist/orm/expr.js +10 -0
  196. package/dist/orm/expr.js.map +1 -0
  197. package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.d.ts +9 -0
  198. package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.d.ts.map +1 -0
  199. package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.js +44 -0
  200. package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.js.map +1 -0
  201. package/dist/orm/helpers/insert-graph/insert-graph-executor.d.ts +13 -0
  202. package/dist/orm/helpers/insert-graph/insert-graph-executor.d.ts.map +1 -0
  203. package/dist/orm/helpers/insert-graph/insert-graph-executor.js +42 -0
  204. package/dist/orm/helpers/insert-graph/insert-graph-executor.js.map +1 -0
  205. package/dist/orm/helpers/insert-graph/insert-graph-planner.d.ts +46 -0
  206. package/dist/orm/helpers/insert-graph/insert-graph-planner.d.ts.map +1 -0
  207. package/dist/orm/helpers/insert-graph/insert-graph-planner.js +258 -0
  208. package/dist/orm/helpers/insert-graph/insert-graph-planner.js.map +1 -0
  209. package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.d.ts +7 -0
  210. package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.d.ts.map +1 -0
  211. package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.js +8 -0
  212. package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.js.map +1 -0
  213. package/dist/orm/helpers/insert-graph/sequence-id-assigner.d.ts +15 -0
  214. package/dist/orm/helpers/insert-graph/sequence-id-assigner.d.ts.map +1 -0
  215. package/dist/orm/helpers/insert-graph/sequence-id-assigner.js +48 -0
  216. package/dist/orm/helpers/insert-graph/sequence-id-assigner.js.map +1 -0
  217. package/dist/orm/helpers/query-plan/expr-builder.d.ts +155 -0
  218. package/dist/orm/helpers/query-plan/expr-builder.d.ts.map +1 -0
  219. package/dist/orm/helpers/query-plan/expr-builder.js +297 -0
  220. package/dist/orm/helpers/query-plan/expr-builder.js.map +1 -0
  221. package/dist/orm/helpers/query-plan/query-ir-analyzer.d.ts +48 -0
  222. package/dist/orm/helpers/query-plan/query-ir-analyzer.d.ts.map +1 -0
  223. package/dist/orm/helpers/query-plan/query-ir-analyzer.js +262 -0
  224. package/dist/orm/helpers/query-plan/query-ir-analyzer.js.map +1 -0
  225. package/dist/orm/helpers/query-plan/query-plan.d.ts +164 -0
  226. package/dist/orm/helpers/query-plan/query-plan.d.ts.map +1 -0
  227. package/dist/orm/helpers/query-plan/query-plan.js +549 -0
  228. package/dist/orm/helpers/query-plan/query-plan.js.map +1 -0
  229. package/dist/orm/helpers/query-plan/select-classifier.d.ts +161 -0
  230. package/dist/orm/helpers/query-plan/select-classifier.d.ts.map +1 -0
  231. package/dist/orm/helpers/query-plan/select-classifier.js +359 -0
  232. package/dist/orm/helpers/query-plan/select-classifier.js.map +1 -0
  233. package/dist/orm/helpers/relations/relation-assembler.d.ts +21 -0
  234. package/dist/orm/helpers/relations/relation-assembler.d.ts.map +1 -0
  235. package/dist/orm/helpers/relations/relation-assembler.js +60 -0
  236. package/dist/orm/helpers/relations/relation-assembler.js.map +1 -0
  237. package/dist/orm/helpers/relations/relation-fetcher.d.ts +30 -0
  238. package/dist/orm/helpers/relations/relation-fetcher.d.ts.map +1 -0
  239. package/dist/orm/helpers/relations/relation-fetcher.js +128 -0
  240. package/dist/orm/helpers/relations/relation-fetcher.js.map +1 -0
  241. package/dist/orm/helpers/relations/relation-joins.d.ts +74 -0
  242. package/dist/orm/helpers/relations/relation-joins.d.ts.map +1 -0
  243. package/dist/orm/helpers/relations/relation-joins.js +138 -0
  244. package/dist/orm/helpers/relations/relation-joins.js.map +1 -0
  245. package/dist/orm/helpers/relations/relation-resolver.d.ts +14 -0
  246. package/dist/orm/helpers/relations/relation-resolver.d.ts.map +1 -0
  247. package/dist/orm/helpers/relations/relation-resolver.js +25 -0
  248. package/dist/orm/helpers/relations/relation-resolver.js.map +1 -0
  249. package/dist/orm/index.d.ts +7 -0
  250. package/dist/orm/index.d.ts.map +1 -0
  251. package/dist/orm/index.js +5 -0
  252. package/dist/orm/index.js.map +1 -0
  253. package/dist/orm/query-builder.d.ts +136 -0
  254. package/dist/orm/query-builder.d.ts.map +1 -0
  255. package/dist/orm/query-builder.js +433 -0
  256. package/dist/orm/query-builder.js.map +1 -0
  257. package/dist/orm/query-helpers.d.ts +35 -0
  258. package/dist/orm/query-helpers.d.ts.map +1 -0
  259. package/dist/orm/query-helpers.js +83 -0
  260. package/dist/orm/query-helpers.js.map +1 -0
  261. package/dist/orm/query-state.d.ts +56 -0
  262. package/dist/orm/query-state.d.ts.map +1 -0
  263. package/dist/orm/query-state.js +112 -0
  264. package/dist/orm/query-state.js.map +1 -0
  265. package/dist/orm/single-row-query-builder.d.ts +18 -0
  266. package/dist/orm/single-row-query-builder.d.ts.map +1 -0
  267. package/dist/orm/single-row-query-builder.js +90 -0
  268. package/dist/orm/single-row-query-builder.js.map +1 -0
  269. package/dist/orm/trx.d.ts +40 -0
  270. package/dist/orm/trx.d.ts.map +1 -0
  271. package/dist/orm/trx.js +118 -0
  272. package/dist/orm/trx.js.map +1 -0
  273. package/dist/parser/acorn-helpers.d.ts +43 -0
  274. package/dist/parser/acorn-helpers.d.ts.map +1 -0
  275. package/dist/parser/acorn-helpers.js +104 -0
  276. package/dist/parser/acorn-helpers.js.map +1 -0
  277. package/dist/parser/acorn-member.d.ts +16 -0
  278. package/dist/parser/acorn-member.d.ts.map +1 -0
  279. package/dist/parser/acorn-member.js +31 -0
  280. package/dist/parser/acorn-member.js.map +1 -0
  281. package/dist/parser/acorn-types.d.ts +14 -0
  282. package/dist/parser/acorn-types.d.ts.map +1 -0
  283. package/dist/parser/acorn-types.js +6 -0
  284. package/dist/parser/acorn-types.js.map +1 -0
  285. package/dist/parser/arrow-source.d.ts +23 -0
  286. package/dist/parser/arrow-source.d.ts.map +1 -0
  287. package/dist/parser/arrow-source.js +70 -0
  288. package/dist/parser/arrow-source.js.map +1 -0
  289. package/dist/parser/group-by.d.ts +17 -0
  290. package/dist/parser/group-by.d.ts.map +1 -0
  291. package/dist/parser/group-by.js +62 -0
  292. package/dist/parser/group-by.js.map +1 -0
  293. package/dist/parser/index.d.ts +5 -0
  294. package/dist/parser/index.d.ts.map +1 -0
  295. package/dist/parser/index.js +3 -0
  296. package/dist/parser/index.js.map +1 -0
  297. package/dist/parser/parse-arrow.d.ts +10 -0
  298. package/dist/parser/parse-arrow.d.ts.map +1 -0
  299. package/dist/parser/parse-arrow.js +9 -0
  300. package/dist/parser/parse-arrow.js.map +1 -0
  301. package/dist/parser/predicate-walk.d.ts +24 -0
  302. package/dist/parser/predicate-walk.d.ts.map +1 -0
  303. package/dist/parser/predicate-walk.js +247 -0
  304. package/dist/parser/predicate-walk.js.map +1 -0
  305. package/dist/parser/resolve.d.ts +25 -0
  306. package/dist/parser/resolve.d.ts.map +1 -0
  307. package/dist/parser/resolve.js +134 -0
  308. package/dist/parser/resolve.js.map +1 -0
  309. package/dist/parser/select.d.ts +7 -0
  310. package/dist/parser/select.d.ts.map +1 -0
  311. package/dist/parser/select.js +333 -0
  312. package/dist/parser/select.js.map +1 -0
  313. package/dist/parser/update.d.ts +7 -0
  314. package/dist/parser/update.d.ts.map +1 -0
  315. package/dist/parser/update.js +51 -0
  316. package/dist/parser/update.js.map +1 -0
  317. package/dist/postgres/aggregates.d.ts +12 -0
  318. package/dist/postgres/aggregates.d.ts.map +1 -0
  319. package/dist/postgres/aggregates.js +19 -0
  320. package/dist/postgres/aggregates.js.map +1 -0
  321. package/dist/postgres.d.ts +6 -0
  322. package/dist/postgres.d.ts.map +1 -0
  323. package/dist/postgres.js +6 -0
  324. package/dist/postgres.js.map +1 -0
  325. package/dist/schema/index.d.ts +2 -0
  326. package/dist/schema/index.d.ts.map +1 -0
  327. package/dist/schema/index.js +2 -0
  328. package/dist/schema/index.js.map +1 -0
  329. package/dist/schema/types.d.ts +16 -0
  330. package/dist/schema/types.d.ts.map +1 -0
  331. package/dist/schema/types.js +40 -0
  332. package/dist/schema/types.js.map +1 -0
  333. package/dist/sqlite/aggregates.d.ts +8 -0
  334. package/dist/sqlite/aggregates.d.ts.map +1 -0
  335. package/dist/sqlite/aggregates.js +11 -0
  336. package/dist/sqlite/aggregates.js.map +1 -0
  337. package/dist/sqlite.d.ts +6 -0
  338. package/dist/sqlite.d.ts.map +1 -0
  339. package/dist/sqlite.js +6 -0
  340. package/dist/sqlite.js.map +1 -0
  341. package/dist/transformer/bindings.d.ts +18 -0
  342. package/dist/transformer/bindings.d.ts.map +1 -0
  343. package/dist/transformer/bindings.js +52 -0
  344. package/dist/transformer/bindings.js.map +1 -0
  345. package/dist/transformer/index.d.ts +17 -0
  346. package/dist/transformer/index.d.ts.map +1 -0
  347. package/dist/transformer/index.js +75 -0
  348. package/dist/transformer/index.js.map +1 -0
  349. package/dist/transformer/ir-emit.d.ts +12 -0
  350. package/dist/transformer/ir-emit.d.ts.map +1 -0
  351. package/dist/transformer/ir-emit.js +144 -0
  352. package/dist/transformer/ir-emit.js.map +1 -0
  353. package/dist/transformer/join-transformer.d.ts +12 -0
  354. package/dist/transformer/join-transformer.d.ts.map +1 -0
  355. package/dist/transformer/join-transformer.js +102 -0
  356. package/dist/transformer/join-transformer.js.map +1 -0
  357. package/dist/transformer/orderby-transformer.d.ts +13 -0
  358. package/dist/transformer/orderby-transformer.d.ts.map +1 -0
  359. package/dist/transformer/orderby-transformer.js +84 -0
  360. package/dist/transformer/orderby-transformer.js.map +1 -0
  361. package/dist/transformer/select-transformer.d.ts +9 -0
  362. package/dist/transformer/select-transformer.d.ts.map +1 -0
  363. package/dist/transformer/select-transformer.js +222 -0
  364. package/dist/transformer/select-transformer.js.map +1 -0
  365. package/dist/transformer/shared.d.ts +12 -0
  366. package/dist/transformer/shared.d.ts.map +1 -0
  367. package/dist/transformer/shared.js +12 -0
  368. package/dist/transformer/shared.js.map +1 -0
  369. package/dist/transformer/subquery-transformer.d.ts +15 -0
  370. package/dist/transformer/subquery-transformer.d.ts.map +1 -0
  371. package/dist/transformer/subquery-transformer.js +43 -0
  372. package/dist/transformer/subquery-transformer.js.map +1 -0
  373. package/dist/transformer/ts-aggregates.d.ts +13 -0
  374. package/dist/transformer/ts-aggregates.d.ts.map +1 -0
  375. package/dist/transformer/ts-aggregates.js +83 -0
  376. package/dist/transformer/ts-aggregates.js.map +1 -0
  377. package/dist/transformer/ts-binary.d.ts +8 -0
  378. package/dist/transformer/ts-binary.d.ts.map +1 -0
  379. package/dist/transformer/ts-binary.js +32 -0
  380. package/dist/transformer/ts-binary.js.map +1 -0
  381. package/dist/transformer/ts-member.d.ts +12 -0
  382. package/dist/transformer/ts-member.d.ts.map +1 -0
  383. package/dist/transformer/ts-member.js +22 -0
  384. package/dist/transformer/ts-member.js.map +1 -0
  385. package/dist/transformer/ts-utils.d.ts +10 -0
  386. package/dist/transformer/ts-utils.d.ts.map +1 -0
  387. package/dist/transformer/ts-utils.js +38 -0
  388. package/dist/transformer/ts-utils.js.map +1 -0
  389. package/dist/transformer/typhex-type.d.ts +8 -0
  390. package/dist/transformer/typhex-type.d.ts.map +1 -0
  391. package/dist/transformer/typhex-type.js +52 -0
  392. package/dist/transformer/typhex-type.js.map +1 -0
  393. package/dist/transformer/where-transformer.d.ts +33 -0
  394. package/dist/transformer/where-transformer.d.ts.map +1 -0
  395. package/dist/transformer/where-transformer.js +400 -0
  396. package/dist/transformer/where-transformer.js.map +1 -0
  397. package/dist/utils.d.ts +5 -0
  398. package/dist/utils.d.ts.map +1 -0
  399. package/dist/utils.js +30 -0
  400. package/dist/utils.js.map +1 -0
  401. package/docs/drivers/postgres.md +54 -0
  402. package/docs/drivers/sqlite.md +33 -0
  403. package/docs/guide/aggregations.md +272 -0
  404. package/docs/guide/bulk-operations.md +204 -0
  405. package/docs/guide/cte-and-unions.md +270 -0
  406. package/docs/guide/entities-relations.md +208 -0
  407. package/docs/guide/expressions.md +98 -0
  408. package/docs/guide/filtering-by-relations.md +166 -0
  409. package/docs/guide/getting-started.md +277 -0
  410. package/docs/guide/querying-relations.md +133 -0
  411. package/docs/guide/subqueries.md +152 -0
  412. package/docs/guide/transactions.md +146 -0
  413. package/docs/guide/typescript-transformer.md +138 -0
  414. package/docs/index.md +33 -0
  415. package/docs/migrations/overview.md +143 -0
  416. package/docs/public-api.md +133 -0
  417. package/docs/reference/api.md +665 -0
  418. package/docs/reference/architecture.md +83 -0
  419. package/docs/release-checklist.md +55 -0
  420. package/etc/typhex.api.md +774 -0
  421. package/package.json +137 -0
@@ -0,0 +1,549 @@
1
+ /**
2
+ * QueryPlanBuilder: converts a `QueryState` into a dialect-agnostic `QueryPlan`.
3
+ *
4
+ * # Where this fits
5
+ *
6
+ * The query pipeline has three layers:
7
+ *
8
+ * 1. **QueryBuilder** (`src/orm/query-builder.ts`) — accumulates user calls
9
+ * (`.where`, `.orderBy`, `.select`, …) into a `QueryState`. The state
10
+ * holds raw IR predicates, the three param bags (where/having/subquery),
11
+ * join hints, etc. — it's the user-facing input.
12
+ * 2. **QueryPlanBuilder** (this file) — takes a `QueryState` and produces
13
+ * a `QueryPlan`: a flat, dialect-agnostic structure where every column
14
+ * reference has been resolved to a (table-alias, column-path) pair,
15
+ * every captured `QueryBuilder` has been inlined as a child plan,
16
+ * relations have been split into joins / fetches / projections, and
17
+ * the EXISTS / SUBQUERY / IN shapes have been pre-resolved.
18
+ * 3. **QueryCompiler** (`src/dbs/<dialect>/query-compiler`) — walks the
19
+ * `QueryPlan`'s `Expr` tree to emit SQL strings + parameter arrays.
20
+ * The dialect never sees IR; the planner is the only IR consumer.
21
+ *
22
+ * # The five planning phases
23
+ *
24
+ * `build()` runs them in order:
25
+ *
26
+ * 1. **Alias scope** (`buildParamToAlias`).
27
+ * Decide which row-param names resolve to which SQL table aliases.
28
+ * Subqueries inherit their parent's mapping plus their own aliases.
29
+ * 2. **Relation detection** (`detectRelations`). Decide which relations
30
+ * get joined into the main SELECT vs. kept for the relation pipeline,
31
+ * and pre-resolve any one-to-many EXISTS predicates. Delegated to
32
+ * relation helper classes for the heavy lifting.
33
+ * 3. **Select classification** (`classifySelect`). Split the IR select
34
+ * into joined columns, fetched relations, and joined projections.
35
+ * Delegated to `SelectClassifier`.
36
+ * 4. **IR → Expr conversion**. Pre-build captured child query plans, then
37
+ * convert where, having, orderBy, groupBy, and the select-list through
38
+ * `ExprBuilder` using only precomputed context.
39
+ * 5. **Plan assembly**. Stamp everything onto a `QueryPlan` value object.
40
+ *
41
+ * # Subqueries
42
+ *
43
+ * Inline subqueries (correlated or otherwise) are planned before IR→Expr
44
+ * conversion. The outer scope (current `paramToAlias` and the chosen
45
+ * sub-alias) is threaded through so correlated column references in the
46
+ * inner plan resolve against the outer table alias
47
+ * — that's how `Author.query().select(a => ({ totalPosts:
48
+ * Post.query().where(p => p.authorId === a.id).select(() => count()) }))`
49
+ * compiles to a SQL subquery referencing `t0.id`.
50
+ */
51
+ import { RelationJoinBuilder, RelationPathAliasBuilder, OneToManyExistsBuilder, } from "../relations/relation-joins.js";
52
+ import { ExprBuilder } from "./expr-builder.js";
53
+ import { SelectClassifier, EMPTY_CLASSIFIED } from "./select-classifier.js";
54
+ import { QueryIrAnalyzer } from "./query-ir-analyzer.js";
55
+ /** Default name for the row-param when no explicit one is in scope. */
56
+ export const DEFAULT_ROW_PARAM = "u";
57
+ /** Alias of the main table for the top-level plan. Subquery plans pick
58
+ * fresh aliases (`t1`, `t2`, …) during the planner's subquery phase. */
59
+ const TABLE_ALIAS = "t0";
60
+ /** @internal
61
+ * Resolve a `QueryCompiler` from the QueryExecutor on a state. Throws if
62
+ * the dialect isn't registered — used by the query-builder to look up
63
+ * the dialect when it needs to compile SQL outside the planner path
64
+ * (e.g. for `findById` shortcuts).
65
+ */
66
+ export function getQueryCompilerOrThrow(state) {
67
+ return state.qe.dialect.queryCompiler;
68
+ }
69
+ // ─── public entry point ───────────────────────────────────────────────────────
70
+ /** @internal
71
+ * Plan a query against a `QueryState`. Use the static `build` entry
72
+ * point — the constructor is private because every instance only ever
73
+ * runs once (it holds per-build mutable state).
74
+ */
75
+ export class QueryPlanBuilder {
76
+ /**
77
+ * Top-level entry point. Plans the given state for the given operation
78
+ * (select / insert / update / delete) and returns a `QueryPlan`. The
79
+ * plan is fully self-contained: no further IR walks happen downstream,
80
+ * just dialect SQL emission and relation-pipeline execution.
81
+ */
82
+ static build(state, operation) {
83
+ const irAnalyzer = new QueryIrAnalyzer(state, DEFAULT_ROW_PARAM);
84
+ const analysis = irAnalyzer.analyze();
85
+ return new QueryPlanBuilder(state, operation, undefined, analysis, irAnalyzer).build();
86
+ }
87
+ /**
88
+ * Internal entry point used by the planner's subquery phase to build a
89
+ * child plan for an inline subquery. Receives the `OuterScope` so the
90
+ * child plan can:
91
+ * - allocate its main alias from the outer's free-alias pool;
92
+ * - inherit the outer's `paramToAlias` for correlated references.
93
+ *
94
+ * Always built as a SELECT — inline subqueries can't be DML.
95
+ */
96
+ static buildSubQuery(state, operation, outer, analysis) {
97
+ const irAnalyzer = new QueryIrAnalyzer(state, DEFAULT_ROW_PARAM);
98
+ return new QueryPlanBuilder(state, operation, outer, analysis, irAnalyzer).build();
99
+ }
100
+ state;
101
+ operation;
102
+ outer;
103
+ tableAlias;
104
+ analysis;
105
+ irAnalyzer;
106
+ /** Cached row-param for this state. */
107
+ rootParam;
108
+ constructor(state, operation, outer, analysis, irAnalyzer) {
109
+ this.state = state;
110
+ this.operation = operation;
111
+ this.outer = outer;
112
+ this.tableAlias = outer?.subAlias ?? TABLE_ALIAS;
113
+ this.analysis = analysis;
114
+ this.irAnalyzer = irAnalyzer;
115
+ this.rootParam = analysis.rootParam;
116
+ }
117
+ /**
118
+ * Drive the full planning pipeline for this state and produce a
119
+ * `QueryPlan`. Phase order matters:
120
+ *
121
+ * 1. `buildParamToAlias` — needs to run first because every
122
+ * conversion downstream consults it.
123
+ * 2. `detectRelations` — populates joins and one-to-many EXISTS
124
+ * metadata; the alias map for relation joins comes from
125
+ * `RelationPathAliasBuilder`.
126
+ * 3. `classifySelect` — only relevant for SELECT operations; the
127
+ * `EMPTY_CLASSIFIED` sentinel is used otherwise.
128
+ * 4. `buildSubqueryPlans` — pre-build inline child plans while the
129
+ * current scope is available.
130
+ * 5. Construct an `ExprBuilder` with all the precomputed context.
131
+ * 6. Convert where, having, orderBy, groupBy, selectItems through
132
+ * the ExprBuilder.
133
+ * 7. Assemble the final `QueryPlan` value object.
134
+ *
135
+ * Mutation operations (insert/update/delete) skip the SELECT-only
136
+ * fields (orderBy, groupBy, limit, offset, selectItems) — they're
137
+ * left empty/null in the plan.
138
+ */
139
+ build() {
140
+ const isSelect = this.operation.kind === "select";
141
+ const hasFilter = this.operation.kind !== "insert" && this.operation.kind !== "insertMany";
142
+ const paramToAlias = this.buildParamToAlias();
143
+ const { joins, oneToManyExists } = this.detectRelations();
144
+ const relationPathToAlias = new RelationPathAliasBuilder(joins, Object.keys(paramToAlias)).build();
145
+ const subqueryPlans = this.buildSubqueryPlans(paramToAlias, relationPathToAlias);
146
+ const classified = isSelect ? this.classifySelect() : EMPTY_CLASSIFIED;
147
+ const cteNames = new Set([
148
+ ...(this.state.inScopeRegisteredCteNames ?? []),
149
+ ...(this.state.ctes ?? []).map((c) => c.name),
150
+ ]);
151
+ const exprBuilder = new ExprBuilder(paramToAlias, relationPathToAlias, oneToManyExists, subqueryPlans, new Set(Object.keys(this.state.relations ?? {})), cteNames);
152
+ const whereExpr = hasFilter && this.state.whereIr ? exprBuilder.convert(this.state.whereIr.node) : null;
153
+ const havingExpr = isSelect && this.state.havingIr ? exprBuilder.convert(this.state.havingIr.node) : null;
154
+ const orderBy = isSelect ? this.buildOrderBy(exprBuilder) : [];
155
+ const groupBy = isSelect ? this.buildGroupBy(exprBuilder) : [];
156
+ const selectItems = isSelect
157
+ ? this.buildSelectItems(classified, exprBuilder, this.state.selectIr)
158
+ : [];
159
+ const selectAll = !this.state.selectIr ||
160
+ (this.state.selectIr.paths.length === 0 &&
161
+ !(this.state.selectIr.aggregates?.length ||
162
+ this.state.selectIr.expressions?.length ||
163
+ this.state.selectIr.subqueries?.length));
164
+ const relationJoinSpecs = joins.map(toJoinSpec);
165
+ const entityJoinSpecs = this.buildEntityJoins(paramToAlias, relationPathToAlias, oneToManyExists, subqueryPlans, relationJoinSpecs.length);
166
+ return {
167
+ operation: this.operation,
168
+ tableName: this.state.tableName,
169
+ tableAlias: this.tableAlias,
170
+ columnNames: this.state.columnNames,
171
+ where: whereExpr,
172
+ having: havingExpr,
173
+ orderBy,
174
+ groupBy,
175
+ limitNum: isSelect ? this.state.limitNum : null,
176
+ offsetNum: isSelect ? this.state.offsetNum : null,
177
+ selectItems,
178
+ selectAll: isSelect ? selectAll : false,
179
+ joins: [...relationJoinSpecs, ...entityJoinSpecs],
180
+ relationFetches: classified.relationFetches,
181
+ joinedProjections: classified.joinedProjections,
182
+ skipLoadFor: classified.skipLoadFor,
183
+ whereParams: this.state.whereParams,
184
+ havingParams: this.state.havingParams,
185
+ ctes: this.state.ctes,
186
+ fromSource: this.state.fromSource ?? undefined,
187
+ unionAll: isSelect && this.state.unionAll
188
+ ? QueryPlanBuilder.build(this.state.unionAll, { kind: "select" })
189
+ : undefined,
190
+ pkColumns: this.state.pkColumns,
191
+ updateSet: this.buildUpdateSet(exprBuilder),
192
+ inScopeRegisteredCteNames: this.state.inScopeRegisteredCteNames,
193
+ referencedRegisteredCtes: this.irAnalyzer.planReferencedRegisteredCtes(this.analysis),
194
+ };
195
+ }
196
+ buildUpdateSet(exprBuilder) {
197
+ if (this.operation.kind !== "update")
198
+ return undefined;
199
+ const out = {};
200
+ const op = this.operation;
201
+ for (const [key, value] of Object.entries(op.set ?? {})) {
202
+ out[key] = { kind: "const", value };
203
+ }
204
+ for (const [key, ir] of Object.entries(op.setIr ?? {})) {
205
+ out[key] = exprBuilder.convert(ir);
206
+ }
207
+ return Object.keys(out).length > 0 ? out : undefined;
208
+ }
209
+ buildEntityJoins(paramToAlias, relationPathToAlias, oneToManyExists, subqueryPlans, relationJoinCount) {
210
+ const hints = this.state.entityJoinHints;
211
+ if (!hints?.length)
212
+ return [];
213
+ return hints.map((hint, i) => {
214
+ const alias = `t${relationJoinCount + i + 1}`;
215
+ const joinedParam = hint.onIr.localParamNames?.[0] ?? "a";
216
+ const rowParam = hint.onIr.localParamNames?.[1] ?? this.rootParam;
217
+ const onBuilder = new ExprBuilder({ ...paramToAlias, [joinedParam]: alias, [rowParam]: this.tableAlias }, relationPathToAlias, oneToManyExists, subqueryPlans, new Set(Object.keys(this.state.relations ?? {})), new Set((this.state.ctes ?? []).map((c) => c.name)));
218
+ return {
219
+ relationKey: "",
220
+ alias,
221
+ targetTable: hint.entity.table._table,
222
+ targetPkColumns: [],
223
+ foreignKeys: [],
224
+ relType: "many-to-one",
225
+ joinType: hint.joinType,
226
+ on: onBuilder.convert(hint.onIr.node),
227
+ };
228
+ });
229
+ }
230
+ // ─── alias / paramToAlias ───────────────────────────────────────────────────
231
+ /**
232
+ * Build the row-param-name → table-alias map for this plan.
233
+ *
234
+ * Two inputs are merged:
235
+ *
236
+ * 1. **Referenced names** — every row-param mentioned in this state's
237
+ * where/orderBy/select, plus any names required by nested correlated
238
+ * subqueries, plus the default row-param so single-row predicates
239
+ * without an explicit param still work.
240
+ * 2. **Outer scope** (only present for subquery builds) — the
241
+ * parent plan's `paramToAlias`. The parent's bindings are kept
242
+ * verbatim so correlated references resolve to the outer table
243
+ * alias.
244
+ *
245
+ * Each referenced name is mapped to *this builder's* table alias. For
246
+ * subquery builds, the `localFilter` set restricts that mapping to
247
+ * names the inner state actually binds locally — anything else stays
248
+ * pointing at the outer alias, which is exactly what correlated
249
+ * subqueries need.
250
+ */
251
+ buildParamToAlias() {
252
+ const referenced = new Set([DEFAULT_ROW_PARAM]);
253
+ for (const param of this.activeAnalysis().paramNames)
254
+ referenced.add(param);
255
+ for (const param of this.analysis.correlatedParamNames)
256
+ referenced.add(param);
257
+ const paramToAlias = { ...(this.outer?.paramToAlias ?? {}) };
258
+ const localFilter = this.outer ? new Set(this.analysis.localParamNames) : null;
259
+ const hasCteContext = (this.state.inScopeRegisteredCteNames?.length ?? 0) > 0 || (this.state.ctes?.length ?? 0) > 0;
260
+ for (const p of referenced) {
261
+ if (localFilter && !localFilter.has(p))
262
+ continue;
263
+ if (hasCteContext && p !== this.rootParam && this.analysis.localParamNames.includes(p)) {
264
+ continue;
265
+ }
266
+ paramToAlias[p] = this.tableAlias;
267
+ }
268
+ return paramToAlias;
269
+ }
270
+ /**
271
+ * Build every inline child query plan this state can reference during
272
+ * expression conversion. `ExprBuilder` receives the finished map and only
273
+ * swaps keys for plans; captured `QueryBuilder` values were already
274
+ * separated into `state.subqueryParams` at the `QueryBuilder` boundary.
275
+ */
276
+ buildSubqueryPlans(paramToAlias, relationPathToAlias) {
277
+ const plans = new Map();
278
+ const subqueryRefs = this.activeAnalysis().subqueryRefs;
279
+ const keys = Object.keys(subqueryRefs);
280
+ if (keys.length === 0)
281
+ return plans;
282
+ const subAlias = this.pickSubqueryAlias(paramToAlias, relationPathToAlias);
283
+ for (const key of keys) {
284
+ const captured = this.state.subqueryParams[key];
285
+ if (!captured) {
286
+ throw new Error(`[typhex] subqueryRef "${key}" did not resolve to a captured subquery`);
287
+ }
288
+ const analysis = this.analysis.subqueries[key];
289
+ if (!analysis) {
290
+ throw new Error(`[typhex] subqueryRef "${key}" did not resolve to query IR analysis`);
291
+ }
292
+ plans.set(key, QueryPlanBuilder.buildSubQuery(captured.state, { kind: "select" }, {
293
+ subAlias,
294
+ paramToAlias,
295
+ }, analysis));
296
+ }
297
+ return plans;
298
+ }
299
+ activeAnalysis() {
300
+ if (this.operation.kind === "select")
301
+ return this.analysis.all;
302
+ if (this.operation.kind === "insert" || this.operation.kind === "insertMany") {
303
+ return EMPTY_EXPR_IR_ANALYSIS;
304
+ }
305
+ return mergeExprIrAnalysis(this.analysis.where, this.analysis.orderBy);
306
+ }
307
+ pickSubqueryAlias(paramToAlias, relationPathToAlias) {
308
+ const used = new Set([this.tableAlias]);
309
+ for (const alias of Object.values(paramToAlias))
310
+ used.add(alias);
311
+ for (const alias of Object.values(relationPathToAlias))
312
+ used.add(alias);
313
+ return pickFreeAlias(used);
314
+ }
315
+ // ─── relation detection ─────────────────────────────────────────────────────
316
+ /**
317
+ * Detect joins and one-to-many EXISTS info for this state.
318
+ *
319
+ * Three short-circuits lift us out early with the empty result:
320
+ * 1. **Subquery builds** (`this.outer` set) — child plans inherit
321
+ * relation info from the outer plan via the `paramToAlias`
322
+ * mapping; doing detection independently would double-join.
323
+ * 2. **No relations on the entity** — nothing to detect.
324
+ * 3. **Skippable mutation** (`canSkipRelationAnalysis`) — UPDATE/
325
+ * DELETE that don't reference any relation in their where/orderBy/
326
+ * joinHints don't need the analysis.
327
+ *
328
+ * Otherwise it delegates to relation helper classes: one chooses which
329
+ * relations to JOIN, the other pre-resolves EXISTS metadata for `.some()`/
330
+ * `.every()` predicates.
331
+ */
332
+ detectRelations() {
333
+ if (this.outer)
334
+ return EMPTY_RELATION_DETECTION;
335
+ const { relations, resolveRelationTarget } = this.state;
336
+ if (!relations || Object.keys(relations).length === 0 || !resolveRelationTarget) {
337
+ return EMPTY_RELATION_DETECTION;
338
+ }
339
+ if (this.canSkipRelationAnalysis())
340
+ return EMPTY_RELATION_DETECTION;
341
+ const pkColumns = this.state.pkColumns;
342
+ return {
343
+ joins: new RelationJoinBuilder({
344
+ relations,
345
+ tableName: this.state.tableName,
346
+ columnNames: this.state.columnNames,
347
+ pkColumns,
348
+ resolveTarget: resolveRelationTarget,
349
+ }, this.analysis.joinRelationKeys, this.state.joinHints).build(),
350
+ oneToManyExists: new OneToManyExistsBuilder([...this.analysis.where.existsNodes, ...this.analysis.having.existsNodes], relations, this.rootParam, pkColumns, resolveRelationTarget, this.analysis.localParamNames).build(),
351
+ };
352
+ }
353
+ /**
354
+ * True for mutations that have no need for relation detection:
355
+ * - SELECT operations always need detection (returns false).
356
+ * - Any explicit `.innerJoin` / `.leftJoin` / etc. forces detection.
357
+ * - Otherwise, we can skip if neither the where predicate nor any
358
+ * orderBy expression references a relation key.
359
+ */
360
+ canSkipRelationAnalysis() {
361
+ if (this.operation.kind === "select")
362
+ return false;
363
+ if (this.operation.kind === "insert" || this.operation.kind === "insertMany")
364
+ return true;
365
+ if (this.state.joinHints?.length)
366
+ return false;
367
+ if (this.state.entityJoinHints?.length)
368
+ return false;
369
+ const relations = this.state.relations;
370
+ if (!relations)
371
+ return true;
372
+ return this.analysis.joinRelationKeys.size === 0;
373
+ }
374
+ // ─── select classification ──────────────────────────────────────────────────
375
+ /**
376
+ * Classify the SELECT-list against the relation map. Empty fast-path
377
+ * if there's no select IR or no relations to consult. Otherwise:
378
+ *
379
+ * 1. Compute the `reusableJoinKeys` set — relations the planner has
380
+ * decided to JOIN (so their member references stay in the SELECT
381
+ * list rather than triggering a separate fetch).
382
+ * 2. Resolve the parent's PK columns. Used by the
383
+ * classifier for to-many `parentPkColumns` and for the missing-
384
+ * key-column check.
385
+ * 3. Construct a `SelectClassifier` with those inputs and run it.
386
+ *
387
+ * The result drives the rest of the build: `buildSelectItems` reads
388
+ * `columnPaths`/`columnAliases`, the relation pipeline reads
389
+ * `relationFetches`/`joinedProjections`/`skipLoadFor`.
390
+ */
391
+ classifySelect() {
392
+ const select = this.state.selectIr;
393
+ const relations = this.state.relations;
394
+ if (!select || !relations)
395
+ return EMPTY_CLASSIFIED;
396
+ const pkColumns = this.state.pkColumns;
397
+ return new SelectClassifier(select, relations, pkColumns, this.analysis.reusableJoinKeys).classify();
398
+ }
399
+ // ─── select-list / orderBy / groupBy ────────────────────────────────────────
400
+ /**
401
+ * Build the ordered `SelectItem[]` that the dialect will turn into
402
+ * the SQL `SELECT` list. Four sources, in order:
403
+ *
404
+ * 1. **Column paths** — either the classifier's reshape (if relation
405
+ * analysis ran) or the IR's own `select.paths`. Each is resolved
406
+ * to an `ExprColumn` via `exprBuilder.resolveColumn`. Empty paths
407
+ * (rare — only when relation rewrite consumed the whole path)
408
+ * omit the alias since the column itself is the alias.
409
+ * 2. **Rest spread** — when the user wrote `({ ...u, ... })` in their
410
+ * select body, the IR sets `select.rest` and we need to add every
411
+ * table column not already in the explicit list.
412
+ * 3. **Aggregates** — `select.aggregates` carries IR aggregate nodes
413
+ * (e.g. `count(p.id) as total`); each becomes an `ExprAggregate`.
414
+ * 4. **Subqueries** — `select.subqueries` carries select-list inline
415
+ * `Entity.query()...` chains; each becomes an inline subquery via
416
+ * the pre-built subquery plan map.
417
+ */
418
+ buildSelectItems(classified, exprBuilder, selectIr) {
419
+ const select = selectIr;
420
+ if (!select)
421
+ return [];
422
+ const items = [];
423
+ const paths = classified.columnPaths ?? select.paths;
424
+ const aliases = classified.columnAliases ?? select.aliases ?? [];
425
+ const rootParam = select.param;
426
+ for (let i = 0; i < paths.length; i++) {
427
+ const path = paths[i];
428
+ const expr = exprBuilder.resolveColumn(rootParam, path);
429
+ items.push(path.length === 0 ? { expr } : { expr, alias: aliases[i] });
430
+ }
431
+ if (select.rest) {
432
+ const explicitCols = new Set(paths.map((p) => p[0]));
433
+ for (const c of this.state.columnNames) {
434
+ if (!explicitCols.has(c)) {
435
+ items.push({ expr: { kind: "column", alias: this.tableAlias, column: [c] } });
436
+ }
437
+ }
438
+ }
439
+ for (const agg of select.aggregates ?? []) {
440
+ items.push({
441
+ expr: exprBuilder.convertAggregate(agg, undefined, this.state.inlineParams),
442
+ alias: agg.alias,
443
+ });
444
+ }
445
+ for (const entry of select.subqueries ?? []) {
446
+ items.push({ expr: exprBuilder.convertSubqueryRef(entry.subquery), alias: entry.alias });
447
+ }
448
+ for (const entry of select.expressions ?? []) {
449
+ items.push({
450
+ expr: exprBuilder.convert(entry.expr, undefined, this.state.inlineParams),
451
+ alias: entry.alias,
452
+ });
453
+ }
454
+ return items;
455
+ }
456
+ buildOrderBy(exprBuilder) {
457
+ return this.state.orderBy.map((o) => ({
458
+ expr: o.expr.kind === "member"
459
+ ? exprBuilder.resolveColumn(o.expr.param, o.expr.path)
460
+ : exprBuilder.convert(o.expr, undefined, this.state.inlineParams),
461
+ direction: o.direction,
462
+ }));
463
+ }
464
+ /**
465
+ * Build the `GroupByItem[]` for the GROUP BY clause. Numeric entries
466
+ * are positional column references (e.g. `GROUP BY 1`); array entries
467
+ * are member paths resolved via `resolveColumn`. Empty path arrays
468
+ * throw — the IR shouldn't produce them, but the check turns a silent
469
+ * "GROUP BY t0." render bug into a loud error.
470
+ *
471
+ * The row-param defaults to the select's own param, falling back to
472
+ * `DEFAULT_ROW_PARAM` for groupBy without a preceding select.
473
+ */
474
+ buildGroupBy(exprBuilder) {
475
+ const entries = this.state.selectIr?.groupBy ?? [];
476
+ const param = this.state.selectIr?.param ?? DEFAULT_ROW_PARAM;
477
+ return entries.map((entry) => {
478
+ if (typeof entry === "number")
479
+ return { kind: "index", index: entry };
480
+ if (entry.length === 0)
481
+ throw new Error("[typhex] GROUP BY path cannot be empty");
482
+ return exprBuilder.resolveColumn(param, entry);
483
+ });
484
+ }
485
+ }
486
+ // ─── helpers ──────────────────────────────────────────────────────────────────
487
+ /** Sentinel for `detectRelations` short-circuits. Identity-shared so the
488
+ * three early-return paths don't allocate a fresh object per skip. */
489
+ const EMPTY_RELATION_DETECTION = {
490
+ joins: [],
491
+ oneToManyExists: {},
492
+ };
493
+ const EMPTY_EXPR_IR_ANALYSIS = {
494
+ paramNames: new Set(),
495
+ relationKeys: new Set(),
496
+ subqueryRefs: {},
497
+ existsNodes: [],
498
+ referencedRegisteredCtes: new Set(),
499
+ };
500
+ function mergeExprIrAnalysis(...items) {
501
+ const out = {
502
+ paramNames: new Set(),
503
+ relationKeys: new Set(),
504
+ subqueryRefs: {},
505
+ existsNodes: [],
506
+ referencedRegisteredCtes: new Set(),
507
+ };
508
+ for (const item of items) {
509
+ for (const param of item.paramNames)
510
+ out.paramNames.add(param);
511
+ for (const key of item.relationKeys)
512
+ out.relationKeys.add(key);
513
+ Object.assign(out.subqueryRefs, item.subqueryRefs);
514
+ out.existsNodes.push(...item.existsNodes);
515
+ for (const name of item.referencedRegisteredCtes)
516
+ out.referencedRegisteredCtes.add(name);
517
+ }
518
+ return out;
519
+ }
520
+ /**
521
+ * Pick the lowest-numbered `tN` alias not already taken. Sibling
522
+ * subqueries can share the same alias because each compiles to an
523
+ * isolated parenthesized SELECT.
524
+ */
525
+ function pickFreeAlias(used) {
526
+ for (let i = 1;; i++) {
527
+ const candidate = `t${i}`;
528
+ if (!used.has(candidate))
529
+ return candidate;
530
+ }
531
+ }
532
+ /**
533
+ * Project a `RelationJoinMeta` (used internally during relation-detection
534
+ * to carry the planning-time fields) onto the public `JoinSpec` shape
535
+ * that the dialect consumes. The dialect has no business knowing
536
+ * planning-only fields, so this strip-down is the boundary.
537
+ */
538
+ function toJoinSpec(j) {
539
+ return {
540
+ relationKey: j.relationKey,
541
+ alias: j.alias,
542
+ targetTable: j.targetTable,
543
+ targetPkColumns: j.targetPkColumns,
544
+ foreignKeys: j.foreignKeys,
545
+ relType: j.relType,
546
+ joinType: j.joinType,
547
+ };
548
+ }
549
+ //# sourceMappingURL=query-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-plan.js","sourceRoot":"","sources":["../../../../src/orm/helpers/query-plan/query-plan.ts"],"names":[],"mappings":"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"}