joist-core 2.3.0-next.97 → 2.3.0-next.99

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 (747) hide show
  1. package/build/BaseEntity.cjs.map +1 -1
  2. package/build/BaseEntity.js.map +1 -1
  3. package/build/Entity.cjs.map +1 -1
  4. package/build/Entity.js.map +1 -1
  5. package/build/EntityManager.cjs +45 -46
  6. package/build/EntityManager.cjs.map +1 -1
  7. package/build/EntityManager.d.cts +7 -7
  8. package/build/EntityManager.d.cts.map +1 -1
  9. package/build/EntityManager.d.mts +7 -7
  10. package/build/EntityManager.d.mts.map +1 -1
  11. package/build/EntityManager.js +27 -28
  12. package/build/EntityManager.js.map +1 -1
  13. package/build/EntityMetadata.cjs +0 -2
  14. package/build/EntityMetadata.cjs.map +1 -1
  15. package/build/EntityMetadata.d.cts +3 -3
  16. package/build/EntityMetadata.d.mts +3 -3
  17. package/build/EntityMetadata.js +0 -2
  18. package/build/EntityMetadata.js.map +1 -1
  19. package/build/IndexManager.cjs +1 -1
  20. package/build/IndexManager.cjs.map +1 -1
  21. package/build/IndexManager.js +1 -1
  22. package/build/IndexManager.js.map +1 -1
  23. package/build/InstanceData.cjs.map +1 -1
  24. package/build/InstanceData.js.map +1 -1
  25. package/build/PluginManager.cjs +0 -1
  26. package/build/PluginManager.cjs.map +1 -1
  27. package/build/PluginManager.d.cts +1 -1
  28. package/build/PluginManager.d.mts +1 -1
  29. package/build/PluginManager.js +0 -1
  30. package/build/PluginManager.js.map +1 -1
  31. package/build/batchloaders/enumCollectionBatchLoader.cjs +1 -1
  32. package/build/batchloaders/enumCollectionBatchLoader.cjs.map +1 -1
  33. package/build/batchloaders/enumCollectionBatchLoader.d.cts +1 -1
  34. package/build/batchloaders/enumCollectionBatchLoader.d.mts +1 -1
  35. package/build/batchloaders/enumCollectionBatchLoader.js +1 -1
  36. package/build/batchloaders/enumCollectionBatchLoader.js.map +1 -1
  37. package/build/batchloaders/loadBatchLoader.cjs +3 -4
  38. package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
  39. package/build/batchloaders/loadBatchLoader.d.cts +1 -1
  40. package/build/batchloaders/loadBatchLoader.d.mts +1 -1
  41. package/build/batchloaders/loadBatchLoader.js +2 -3
  42. package/build/batchloaders/loadBatchLoader.js.map +1 -1
  43. package/build/batchloaders/manyToManyBatchLoader.cjs +1 -1
  44. package/build/batchloaders/manyToManyBatchLoader.cjs.map +1 -1
  45. package/build/batchloaders/manyToManyBatchLoader.d.cts +1 -1
  46. package/build/batchloaders/manyToManyBatchLoader.d.mts +1 -1
  47. package/build/batchloaders/manyToManyBatchLoader.js +1 -1
  48. package/build/batchloaders/manyToManyBatchLoader.js.map +1 -1
  49. package/build/batchloaders/oneToManyBatchLoader.cjs +1 -1
  50. package/build/batchloaders/oneToManyBatchLoader.cjs.map +1 -1
  51. package/build/batchloaders/oneToManyBatchLoader.js +1 -1
  52. package/build/batchloaders/oneToManyBatchLoader.js.map +1 -1
  53. package/build/batchloaders/oneToOneBatchLoader.cjs +1 -1
  54. package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
  55. package/build/batchloaders/oneToOneBatchLoader.js +1 -1
  56. package/build/batchloaders/oneToOneBatchLoader.js.map +1 -1
  57. package/build/batchloaders/populateBatchLoader.cjs +11 -12
  58. package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
  59. package/build/batchloaders/populateBatchLoader.d.cts +1 -1
  60. package/build/batchloaders/populateBatchLoader.d.mts +1 -1
  61. package/build/batchloaders/populateBatchLoader.js +7 -8
  62. package/build/batchloaders/populateBatchLoader.js.map +1 -1
  63. package/build/batchloaders/recursiveChildrenBatchLoader.cjs +2 -2
  64. package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
  65. package/build/batchloaders/recursiveChildrenBatchLoader.js +2 -2
  66. package/build/batchloaders/recursiveChildrenBatchLoader.js.map +1 -1
  67. package/build/batchloaders/recursiveM2mBatchLoader.cjs +2 -2
  68. package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
  69. package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
  70. package/build/batchloaders/recursiveM2mBatchLoader.js.map +1 -1
  71. package/build/batchloaders/recursiveParentsBatchLoader.cjs +2 -2
  72. package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
  73. package/build/batchloaders/recursiveParentsBatchLoader.js +2 -2
  74. package/build/batchloaders/recursiveParentsBatchLoader.js.map +1 -1
  75. package/build/changes.cjs +2 -3
  76. package/build/changes.cjs.map +1 -1
  77. package/build/changes.js +2 -3
  78. package/build/changes.js.map +1 -1
  79. package/build/config.cjs +3 -3
  80. package/build/config.cjs.map +1 -1
  81. package/build/config.d.cts +2 -2
  82. package/build/config.d.mts +2 -2
  83. package/build/config.js +1 -1
  84. package/build/config.js.map +1 -1
  85. package/build/configure.cjs +10 -10
  86. package/build/configure.cjs.map +1 -1
  87. package/build/configure.js +5 -5
  88. package/build/configure.js.map +1 -1
  89. package/build/dataloaders/fastWhereFilterHash.cjs +8 -8
  90. package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
  91. package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
  92. package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
  93. package/build/dataloaders/fastWhereFilterHash.js +3 -3
  94. package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
  95. package/build/dataloaders/findByUniqueDataLoader.cjs.map +1 -1
  96. package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
  97. package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
  98. package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
  99. package/build/dataloaders/findCountDataLoader.cjs +2 -2
  100. package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
  101. package/build/dataloaders/findCountDataLoader.js +1 -1
  102. package/build/dataloaders/findCountDataLoader.js.map +1 -1
  103. package/build/dataloaders/findDataLoader.cjs +6 -6
  104. package/build/dataloaders/findDataLoader.cjs.map +1 -1
  105. package/build/dataloaders/findDataLoader.d.cts +1 -1
  106. package/build/dataloaders/findDataLoader.d.mts +1 -1
  107. package/build/dataloaders/findDataLoader.js +3 -3
  108. package/build/dataloaders/findDataLoader.js.map +1 -1
  109. package/build/dataloaders/findIdsDataLoader.cjs +3 -3
  110. package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
  111. package/build/dataloaders/findIdsDataLoader.js +2 -2
  112. package/build/dataloaders/findIdsDataLoader.js.map +1 -1
  113. package/build/dataloaders/findOrCreateDataLoader.cjs +1 -1
  114. package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
  115. package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
  116. package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
  117. package/build/dataloaders/findOrCreateDataLoader.js +1 -1
  118. package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
  119. package/build/dataloaders/findPaginatedDataLoader.cjs +6 -6
  120. package/build/dataloaders/findPaginatedDataLoader.cjs.map +1 -1
  121. package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -1
  122. package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -1
  123. package/build/dataloaders/findPaginatedDataLoader.js +3 -3
  124. package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
  125. package/build/dataloaders/lensDataLoader.cjs +3 -3
  126. package/build/dataloaders/lensDataLoader.cjs.map +1 -1
  127. package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
  128. package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
  129. package/build/dataloaders/lensDataLoader.js +2 -2
  130. package/build/dataloaders/lensDataLoader.js.map +1 -1
  131. package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -1
  132. package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
  133. package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
  134. package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
  135. package/build/dataloaders/manyToManyFindDataLoader.js +1 -1
  136. package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
  137. package/build/dataloaders/oneToManyFindDataLoader.cjs +1 -1
  138. package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
  139. package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
  140. package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
  141. package/build/dataloaders/oneToManyFindDataLoader.js +1 -1
  142. package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
  143. package/build/defaults.cjs +5 -5
  144. package/build/defaults.cjs.map +1 -1
  145. package/build/defaults.d.cts +1 -1
  146. package/build/defaults.d.cts.map +1 -1
  147. package/build/defaults.d.mts +1 -1
  148. package/build/defaults.d.mts.map +1 -1
  149. package/build/defaults.js +4 -4
  150. package/build/defaults.js.map +1 -1
  151. package/build/drivers/Driver.cjs +0 -1
  152. package/build/drivers/Driver.d.cts +1 -1
  153. package/build/drivers/Driver.d.mts +1 -1
  154. package/build/drivers/Driver.js +0 -1
  155. package/build/drivers/EntityWriter.cjs +6 -7
  156. package/build/drivers/EntityWriter.cjs.map +1 -1
  157. package/build/drivers/EntityWriter.d.cts +1 -1
  158. package/build/drivers/EntityWriter.d.mts +1 -1
  159. package/build/drivers/EntityWriter.js +2 -3
  160. package/build/drivers/EntityWriter.js.map +1 -1
  161. package/build/drivers/IdAssigner.cjs +0 -1
  162. package/build/drivers/IdAssigner.cjs.map +1 -1
  163. package/build/drivers/IdAssigner.d.cts +1 -1
  164. package/build/drivers/IdAssigner.d.mts +1 -1
  165. package/build/drivers/IdAssigner.js +0 -1
  166. package/build/drivers/IdAssigner.js.map +1 -1
  167. package/build/drivers/driverApi.cjs +19 -0
  168. package/build/drivers/driverApi.cjs.map +1 -0
  169. package/build/drivers/driverApi.d.cts +22 -0
  170. package/build/drivers/driverApi.d.cts.map +1 -0
  171. package/build/drivers/driverApi.d.mts +22 -0
  172. package/build/drivers/driverApi.d.mts.map +1 -0
  173. package/build/drivers/driverApi.js +18 -0
  174. package/build/drivers/driverApi.js.map +1 -0
  175. package/build/fields.cjs +3 -3
  176. package/build/fields.cjs.map +1 -1
  177. package/build/fields.js +2 -2
  178. package/build/fields.js.map +1 -1
  179. package/build/{FlushLock.cjs → flush/FlushLock.cjs} +1 -1
  180. package/build/flush/FlushLock.cjs.map +1 -0
  181. package/build/{FlushLock.d.cts → flush/FlushLock.d.cts} +1 -1
  182. package/build/flush/FlushLock.d.cts.map +1 -0
  183. package/build/{FlushLock.d.mts → flush/FlushLock.d.mts} +1 -1
  184. package/build/flush/FlushLock.d.mts.map +1 -0
  185. package/build/{FlushLock.js → flush/FlushLock.js} +1 -1
  186. package/build/flush/FlushLock.js.map +1 -0
  187. package/build/{JoinRows.cjs → flush/JoinRows.cjs} +5 -8
  188. package/build/flush/JoinRows.cjs.map +1 -0
  189. package/build/{JoinRows.d.cts → flush/JoinRows.d.cts} +5 -5
  190. package/build/flush/JoinRows.d.cts.map +1 -0
  191. package/build/{JoinRows.d.mts → flush/JoinRows.d.mts} +5 -5
  192. package/build/flush/JoinRows.d.mts.map +1 -0
  193. package/build/{JoinRows.js → flush/JoinRows.js} +5 -8
  194. package/build/flush/JoinRows.js.map +1 -0
  195. package/build/{PendingChanges.cjs → flush/PendingChanges.cjs} +0 -1
  196. package/build/{PendingChanges.d.cts → flush/PendingChanges.d.cts} +2 -2
  197. package/build/flush/PendingChanges.d.cts.map +1 -0
  198. package/build/{PendingChanges.d.mts → flush/PendingChanges.d.mts} +2 -2
  199. package/build/flush/PendingChanges.d.mts.map +1 -0
  200. package/build/flush/PendingChanges.js +1 -0
  201. package/build/{Todo.cjs → flush/Todo.cjs} +4 -6
  202. package/build/flush/Todo.cjs.map +1 -0
  203. package/build/{Todo.d.cts → flush/Todo.d.cts} +3 -3
  204. package/build/flush/Todo.d.cts.map +1 -0
  205. package/build/{Todo.d.mts → flush/Todo.d.mts} +3 -3
  206. package/build/flush/Todo.d.mts.map +1 -0
  207. package/build/{Todo.js → flush/Todo.js} +4 -6
  208. package/build/flush/Todo.js.map +1 -0
  209. package/build/getProperties.cjs.map +1 -1
  210. package/build/getProperties.js.map +1 -1
  211. package/build/index.cjs +100 -100
  212. package/build/index.cjs.map +1 -1
  213. package/build/index.d.cts +15 -15
  214. package/build/index.d.mts +15 -15
  215. package/build/index.js +42 -42
  216. package/build/index.js.map +1 -1
  217. package/build/json.cjs +4 -4
  218. package/build/json.cjs.map +1 -1
  219. package/build/json.js +3 -3
  220. package/build/json.js.map +1 -1
  221. package/build/keys.cjs +1 -1
  222. package/build/keys.cjs.map +1 -1
  223. package/build/keys.js +1 -1
  224. package/build/keys.js.map +1 -1
  225. package/build/{HintTree.cjs → loading/HintTree.cjs} +2 -5
  226. package/build/loading/HintTree.cjs.map +1 -0
  227. package/build/{HintTree.d.cts → loading/HintTree.d.cts} +3 -3
  228. package/build/loading/HintTree.d.cts.map +1 -0
  229. package/build/{HintTree.d.mts → loading/HintTree.d.mts} +3 -3
  230. package/build/loading/HintTree.d.mts.map +1 -0
  231. package/build/{HintTree.js → loading/HintTree.js} +2 -5
  232. package/build/loading/HintTree.js.map +1 -0
  233. package/build/{IsLoadedCache.cjs → loading/IsLoadedCache.cjs} +2 -3
  234. package/build/loading/IsLoadedCache.cjs.map +1 -0
  235. package/build/{IsLoadedCache.d.cts → loading/IsLoadedCache.d.cts} +2 -2
  236. package/build/loading/IsLoadedCache.d.cts.map +1 -0
  237. package/build/{IsLoadedCache.d.mts → loading/IsLoadedCache.d.mts} +2 -2
  238. package/build/loading/IsLoadedCache.d.mts.map +1 -0
  239. package/build/{IsLoadedCache.js → loading/IsLoadedCache.js} +2 -3
  240. package/build/{IsLoadedCache.cjs.map → loading/IsLoadedCache.js.map} +1 -1
  241. package/build/{loadHints.cjs → loading/loadHints.cjs} +6 -11
  242. package/build/loading/loadHints.cjs.map +1 -0
  243. package/build/{loadHints.d.cts → loading/loadHints.d.cts} +14 -14
  244. package/build/loading/loadHints.d.cts.map +1 -0
  245. package/build/{loadHints.d.mts → loading/loadHints.d.mts} +14 -14
  246. package/build/loading/loadHints.d.mts.map +1 -0
  247. package/build/{loadHints.js → loading/loadHints.js} +3 -8
  248. package/build/loading/loadHints.js.map +1 -0
  249. package/build/{loadLens.cjs → loading/loadLens.cjs} +8 -9
  250. package/build/loading/loadLens.cjs.map +1 -0
  251. package/build/{loadLens.d.cts → loading/loadLens.d.cts} +3 -3
  252. package/build/loading/loadLens.d.cts.map +1 -0
  253. package/build/{loadLens.d.mts → loading/loadLens.d.mts} +3 -3
  254. package/build/loading/loadLens.d.mts.map +1 -0
  255. package/build/{loadLens.js → loading/loadLens.js} +8 -9
  256. package/build/loading/loadLens.js.map +1 -0
  257. package/build/{withLoaded.cjs → loading/withLoaded.cjs} +12 -13
  258. package/build/loading/withLoaded.cjs.map +1 -0
  259. package/build/{withLoaded.d.cts → loading/withLoaded.d.cts} +9 -9
  260. package/build/loading/withLoaded.d.cts.map +1 -0
  261. package/build/{withLoaded.d.mts → loading/withLoaded.d.mts} +9 -9
  262. package/build/loading/withLoaded.d.mts.map +1 -0
  263. package/build/{withLoaded.js → loading/withLoaded.js} +10 -11
  264. package/build/loading/withLoaded.js.map +1 -0
  265. package/build/logging/FactoryLogger.cjs.map +1 -1
  266. package/build/logging/FactoryLogger.d.cts.map +1 -1
  267. package/build/logging/FactoryLogger.d.mts.map +1 -1
  268. package/build/logging/FactoryLogger.js.map +1 -1
  269. package/build/logging/FieldLogger.cjs.map +1 -1
  270. package/build/logging/FieldLogger.d.cts.map +1 -1
  271. package/build/logging/FieldLogger.d.mts.map +1 -1
  272. package/build/logging/FieldLogger.js.map +1 -1
  273. package/build/logging/ReactionLogger.cjs +0 -2
  274. package/build/logging/ReactionLogger.cjs.map +1 -1
  275. package/build/logging/ReactionLogger.d.cts +2 -2
  276. package/build/logging/ReactionLogger.d.cts.map +1 -1
  277. package/build/logging/ReactionLogger.d.mts +2 -2
  278. package/build/logging/ReactionLogger.d.mts.map +1 -1
  279. package/build/logging/ReactionLogger.js +0 -2
  280. package/build/logging/ReactionLogger.js.map +1 -1
  281. package/build/newEntity.cjs.map +1 -1
  282. package/build/newEntity.js.map +1 -1
  283. package/build/newTestInstance.cjs +3 -3
  284. package/build/newTestInstance.cjs.map +1 -1
  285. package/build/newTestInstance.d.cts +1 -1
  286. package/build/newTestInstance.d.cts.map +1 -1
  287. package/build/newTestInstance.d.mts +1 -1
  288. package/build/newTestInstance.d.mts.map +1 -1
  289. package/build/newTestInstance.js +2 -2
  290. package/build/newTestInstance.js.map +1 -1
  291. package/build/normalizeHints.cjs +0 -2
  292. package/build/normalizeHints.cjs.map +1 -1
  293. package/build/normalizeHints.d.cts +2 -2
  294. package/build/normalizeHints.d.mts +2 -2
  295. package/build/normalizeHints.js +0 -2
  296. package/build/normalizeHints.js.map +1 -1
  297. package/build/nowUTC.cjs +2 -2
  298. package/build/nowUTC.cjs.map +1 -1
  299. package/build/nowUTC.d.cts +1 -1
  300. package/build/nowUTC.d.mts +1 -1
  301. package/build/nowUTC.js +1 -1
  302. package/build/nowUTC.js.map +1 -1
  303. package/build/plugins/ImmutableEntitiesPlugin.cjs.map +1 -1
  304. package/build/plugins/ImmutableEntitiesPlugin.js.map +1 -1
  305. package/build/plugins/PreloadPlugin.cjs +0 -2
  306. package/build/plugins/PreloadPlugin.d.cts +2 -2
  307. package/build/plugins/PreloadPlugin.d.mts +2 -2
  308. package/build/plugins/PreloadPlugin.js +0 -2
  309. package/build/preloading/JsonAggregatePreloader.cjs +1 -4
  310. package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
  311. package/build/preloading/JsonAggregatePreloader.d.cts +2 -2
  312. package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
  313. package/build/preloading/JsonAggregatePreloader.d.mts +2 -2
  314. package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
  315. package/build/preloading/JsonAggregatePreloader.js +1 -4
  316. package/build/preloading/JsonAggregatePreloader.js.map +1 -1
  317. package/build/preloading/canPreload.cjs.map +1 -1
  318. package/build/preloading/canPreload.js.map +1 -1
  319. package/build/preloading/partitionHint.cjs +2 -3
  320. package/build/preloading/partitionHint.cjs.map +1 -1
  321. package/build/preloading/partitionHint.d.cts +1 -1
  322. package/build/preloading/partitionHint.d.mts +1 -1
  323. package/build/preloading/partitionHint.js +2 -3
  324. package/build/preloading/partitionHint.js.map +1 -1
  325. package/build/queries/ConditionBuilder.cjs.map +1 -1
  326. package/build/queries/ConditionBuilder.d.cts +1 -1
  327. package/build/queries/ConditionBuilder.d.mts +1 -1
  328. package/build/queries/ConditionBuilder.js.map +1 -1
  329. package/build/queries/conditions.cjs.map +1 -1
  330. package/build/queries/conditions.js.map +1 -1
  331. package/build/queries/entityQueryUtils.cjs.map +1 -1
  332. package/build/queries/entityQueryUtils.js.map +1 -1
  333. package/build/queries/find/Aliases.cjs +1 -1
  334. package/build/queries/find/Aliases.cjs.map +1 -1
  335. package/build/queries/find/Aliases.d.cts.map +1 -1
  336. package/build/queries/find/Aliases.d.mts.map +1 -1
  337. package/build/queries/find/Aliases.js +1 -1
  338. package/build/queries/find/Aliases.js.map +1 -1
  339. package/build/queries/find/DeferredAlias.cjs.map +1 -1
  340. package/build/queries/find/DeferredAlias.js.map +1 -1
  341. package/build/queries/find/EntityFilter.cjs.map +1 -1
  342. package/build/queries/find/EntityFilter.js.map +1 -1
  343. package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -1
  344. package/build/queries/find/EntityGraphQLFilter.js.map +1 -1
  345. package/build/queries/find/QueryParser.cjs +2 -2
  346. package/build/queries/find/QueryParser.cjs.map +1 -1
  347. package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -1
  348. package/build/queries/find/QueryParser.collectionJoins.js.map +1 -1
  349. package/build/queries/find/QueryParser.d.cts.map +1 -1
  350. package/build/queries/find/QueryParser.d.mts.map +1 -1
  351. package/build/queries/find/QueryParser.js +2 -2
  352. package/build/queries/find/QueryParser.js.map +1 -1
  353. package/build/queries/find/QueryParser.pruning.cjs.map +1 -1
  354. package/build/queries/find/QueryParser.pruning.js.map +1 -1
  355. package/build/queries/find/QueryVisitor.cjs.map +1 -1
  356. package/build/queries/find/QueryVisitor.js.map +1 -1
  357. package/build/queries/find/buildFindQuery.cjs.map +1 -1
  358. package/build/queries/find/buildFindQuery.js.map +1 -1
  359. package/build/queries/find/scopes.cjs.map +1 -1
  360. package/build/queries/find/scopes.d.cts +1 -1
  361. package/build/queries/find/scopes.d.mts +1 -1
  362. package/build/queries/find/scopes.js.map +1 -1
  363. package/build/queries/parsedConditions.cjs.map +1 -1
  364. package/build/queries/parsedConditions.js.map +1 -1
  365. package/build/queries/renderConditions.cjs.map +1 -1
  366. package/build/queries/renderConditions.js.map +1 -1
  367. package/build/queries/skipCondition.cjs.map +1 -1
  368. package/build/queries/skipCondition.js.map +1 -1
  369. package/build/queries/sql/AliasAssigner.cjs.map +1 -1
  370. package/build/queries/sql/AliasAssigner.js.map +1 -1
  371. package/build/queries/sql/Expr.cjs +2 -2
  372. package/build/queries/sql/Expr.cjs.map +1 -1
  373. package/build/queries/sql/Expr.d.cts +1 -1
  374. package/build/queries/sql/Expr.d.mts +1 -1
  375. package/build/queries/sql/Expr.js +1 -1
  376. package/build/queries/sql/Expr.js.map +1 -1
  377. package/build/queries/sql/Tables.cjs +1 -1
  378. package/build/queries/sql/Tables.cjs.map +1 -1
  379. package/build/queries/sql/Tables.d.cts.map +1 -1
  380. package/build/queries/sql/Tables.d.mts.map +1 -1
  381. package/build/queries/sql/Tables.js +1 -1
  382. package/build/queries/sql/Tables.js.map +1 -1
  383. package/build/queries/sql/execute.cjs +1 -1
  384. package/build/queries/sql/execute.cjs.map +1 -1
  385. package/build/queries/sql/execute.js +1 -1
  386. package/build/queries/sql/execute.js.map +1 -1
  387. package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -1
  388. package/build/queries/sql/expressions/arrayAgg.js.map +1 -1
  389. package/build/queries/sql/expressions/case.cjs.map +1 -1
  390. package/build/queries/sql/expressions/case.js.map +1 -1
  391. package/build/queries/sql/expressions/coalesce.cjs.map +1 -1
  392. package/build/queries/sql/expressions/coalesce.js.map +1 -1
  393. package/build/queries/sql/expressions/codecs.cjs +2 -2
  394. package/build/queries/sql/expressions/codecs.cjs.map +1 -1
  395. package/build/queries/sql/expressions/codecs.js +1 -1
  396. package/build/queries/sql/expressions/codecs.js.map +1 -1
  397. package/build/queries/sql/expressions/expression.cjs.map +1 -1
  398. package/build/queries/sql/expressions/expression.d.cts.map +1 -1
  399. package/build/queries/sql/expressions/expression.d.mts.map +1 -1
  400. package/build/queries/sql/expressions/expression.js.map +1 -1
  401. package/build/queries/sql/expressions/greatest.cjs.map +1 -1
  402. package/build/queries/sql/expressions/greatest.js.map +1 -1
  403. package/build/queries/sql/expressions/least.cjs.map +1 -1
  404. package/build/queries/sql/expressions/least.js.map +1 -1
  405. package/build/queries/sql/expressions/nullIf.cjs.map +1 -1
  406. package/build/queries/sql/expressions/nullIf.js.map +1 -1
  407. package/build/queries/sql/expressions/parseExpression.cjs.map +1 -1
  408. package/build/queries/sql/expressions/parseExpression.js.map +1 -1
  409. package/build/queries/sql/expressions/types.d.cts.map +1 -1
  410. package/build/queries/sql/expressions/types.d.mts.map +1 -1
  411. package/build/queries/sql/query.cjs +1 -1
  412. package/build/queries/sql/query.cjs.map +1 -1
  413. package/build/queries/sql/query.d.cts +1 -1
  414. package/build/queries/sql/query.d.mts +1 -1
  415. package/build/queries/sql/query.js +1 -1
  416. package/build/queries/sql/query.js.map +1 -1
  417. package/build/{unnest.cjs → queries/unnest.cjs} +1 -2
  418. package/build/queries/unnest.cjs.map +1 -0
  419. package/build/{unnest.d.cts → queries/unnest.d.cts} +3 -3
  420. package/build/queries/unnest.d.cts.map +1 -0
  421. package/build/{unnest.d.mts → queries/unnest.d.mts} +3 -3
  422. package/build/queries/unnest.d.mts.map +1 -0
  423. package/build/{unnest.js → queries/unnest.js} +1 -2
  424. package/build/queries/unnest.js.map +1 -0
  425. package/build/queries/valueFilters.cjs.map +1 -1
  426. package/build/queries/valueFilters.d.cts +1 -1
  427. package/build/queries/valueFilters.d.cts.map +1 -1
  428. package/build/queries/valueFilters.d.mts +1 -1
  429. package/build/queries/valueFilters.d.mts.map +1 -1
  430. package/build/queries/valueFilters.js.map +1 -1
  431. package/build/{ReactionsManager.cjs → reactivity/ReactionsManager.cjs} +8 -10
  432. package/build/reactivity/ReactionsManager.cjs.map +1 -0
  433. package/build/{ReactionsManager.d.cts → reactivity/ReactionsManager.d.cts} +5 -6
  434. package/build/reactivity/ReactionsManager.d.cts.map +1 -0
  435. package/build/{ReactionsManager.d.mts → reactivity/ReactionsManager.d.mts} +5 -6
  436. package/build/reactivity/ReactionsManager.d.mts.map +1 -0
  437. package/build/{ReactionsManager.js → reactivity/ReactionsManager.js} +6 -8
  438. package/build/reactivity/ReactionsManager.js.map +1 -0
  439. package/build/{reactiveHints.cjs → reactivity/reactiveHints.cjs} +12 -16
  440. package/build/reactivity/reactiveHints.cjs.map +1 -0
  441. package/build/{reactiveHints.d.cts → reactivity/reactiveHints.d.cts} +17 -17
  442. package/build/reactivity/reactiveHints.d.cts.map +1 -0
  443. package/build/{reactiveHints.d.mts → reactivity/reactiveHints.d.mts} +17 -17
  444. package/build/reactivity/reactiveHints.d.mts.map +1 -0
  445. package/build/{reactiveHints.js → reactivity/reactiveHints.js} +12 -16
  446. package/build/reactivity/reactiveHints.js.map +1 -0
  447. package/build/relations/AbstractRelationImpl.cjs.map +1 -1
  448. package/build/relations/AbstractRelationImpl.js.map +1 -1
  449. package/build/relations/AsyncProperty.cjs.map +1 -1
  450. package/build/relations/AsyncProperty.js.map +1 -1
  451. package/build/relations/AsyncReactiveField.cjs +6 -6
  452. package/build/relations/AsyncReactiveField.cjs.map +1 -1
  453. package/build/relations/AsyncReactiveField.d.cts +1 -1
  454. package/build/relations/AsyncReactiveField.d.mts +1 -1
  455. package/build/relations/AsyncReactiveField.js +4 -4
  456. package/build/relations/AsyncReactiveField.js.map +1 -1
  457. package/build/relations/Collection.cjs +1 -1
  458. package/build/relations/Collection.cjs.map +1 -1
  459. package/build/relations/Collection.js +1 -1
  460. package/build/relations/Collection.js.map +1 -1
  461. package/build/relations/CustomCollection.cjs.map +1 -1
  462. package/build/relations/CustomCollection.d.cts +1 -1
  463. package/build/relations/CustomCollection.d.mts +1 -1
  464. package/build/relations/CustomCollection.js.map +1 -1
  465. package/build/relations/CustomReference.cjs +1 -1
  466. package/build/relations/CustomReference.cjs.map +1 -1
  467. package/build/relations/CustomReference.d.cts +1 -1
  468. package/build/relations/CustomReference.d.mts +1 -1
  469. package/build/relations/CustomReference.js +1 -1
  470. package/build/relations/CustomReference.js.map +1 -1
  471. package/build/relations/EnumCollection.cjs.map +1 -1
  472. package/build/relations/EnumCollection.d.cts +1 -1
  473. package/build/relations/EnumCollection.d.mts +1 -1
  474. package/build/relations/EnumCollection.js.map +1 -1
  475. package/build/relations/LazyField.cjs +4 -4
  476. package/build/relations/LazyField.cjs.map +1 -1
  477. package/build/relations/LazyField.js +4 -4
  478. package/build/relations/LazyField.js.map +1 -1
  479. package/build/relations/ManyToManyCollection.cjs +3 -3
  480. package/build/relations/ManyToManyCollection.cjs.map +1 -1
  481. package/build/relations/ManyToManyCollection.js +3 -3
  482. package/build/relations/ManyToManyCollection.js.map +1 -1
  483. package/build/relations/ManyToManyLargeCollection.cjs +3 -3
  484. package/build/relations/ManyToManyLargeCollection.cjs.map +1 -1
  485. package/build/relations/ManyToManyLargeCollection.js +3 -3
  486. package/build/relations/ManyToManyLargeCollection.js.map +1 -1
  487. package/build/relations/ManyToOneReference.cjs +4 -4
  488. package/build/relations/ManyToOneReference.cjs.map +1 -1
  489. package/build/relations/ManyToOneReference.js +4 -4
  490. package/build/relations/ManyToOneReference.js.map +1 -1
  491. package/build/relations/OneToManyCollection.cjs +1 -2
  492. package/build/relations/OneToManyCollection.cjs.map +1 -1
  493. package/build/relations/OneToManyCollection.d.cts +1 -1
  494. package/build/relations/OneToManyCollection.d.mts +1 -1
  495. package/build/relations/OneToManyCollection.js +1 -2
  496. package/build/relations/OneToManyCollection.js.map +1 -1
  497. package/build/relations/OneToManyLargeCollection.cjs +1 -1
  498. package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
  499. package/build/relations/OneToManyLargeCollection.js +1 -1
  500. package/build/relations/OneToManyLargeCollection.js.map +1 -1
  501. package/build/relations/OneToOneReference.cjs +5 -5
  502. package/build/relations/OneToOneReference.cjs.map +1 -1
  503. package/build/relations/OneToOneReference.js +5 -5
  504. package/build/relations/OneToOneReference.js.map +1 -1
  505. package/build/relations/PolymorphicReference.cjs +3 -3
  506. package/build/relations/PolymorphicReference.cjs.map +1 -1
  507. package/build/relations/PolymorphicReference.js +3 -3
  508. package/build/relations/PolymorphicReference.js.map +1 -1
  509. package/build/relations/ReactiveField.cjs +5 -6
  510. package/build/relations/ReactiveField.cjs.map +1 -1
  511. package/build/relations/ReactiveField.d.cts +2 -2
  512. package/build/relations/ReactiveField.d.mts +2 -2
  513. package/build/relations/ReactiveField.js +3 -4
  514. package/build/relations/ReactiveField.js.map +1 -1
  515. package/build/relations/ReactiveGetter.cjs +0 -1
  516. package/build/relations/ReactiveGetter.cjs.map +1 -1
  517. package/build/relations/ReactiveGetter.d.cts +1 -1
  518. package/build/relations/ReactiveGetter.d.mts +1 -1
  519. package/build/relations/ReactiveGetter.js +0 -1
  520. package/build/relations/ReactiveGetter.js.map +1 -1
  521. package/build/relations/ReactiveManyToMany.cjs +5 -6
  522. package/build/relations/ReactiveManyToMany.cjs.map +1 -1
  523. package/build/relations/ReactiveManyToMany.d.cts +2 -2
  524. package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
  525. package/build/relations/ReactiveManyToMany.d.mts +2 -2
  526. package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
  527. package/build/relations/ReactiveManyToMany.js +3 -4
  528. package/build/relations/ReactiveManyToMany.js.map +1 -1
  529. package/build/relations/ReactiveManyToManyOtherSide.cjs +1 -3
  530. package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
  531. package/build/relations/ReactiveManyToManyOtherSide.d.cts +2 -2
  532. package/build/relations/ReactiveManyToManyOtherSide.d.mts +2 -2
  533. package/build/relations/ReactiveManyToManyOtherSide.js +1 -3
  534. package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
  535. package/build/relations/ReactiveReference.cjs +8 -9
  536. package/build/relations/ReactiveReference.cjs.map +1 -1
  537. package/build/relations/ReactiveReference.d.cts +2 -2
  538. package/build/relations/ReactiveReference.d.cts.map +1 -1
  539. package/build/relations/ReactiveReference.d.mts +2 -2
  540. package/build/relations/ReactiveReference.d.mts.map +1 -1
  541. package/build/relations/ReactiveReference.js +6 -7
  542. package/build/relations/ReactiveReference.js.map +1 -1
  543. package/build/relations/ReadOnlyCollection.cjs.map +1 -1
  544. package/build/relations/ReadOnlyCollection.js.map +1 -1
  545. package/build/relations/RecursiveCollection.cjs +3 -4
  546. package/build/relations/RecursiveCollection.cjs.map +1 -1
  547. package/build/relations/RecursiveCollection.d.cts +1 -1
  548. package/build/relations/RecursiveCollection.d.mts +1 -1
  549. package/build/relations/RecursiveCollection.js +3 -4
  550. package/build/relations/RecursiveCollection.js.map +1 -1
  551. package/build/relations/RecursiveCycleError.cjs.map +1 -1
  552. package/build/relations/RecursiveCycleError.js.map +1 -1
  553. package/build/relations/Reference.cjs +1 -1
  554. package/build/relations/Reference.cjs.map +1 -1
  555. package/build/relations/Reference.js +1 -1
  556. package/build/relations/Reference.js.map +1 -1
  557. package/build/relations/Relation.cjs.map +1 -1
  558. package/build/relations/Relation.js.map +1 -1
  559. package/build/relations/hasAsyncMethod.cjs +2 -2
  560. package/build/relations/hasAsyncMethod.cjs.map +1 -1
  561. package/build/relations/hasAsyncMethod.d.cts +1 -1
  562. package/build/relations/hasAsyncMethod.d.mts +1 -1
  563. package/build/relations/hasAsyncMethod.js +1 -1
  564. package/build/relations/hasAsyncMethod.js.map +1 -1
  565. package/build/relations/hasManyDerived.cjs +3 -3
  566. package/build/relations/hasManyDerived.cjs.map +1 -1
  567. package/build/relations/hasManyDerived.d.cts +1 -1
  568. package/build/relations/hasManyDerived.d.mts +1 -1
  569. package/build/relations/hasManyDerived.js +2 -2
  570. package/build/relations/hasManyDerived.js.map +1 -1
  571. package/build/relations/hasManyThrough.cjs +6 -6
  572. package/build/relations/hasManyThrough.cjs.map +1 -1
  573. package/build/relations/hasManyThrough.d.cts +1 -1
  574. package/build/relations/hasManyThrough.d.mts +1 -1
  575. package/build/relations/hasManyThrough.js +2 -2
  576. package/build/relations/hasManyThrough.js.map +1 -1
  577. package/build/relations/hasOneDerived.cjs +3 -3
  578. package/build/relations/hasOneDerived.cjs.map +1 -1
  579. package/build/relations/hasOneDerived.d.cts +1 -1
  580. package/build/relations/hasOneDerived.d.mts +1 -1
  581. package/build/relations/hasOneDerived.js +2 -2
  582. package/build/relations/hasOneDerived.js.map +1 -1
  583. package/build/relations/hasOneThrough.cjs +7 -7
  584. package/build/relations/hasOneThrough.cjs.map +1 -1
  585. package/build/relations/hasOneThrough.d.cts +1 -1
  586. package/build/relations/hasOneThrough.d.mts +1 -1
  587. package/build/relations/hasOneThrough.js +2 -2
  588. package/build/relations/hasOneThrough.js.map +1 -1
  589. package/build/relations/hasProperty.cjs +4 -4
  590. package/build/relations/hasProperty.cjs.map +1 -1
  591. package/build/relations/hasProperty.d.cts +2 -2
  592. package/build/relations/hasProperty.d.mts +2 -2
  593. package/build/relations/hasProperty.js +2 -2
  594. package/build/relations/hasProperty.js.map +1 -1
  595. package/build/relations/index.cjs +10 -10
  596. package/build/relations/index.js +10 -10
  597. package/build/relations/isCascadeDelete.cjs.map +1 -1
  598. package/build/relations/isCascadeDelete.js.map +1 -1
  599. package/build/resurrection.cjs.map +1 -1
  600. package/build/resurrection.js.map +1 -1
  601. package/build/rules.cjs +3 -4
  602. package/build/rules.cjs.map +1 -1
  603. package/build/rules.d.cts +1 -1
  604. package/build/rules.d.mts +1 -1
  605. package/build/rules.js +3 -4
  606. package/build/rules.js.map +1 -1
  607. package/build/runtimeConfig.cjs.map +1 -1
  608. package/build/runtimeConfig.js.map +1 -1
  609. package/build/{TypeInfo.cjs → serde/TypeInfo.cjs} +1 -1
  610. package/build/serde/TypeInfo.cjs.map +1 -0
  611. package/build/{TypeInfo.d.cts → serde/TypeInfo.d.cts} +2 -2
  612. package/build/serde/TypeInfo.d.cts.map +1 -0
  613. package/build/{TypeInfo.d.mts → serde/TypeInfo.d.mts} +2 -2
  614. package/build/serde/TypeInfo.d.mts.map +1 -0
  615. package/build/{TypeInfo.js → serde/TypeInfo.js} +1 -1
  616. package/build/serde/TypeInfo.js.map +1 -0
  617. package/build/{columns.cjs → serde/columns.cjs} +1 -1
  618. package/build/serde/columns.cjs.map +1 -0
  619. package/build/{columns.d.cts → serde/columns.d.cts} +2 -2
  620. package/build/serde/columns.d.cts.map +1 -0
  621. package/build/{columns.d.mts → serde/columns.d.mts} +2 -2
  622. package/build/serde/columns.d.mts.map +1 -0
  623. package/build/{columns.js → serde/columns.js} +1 -1
  624. package/build/serde/columns.js.map +1 -0
  625. package/build/{fieldSerde.cjs → serde/fieldSerde.cjs} +6 -6
  626. package/build/serde/fieldSerde.cjs.map +1 -0
  627. package/build/{fieldSerde.d.cts → serde/fieldSerde.d.cts} +5 -5
  628. package/build/serde/fieldSerde.d.cts.map +1 -0
  629. package/build/{fieldSerde.d.mts → serde/fieldSerde.d.mts} +5 -5
  630. package/build/serde/fieldSerde.d.mts.map +1 -0
  631. package/build/{fieldSerde.js → serde/fieldSerde.js} +6 -6
  632. package/build/serde/fieldSerde.js.map +1 -0
  633. package/build/{serde.cjs → serde/serde.cjs} +25 -26
  634. package/build/serde/serde.cjs.map +1 -0
  635. package/build/{serde.d.cts → serde/serde.d.cts} +1 -1
  636. package/build/serde/serde.d.cts.map +1 -0
  637. package/build/{serde.d.mts → serde/serde.d.mts} +1 -1
  638. package/build/serde/serde.d.mts.map +1 -0
  639. package/build/{serde.js → serde/serde.js} +4 -5
  640. package/build/serde/serde.js.map +1 -0
  641. package/build/{temporal.cjs → serde/temporal.cjs} +1 -1
  642. package/build/serde/temporal.cjs.map +1 -0
  643. package/build/{temporal.d.cts → serde/temporal.d.cts} +1 -1
  644. package/build/serde/temporal.d.cts.map +1 -0
  645. package/build/{temporal.d.mts → serde/temporal.d.mts} +1 -1
  646. package/build/serde/temporal.d.mts.map +1 -0
  647. package/build/{temporal.js → serde/temporal.js} +1 -1
  648. package/build/serde/temporal.js.map +1 -0
  649. package/build/{temporalMappers.cjs → serde/temporalMappers.cjs} +4 -5
  650. package/build/serde/temporalMappers.cjs.map +1 -0
  651. package/build/{temporalMappers.d.cts → serde/temporalMappers.d.cts} +1 -1
  652. package/build/serde/temporalMappers.d.cts.map +1 -0
  653. package/build/{temporalMappers.d.mts → serde/temporalMappers.d.mts} +1 -1
  654. package/build/serde/temporalMappers.d.mts.map +1 -0
  655. package/build/{temporalMappers.js → serde/temporalMappers.js} +2 -3
  656. package/build/serde/temporalMappers.js.map +1 -0
  657. package/build/upsert.cjs +1 -1
  658. package/build/upsert.cjs.map +1 -1
  659. package/build/upsert.d.cts.map +1 -1
  660. package/build/upsert.d.mts.map +1 -1
  661. package/build/upsert.js +1 -1
  662. package/build/upsert.js.map +1 -1
  663. package/build/utils.cjs +0 -1
  664. package/build/utils.cjs.map +1 -1
  665. package/build/utils.d.cts +1 -1
  666. package/build/utils.d.mts +1 -1
  667. package/build/utils.js +0 -1
  668. package/build/utils.js.map +1 -1
  669. package/package.json +2 -2
  670. package/build/FlushLock.cjs.map +0 -1
  671. package/build/FlushLock.d.cts.map +0 -1
  672. package/build/FlushLock.d.mts.map +0 -1
  673. package/build/FlushLock.js.map +0 -1
  674. package/build/HintTree.cjs.map +0 -1
  675. package/build/HintTree.d.cts.map +0 -1
  676. package/build/HintTree.d.mts.map +0 -1
  677. package/build/HintTree.js.map +0 -1
  678. package/build/IsLoadedCache.d.cts.map +0 -1
  679. package/build/IsLoadedCache.d.mts.map +0 -1
  680. package/build/IsLoadedCache.js.map +0 -1
  681. package/build/JoinRows.cjs.map +0 -1
  682. package/build/JoinRows.d.cts.map +0 -1
  683. package/build/JoinRows.d.mts.map +0 -1
  684. package/build/JoinRows.js.map +0 -1
  685. package/build/PendingChanges.d.cts.map +0 -1
  686. package/build/PendingChanges.d.mts.map +0 -1
  687. package/build/PendingChanges.js +0 -2
  688. package/build/ReactionsManager.cjs.map +0 -1
  689. package/build/ReactionsManager.d.cts.map +0 -1
  690. package/build/ReactionsManager.d.mts.map +0 -1
  691. package/build/ReactionsManager.js.map +0 -1
  692. package/build/Todo.cjs.map +0 -1
  693. package/build/Todo.d.cts.map +0 -1
  694. package/build/Todo.d.mts.map +0 -1
  695. package/build/Todo.js.map +0 -1
  696. package/build/TypeInfo.cjs.map +0 -1
  697. package/build/TypeInfo.d.cts.map +0 -1
  698. package/build/TypeInfo.d.mts.map +0 -1
  699. package/build/TypeInfo.js.map +0 -1
  700. package/build/columns.cjs.map +0 -1
  701. package/build/columns.d.cts.map +0 -1
  702. package/build/columns.d.mts.map +0 -1
  703. package/build/columns.js.map +0 -1
  704. package/build/driverApi.cjs +0 -18
  705. package/build/driverApi.cjs.map +0 -1
  706. package/build/driverApi.d.cts +0 -22
  707. package/build/driverApi.d.cts.map +0 -1
  708. package/build/driverApi.d.mts +0 -22
  709. package/build/driverApi.d.mts.map +0 -1
  710. package/build/driverApi.js +0 -18
  711. package/build/driverApi.js.map +0 -1
  712. package/build/fieldSerde.cjs.map +0 -1
  713. package/build/fieldSerde.d.cts.map +0 -1
  714. package/build/fieldSerde.d.mts.map +0 -1
  715. package/build/fieldSerde.js.map +0 -1
  716. package/build/loadHints.cjs.map +0 -1
  717. package/build/loadHints.d.cts.map +0 -1
  718. package/build/loadHints.d.mts.map +0 -1
  719. package/build/loadHints.js.map +0 -1
  720. package/build/loadLens.cjs.map +0 -1
  721. package/build/loadLens.d.cts.map +0 -1
  722. package/build/loadLens.d.mts.map +0 -1
  723. package/build/loadLens.js.map +0 -1
  724. package/build/reactiveHints.cjs.map +0 -1
  725. package/build/reactiveHints.d.cts.map +0 -1
  726. package/build/reactiveHints.d.mts.map +0 -1
  727. package/build/reactiveHints.js.map +0 -1
  728. package/build/serde.cjs.map +0 -1
  729. package/build/serde.d.cts.map +0 -1
  730. package/build/serde.d.mts.map +0 -1
  731. package/build/serde.js.map +0 -1
  732. package/build/temporal.cjs.map +0 -1
  733. package/build/temporal.d.cts.map +0 -1
  734. package/build/temporal.d.mts.map +0 -1
  735. package/build/temporal.js.map +0 -1
  736. package/build/temporalMappers.cjs.map +0 -1
  737. package/build/temporalMappers.d.cts.map +0 -1
  738. package/build/temporalMappers.d.mts.map +0 -1
  739. package/build/temporalMappers.js.map +0 -1
  740. package/build/unnest.cjs.map +0 -1
  741. package/build/unnest.d.cts.map +0 -1
  742. package/build/unnest.d.mts.map +0 -1
  743. package/build/unnest.js.map +0 -1
  744. package/build/withLoaded.cjs.map +0 -1
  745. package/build/withLoaded.d.cts.map +0 -1
  746. package/build/withLoaded.d.mts.map +0 -1
  747. package/build/withLoaded.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fastWhereFilterHash.cjs","names":["maybeRequireTemporal","isAlias","isEntity","isReference","zonedDateTimeMapper","plainDateTimeMapper","plainDateMapper","plainTimeMapper"],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isEntity } from \"../Entity.ts\";\nimport { isAlias } from \"../queries/find/Aliases.ts\";\nimport { isReference } from \"../relations/index.ts\";\nimport { maybeRequireTemporal } from \"../temporal.ts\";\nimport { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from \"../temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fastWhereFilterHash.cjs","names":["maybeRequireTemporal","isAlias","isEntity","isReference","zonedDateTimeMapper","plainDateTimeMapper","plainDateMapper","plainTimeMapper"],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isEntity } from \"src/Entity.ts\";\nimport { isAlias } from \"src/queries/find/Aliases.ts\";\nimport { isReference } from \"src/relations/index.ts\";\nimport { maybeRequireTemporal } from \"src/serde/temporal.ts\";\nimport {\n plainDateMapper,\n plainDateTimeMapper,\n plainTimeMapper,\n zonedDateTimeMapper,\n} from \"src/serde/temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":";;;;;;;;AAWA,MAAM,WAAWA,uBAAAA,qBAAqB,CAAC,EAAE;;;;;;;;;;;;;;AAezC,SAAgB,oBAAoB,OAAoC;CACtE,OAAO,kBAAkB,IAAI,uBAAO,IAAI,QAAgB,CAAC;AAC3D;;AAGA,SAAS,kBAAkB,KAAa,OAAgB,MAA2C;CACjG,IAAI,UAAU,KAAA,GAAW,OAAO,GAAG,IAAI;CACvC,IAAI,UAAU,MAAM,OAAO,GAAG,IAAI;CAClC,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,GAAG,IAAI,GAAG,MAAM,OAAO,GAAG,MAAM;EACzC,KAAK,UACH,OAAO,GAAG,IAAI,GAAG,MAAM;EACzB,KAAK,WACH,OAAO,GAAG,IAAI,GAAG,QAAQ,IAAI,EAAE;EACjC,KAAK,UACH,OAAO,GAAG,IAAI,GAAG,MAAM,SAAS,EAAE;EACpC,KAAK,UACH,OAAO,mBAAmB,KAAK,OAAO,IAAI;EAC5C,KAAK,YACH,OAAOC,6BAAAA,QAAQ,KAAK,IAAI,GAAG,IAAI,WAAW,KAAA;EAC5C,SACE;CACJ;AACF;;AAGA,SAAS,mBAAmB,KAAa,OAAe,MAA2C;CACjG,IAAI,iBAAiB,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,YAAY,CAAC,CAAC,OAAO,GAAG,MAAM,YAAY,EAAE;CAC9F,IAAI,YAAY,OAAO,KAAK,GAAG,OAAO,sBAAsB,KAAK,KAAK;CAEtE,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO,KAAA;EAC5B,KAAK,IAAI,KAAK;EACd,MAAM,GAAG,IAAI,GAAG,MAAM,OAAO;EAC7B,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,UAAU,kBAAkB,KAAK,MAAM,IAAI;GACjD,IAAI,YAAY,KAAA,GAAW;IACzB,KAAK,OAAO,KAAK;IACjB;GACF;GACA,MAAM;EACR;EACA,KAAK,OAAO,KAAK;EACjB,OAAO,GAAG,IAAI;CAChB;CAEA,IAAI,cAAc,KAAK,GAAG;EACxB,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO,KAAA;EAC5B,KAAK,IAAI,KAAK;EAEd,MAAM,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK;EACrC,MAAM,GAAG,IAAI,GAAG,KAAK,OAAO;EAC5B,KAAK,MAAM,YAAY,MAAM;GAC3B,MAAM,GAAG,MAAM,SAAS,OAAO,GAAG,SAAS;GAC3C,MAAM,UAAU,kBAAkB,KAAM,MAAkC,WAAW,IAAI;GACzF,IAAI,YAAY,KAAA,GAAW;IACzB,KAAK,OAAO,KAAK;IACjB;GACF;GACA,MAAM;EACR;EACA,KAAK,OAAO,KAAK;EACjB,OAAO,GAAG,IAAI;CAChB;CAEA,IAAIC,eAAAA,SAAS,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,SAAS,CAAC,CAAC,OAAO,GAAG,MAAM,SAAS,EAAE;CAClF,MAAM,eAAe,qBAAqB,KAAK,KAAK;CACpD,IAAI,iBAAiB,KAAA,GAAW,OAAO;CACvC,MAAM,gBAAgB,kBAAkB,KAAK;CAC7C,IAAI,kBAAkB,KAAA,GAAW,OAAO,oBAAoB,KAAK,aAAa;CAC9E,MAAM,iBAAiB,kBAAkB,KAAK,OAAO,IAAI;CACzD,IAAI,mBAAmB,KAAA,GAAW,OAAO;AAE3C;;AAGA,SAAS,sBAAsB,KAAa,OAAgC;CAC1E,MAAM,QAAQ,OAAO,KAAK,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU,CAAC,CAAC,SAAS,QAAQ;CAC7F,OAAO,GAAG,IAAI,GAAG,MAAM,YAAY,KAAK,OAAO,GAAG,MAAM,YAAY,KAAK,GAAG,MAAM,OAAO,GAAG,MAAM;AACpG;;AAGA,SAAS,qBAAqB,KAAa,OAAmC;CAC5E,IAAI,CAACC,4BAAAA,YAAY,KAAK,GAAG,OAAO,KAAA;CAChC,MAAM,KAAK,MAAM;CACjB,OAAO,OAAO,KAAA,IAAY,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,GAAG,OAAO,GAAG,GAAG;AACnE;;AAGA,SAAS,kBAAkB,KAAa,OAAe,MAA2C;CAChG,IAAI,CAAC,cAAc,KAAK,GAAG,OAAO,KAAA;CAClC,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO,KAAA;CAC5B,KAAK,IAAI,KAAK;CAEd,MAAM,kBAAkB,MAAM,YAAY;CAC1C,MAAM,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK;CACrC,MAAM,GAAG,IAAI,GAAG,gBAAgB,OAAO,GAAG,gBAAgB,GAAG,KAAK,OAAO;CACzE,KAAK,MAAM,YAAY,MAAM;EAC3B,MAAM,GAAG,MAAM,SAAS,OAAO,GAAG,SAAS;EAC3C,MAAM,UAAU,kBAAkB,KAAM,MAAkC,WAAW,IAAI;EACzF,IAAI,YAAY,KAAA,GAAW;GACzB,KAAK,OAAO,KAAK;GACjB;EACF;EACA,MAAM;CACR;CACA,KAAK,OAAO,KAAK;CACjB,OAAO,GAAG,IAAI;AAChB;;AAGA,SAAS,oBAAoB,KAAa,OAAuB;CAC/D,OAAO,GAAG,IAAI,GAAG,MAAM,OAAO,GAAG,MAAM;AACzC;;AAGA,SAAS,kBAAkB,OAAmC;CAC5D,IAAI,CAAC,UAAU,OAAO,KAAA;CACtB,IAAI,iBAAiB,SAAS,eAAe,OAAOC,8BAAAA,oBAAoB,KAAK,KAAK;CAClF,IAAI,iBAAiB,SAAS,eAAe,OAAOC,8BAAAA,oBAAoB,KAAK,KAAK;CAClF,IAAI,iBAAiB,SAAS,WAAW,OAAOC,8BAAAA,gBAAgB,KAAK,KAAK;CAC1E,IAAI,iBAAiB,SAAS,WAAW,OAAOC,8BAAAA,gBAAgB,KAAK,KAAK;AAE5E;;AAGA,SAAS,cAAc,OAAwB;CAC7C,MAAM,YAAY,OAAO,eAAe,KAAK;CAC7C,OAAO,cAAc,OAAO,aAAa,cAAc;AACzD;;AAGA,SAAS,cAAc,OAAwB;CAC7C,MAAM,YAAY,OAAO,eAAe,KAAK;CAC7C,OAAO,cAAc,OAAO,aAAa,cAAc,QAAQ,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS;AAC7F"}
@@ -1 +1 @@
1
- {"version":3,"file":"fastWhereFilterHash.d.cts","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"mappings":";;;;;;;;;;;;;;iBAqBgB,oBAAoB"}
1
+ {"version":3,"file":"fastWhereFilterHash.d.cts","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"mappings":";;;;;;;;;;;;;;iBA0BgB,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"file":"fastWhereFilterHash.d.mts","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"mappings":";;;;;;;;;;;;;;iBAqBgB,oBAAoB"}
1
+ {"version":3,"file":"fastWhereFilterHash.d.mts","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"mappings":";;;;;;;;;;;;;;iBA0BgB,oBAAoB"}
@@ -1,8 +1,8 @@
1
- import { maybeRequireTemporal } from "../temporal.js";
2
- import { isAlias } from "../queries/find/Aliases.js";
1
+ import { maybeRequireTemporal } from "../serde/temporal.js";
3
2
  import { isReference } from "../relations/Reference.js";
3
+ import { isAlias } from "../queries/find/Aliases.js";
4
4
  import "../relations/index.js";
5
- import { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from "../temporalMappers.js";
5
+ import { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from "../serde/temporalMappers.js";
6
6
  import { isEntity } from "../Entity.js";
7
7
  //#region src/dataloaders/fastWhereFilterHash.ts
8
8
  const Temporal = maybeRequireTemporal()?.Temporal;
@@ -1 +1 @@
1
- {"version":3,"file":"fastWhereFilterHash.js","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isEntity } from \"../Entity.ts\";\nimport { isAlias } from \"../queries/find/Aliases.ts\";\nimport { isReference } from \"../relations/index.ts\";\nimport { maybeRequireTemporal } from \"../temporal.ts\";\nimport { plainDateMapper, plainDateTimeMapper, plainTimeMapper, zonedDateTimeMapper } from \"../temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fastWhereFilterHash.js","names":[],"sources":["../../src/dataloaders/fastWhereFilterHash.ts"],"sourcesContent":["import { isEntity } from \"src/Entity.ts\";\nimport { isAlias } from \"src/queries/find/Aliases.ts\";\nimport { isReference } from \"src/relations/index.ts\";\nimport { maybeRequireTemporal } from \"src/serde/temporal.ts\";\nimport {\n plainDateMapper,\n plainDateTimeMapper,\n plainTimeMapper,\n zonedDateTimeMapper,\n} from \"src/serde/temporalMappers.ts\";\n\nconst Temporal = maybeRequireTemporal()?.Temporal;\n\n/**\n * Returns a fast stable key for find filters.\n *\n * This avoids `object-hash` for simple find filters; the phase 8 query-prep benchmark saw 1,000-query p50s drop\n * from ~22-26ms to ~7.6-10.9ms, with heap allocation dropping from ~24-30MB to ~10-16MB.\n *\n * We also benchmarked native/WASM non-cryptographic hash libraries, but they only hash bytes; they still need this\n * deterministic serialization first. For 1,000 filter keys, this helper alone had p50s of 0.337/0.353/0.410ms vs.\n * object-hash md5 at 7.467/7.436/7.620ms, and wrapping this key with native hashes was slower: farmhash\n * fingerprint64 at 0.517/0.524/0.538ms, @node-rs/xxhash xxh3-128 at 0.611/0.613/0.627ms, and xxhash-addon\n * XXH128 at 1.031/1.078/1.348ms. So the stable serialization is the necessary work, and keeping it as the cache\n * key avoids extra native-call/digest overhead and avoids introducing probabilistic hash collisions.\n */\nexport function fastWhereFilterHash(value: unknown): string | undefined {\n return appendStableValue(\"\", value, new WeakSet<object>());\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableValue(key: string, value: unknown, seen: WeakSet<object>): string | undefined {\n if (value === undefined) return `${key}u;`;\n if (value === null) return `${key}n;`;\n switch (typeof value) {\n case \"string\":\n return `${key}s${value.length}:${value};`;\n case \"number\":\n return `${key}d${value};`;\n case \"boolean\":\n return `${key}b${value ? 1 : 0};`;\n case \"bigint\":\n return `${key}i${value.toString()};`;\n case \"object\":\n return appendStableObject(key, value, seen);\n case \"function\":\n return isAlias(value) ? `${key}xalias;` : undefined;\n default:\n return undefined;\n }\n}\n\n/** Appends a deterministic, type-tagged representation of `value` to `key`. */\nfunction appendStableObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (value instanceof Date) return `${key}t${value.toISOString().length}:${value.toISOString()};`;\n if (ArrayBuffer.isView(value)) return appendArrayBufferView(key, value);\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n key = `${key}a${value.length}[`;\n for (const item of value) {\n const nextKey = appendStableValue(key, item, seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}]`;\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const keys = Object.keys(value).sort();\n key = `${key}o${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n }\n\n if (isEntity(value)) return `${key}e${value.toString().length}:${value.toString()};`;\n const referenceKey = appendReferenceValue(key, value);\n if (referenceKey !== undefined) return referenceKey;\n const temporalValue = toTemporalDbValue(value);\n if (temporalValue !== undefined) return appendTemporalValue(key, temporalValue);\n const valueObjectKey = appendValueObject(key, value, seen);\n if (valueObjectKey !== undefined) return valueObjectKey;\n return undefined;\n}\n\n/** Appends an ArrayBuffer view by its exact byte contents. */\nfunction appendArrayBufferView(key: string, value: ArrayBufferView): string {\n const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n return `${key}y${value.constructor.name.length}:${value.constructor.name}:${bytes.length}:${bytes};`;\n}\n\n/** Appends a Joist reference by its tagged id. */\nfunction appendReferenceValue(key: string, value: object): string | undefined {\n if (!isReference(value)) return undefined;\n const id = value.idTaggedMaybe;\n return id === undefined ? `${key}r;` : `${key}r${id.length}:${id};`;\n}\n\n/** Appends a custom value object by constructor name and enumerable properties. */\nfunction appendValueObject(key: string, value: object, seen: WeakSet<object>): string | undefined {\n if (!isValueObject(value)) return undefined;\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const constructorName = value.constructor.name;\n const keys = Object.keys(value).sort();\n key = `${key}c${constructorName.length}:${constructorName}:${keys.length}{`;\n for (const property of keys) {\n key = `${key}${property.length}:${property}=`;\n const nextKey = appendStableValue(key, (value as Record<string, unknown>)[property], seen);\n if (nextKey === undefined) {\n seen.delete(value);\n return undefined;\n }\n key = nextKey;\n }\n seen.delete(value);\n return `${key}}`;\n}\n\n/** Appends a Temporal value as a distinct scalar type. */\nfunction appendTemporalValue(key: string, value: string): string {\n return `${key}t${value.length}:${value};`;\n}\n\n/** Returns the db representation for Temporal values, or undefined for non-Temporal values. */\nfunction toTemporalDbValue(value: object): string | undefined {\n if (!Temporal) return undefined;\n if (value instanceof Temporal.ZonedDateTime) return zonedDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDateTime) return plainDateTimeMapper.toDb(value);\n if (value instanceof Temporal.PlainDate) return plainDateMapper.toDb(value);\n if (value instanceof Temporal.PlainTime) return plainTimeMapper.toDb(value);\n return undefined;\n}\n\n/** Returns true for plain object literals used by find filters/settings. */\nfunction isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/** Returns true for custom value objects that can be represented by enumerable fields. */\nfunction isValueObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype !== Object.prototype && prototype !== null && Object.keys(value).length > 0;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"findByUniqueDataLoader.cjs","names":["getMetadata","abbreviation","groupBy"],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\n\nimport type { Column } from \"../columns.ts\";\nimport type { Entity } from \"../Entity.ts\";\nimport type { EntityManager, MaybeAbstractEntityConstructor } from \"../EntityManager.ts\";\nimport { type Field, getMetadata } from \"../EntityMetadata.ts\";\nimport { maybeAddNotSoftDeleted } from \"../queries/entityQueryUtils.ts\";\nimport { type ParsedFindQuery, addTablePerClassJoinsAndClassTag } from \"../queries/find/QueryParser.ts\";\nimport type { ColumnCondition } from \"../queries/parsedConditions.ts\";\nimport { abbreviation, groupBy } from \"../utils.ts\";\n\nexport const findByUniqueOperation = \"find-by-unique\";\n\nexport function findByUniqueDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n field: Field,\n softDeletes: \"include\" | \"exclude\",\n): DataLoader<any, unknown | undefined> {\n const batchKey = `${type.name}-${field.fieldName}-${softDeletes}`;\n return em.getLoader(findByUniqueOperation, batchKey, async (values) => {\n const meta = getMetadata(type);\n const alias = abbreviation(meta.tableName);\n\n const conditions: ColumnCondition[] = [];\n const query: ParsedFindQuery = {\n selects: [`${alias}.*`],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: { kind: \"exp\", op: \"and\", conditions },\n orderBys: [],\n };\n\n addTablePerClassJoinsAndClassTag(query, meta, alias, true);\n maybeAddNotSoftDeleted(conditions, meta, alias, softDeletes);\n\n let column: Column;\n switch (field.kind) {\n case \"primitive\":\n column = field.serde.columns[0];\n conditions.push({\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"in\", value: values.map((v) => column.mapToDb(v)) },\n });\n break;\n default:\n throw new Error(`Unsupported field ${field.fieldName}`);\n }\n\n const rows = await em[\"executeFind\"](meta, findByUniqueOperation, query, {});\n\n const rowsByValue = groupBy(rows, (row) => row[column.columnName]);\n\n // Re-order the output by the batched input\n return values.map((value) => {\n const result = rowsByValue.get(value) ?? [];\n return result[0];\n });\n });\n}\n"],"mappings":";;;;;;AAWA,MAAa,wBAAwB;AAErC,SAAgB,uBACd,IACA,MACA,OACA,aACsC;CACtC,MAAM,WAAW,GAAG,KAAK,KAAK,GAAG,MAAM,UAAU,GAAG;CACpD,OAAO,GAAG,UAAU,uBAAuB,UAAU,OAAO,WAAW;EACrE,MAAM,OAAOA,uBAAAA,YAAY,IAAI;EAC7B,MAAM,QAAQC,cAAAA,aAAa,KAAK,SAAS;EAEzC,MAAM,aAAgC,CAAC;EACvC,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAG,MAAM,GAAG;GACtB,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IAAE,MAAM;IAAO,IAAI;IAAO;GAAW;GAChD,UAAU,CAAC;EACb;EAEA,iCAAA,iCAAiC,OAAO,MAAM,OAAO,IAAI;EACzD,iCAAA,uBAAuB,YAAY,MAAM,OAAO,WAAW;EAE3D,IAAI;EACJ,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,SAAS,MAAM,MAAM,QAAQ;IAC7B,WAAW,KAAK;KACd,MAAM;KACN;KACA,QAAQ,OAAO;KACf,QAAQ,OAAO;KACf,MAAM;MAAE,MAAM;MAAM,OAAO,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;KAAE;IAClE,CAAC;IACD;GACF,SACE,MAAM,IAAI,MAAM,qBAAqB,MAAM,WAAW;EAC1D;EAEA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,uBAAuB,OAAO,CAAC,CAAC;EAE3E,MAAM,cAAcC,cAAAA,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW;EAGjE,OAAO,OAAO,KAAK,UAAU;GAE3B,QADe,YAAY,IAAI,KAAK,KAAK,CAAC,EAAA,CAC5B;EAChB,CAAC;CACH,CAAC;AACH"}
1
+ {"version":3,"file":"findByUniqueDataLoader.cjs","names":["getMetadata","abbreviation","groupBy"],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\nimport type { Entity } from \"src/Entity.ts\";\nimport type { EntityManager, MaybeAbstractEntityConstructor } from \"src/EntityManager.ts\";\nimport { type Field, getMetadata } from \"src/EntityMetadata.ts\";\nimport { maybeAddNotSoftDeleted } from \"src/queries/entityQueryUtils.ts\";\nimport { type ParsedFindQuery, addTablePerClassJoinsAndClassTag } from \"src/queries/find/QueryParser.ts\";\nimport type { ColumnCondition } from \"src/queries/parsedConditions.ts\";\nimport type { Column } from \"src/serde/columns.ts\";\nimport { abbreviation, groupBy } from \"src/utils.ts\";\n\nexport const findByUniqueOperation = \"find-by-unique\";\n\nexport function findByUniqueDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n field: Field,\n softDeletes: \"include\" | \"exclude\",\n): DataLoader<any, unknown | undefined> {\n const batchKey = `${type.name}-${field.fieldName}-${softDeletes}`;\n return em.getLoader(findByUniqueOperation, batchKey, async (values) => {\n const meta = getMetadata(type);\n const alias = abbreviation(meta.tableName);\n\n const conditions: ColumnCondition[] = [];\n const query: ParsedFindQuery = {\n selects: [`${alias}.*`],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: { kind: \"exp\", op: \"and\", conditions },\n orderBys: [],\n };\n\n addTablePerClassJoinsAndClassTag(query, meta, alias, true);\n maybeAddNotSoftDeleted(conditions, meta, alias, softDeletes);\n\n let column: Column;\n switch (field.kind) {\n case \"primitive\":\n column = field.serde.columns[0];\n conditions.push({\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"in\", value: values.map((v) => column.mapToDb(v)) },\n });\n break;\n default:\n throw new Error(`Unsupported field ${field.fieldName}`);\n }\n\n const rows = await em[\"executeFind\"](meta, findByUniqueOperation, query, {});\n\n const rowsByValue = groupBy(rows, (row) => row[column.columnName]);\n\n // Re-order the output by the batched input\n return values.map((value) => {\n const result = rowsByValue.get(value) ?? [];\n return result[0];\n });\n });\n}\n"],"mappings":";;;;;;AAUA,MAAa,wBAAwB;AAErC,SAAgB,uBACd,IACA,MACA,OACA,aACsC;CACtC,MAAM,WAAW,GAAG,KAAK,KAAK,GAAG,MAAM,UAAU,GAAG;CACpD,OAAO,GAAG,UAAU,uBAAuB,UAAU,OAAO,WAAW;EACrE,MAAM,OAAOA,uBAAAA,YAAY,IAAI;EAC7B,MAAM,QAAQC,cAAAA,aAAa,KAAK,SAAS;EAEzC,MAAM,aAAgC,CAAC;EACvC,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAG,MAAM,GAAG;GACtB,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IAAE,MAAM;IAAO,IAAI;IAAO;GAAW;GAChD,UAAU,CAAC;EACb;EAEA,iCAAA,iCAAiC,OAAO,MAAM,OAAO,IAAI;EACzD,iCAAA,uBAAuB,YAAY,MAAM,OAAO,WAAW;EAE3D,IAAI;EACJ,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,SAAS,MAAM,MAAM,QAAQ;IAC7B,WAAW,KAAK;KACd,MAAM;KACN;KACA,QAAQ,OAAO;KACf,QAAQ,OAAO;KACf,MAAM;MAAE,MAAM;MAAM,OAAO,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;KAAE;IAClE,CAAC;IACD;GACF,SACE,MAAM,IAAI,MAAM,qBAAqB,MAAM,WAAW;EAC1D;EAEA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,uBAAuB,OAAO,CAAC,CAAC;EAE3E,MAAM,cAAcC,cAAAA,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW;EAGjE,OAAO,OAAO,KAAK,UAAU;GAE3B,QADe,YAAY,IAAI,KAAK,KAAK,CAAC,EAAA,CAC5B;EAChB,CAAC;CACH,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"findByUniqueDataLoader.d.cts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;cAWa;iBAEG,uBAAuB,UAAU,QAC/C,IAAI,eACJ,MAAM,+BAA+B,IACrC,OAAO,OACP,qCACC"}
1
+ {"version":3,"file":"findByUniqueDataLoader.d.cts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;cAUa;iBAEG,uBAAuB,UAAU,QAC/C,IAAI,eACJ,MAAM,+BAA+B,IACrC,OAAO,OACP,qCACC"}
@@ -1 +1 @@
1
- {"version":3,"file":"findByUniqueDataLoader.d.mts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;cAWa;iBAEG,uBAAuB,UAAU,QAC/C,IAAI,eACJ,MAAM,+BAA+B,IACrC,OAAO,OACP,qCACC"}
1
+ {"version":3,"file":"findByUniqueDataLoader.d.mts","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"mappings":";;;;;cAUa;iBAEG,uBAAuB,UAAU,QAC/C,IAAI,eACJ,MAAM,+BAA+B,IACrC,OAAO,OACP,qCACC"}
@@ -1 +1 @@
1
- {"version":3,"file":"findByUniqueDataLoader.js","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\n\nimport type { Column } from \"../columns.ts\";\nimport type { Entity } from \"../Entity.ts\";\nimport type { EntityManager, MaybeAbstractEntityConstructor } from \"../EntityManager.ts\";\nimport { type Field, getMetadata } from \"../EntityMetadata.ts\";\nimport { maybeAddNotSoftDeleted } from \"../queries/entityQueryUtils.ts\";\nimport { type ParsedFindQuery, addTablePerClassJoinsAndClassTag } from \"../queries/find/QueryParser.ts\";\nimport type { ColumnCondition } from \"../queries/parsedConditions.ts\";\nimport { abbreviation, groupBy } from \"../utils.ts\";\n\nexport const findByUniqueOperation = \"find-by-unique\";\n\nexport function findByUniqueDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n field: Field,\n softDeletes: \"include\" | \"exclude\",\n): DataLoader<any, unknown | undefined> {\n const batchKey = `${type.name}-${field.fieldName}-${softDeletes}`;\n return em.getLoader(findByUniqueOperation, batchKey, async (values) => {\n const meta = getMetadata(type);\n const alias = abbreviation(meta.tableName);\n\n const conditions: ColumnCondition[] = [];\n const query: ParsedFindQuery = {\n selects: [`${alias}.*`],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: { kind: \"exp\", op: \"and\", conditions },\n orderBys: [],\n };\n\n addTablePerClassJoinsAndClassTag(query, meta, alias, true);\n maybeAddNotSoftDeleted(conditions, meta, alias, softDeletes);\n\n let column: Column;\n switch (field.kind) {\n case \"primitive\":\n column = field.serde.columns[0];\n conditions.push({\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"in\", value: values.map((v) => column.mapToDb(v)) },\n });\n break;\n default:\n throw new Error(`Unsupported field ${field.fieldName}`);\n }\n\n const rows = await em[\"executeFind\"](meta, findByUniqueOperation, query, {});\n\n const rowsByValue = groupBy(rows, (row) => row[column.columnName]);\n\n // Re-order the output by the batched input\n return values.map((value) => {\n const result = rowsByValue.get(value) ?? [];\n return result[0];\n });\n });\n}\n"],"mappings":";;;;;AAWA,MAAa,wBAAwB;AAErC,SAAgB,uBACd,IACA,MACA,OACA,aACsC;CACtC,MAAM,WAAW,GAAG,KAAK,KAAK,GAAG,MAAM,UAAU,GAAG;CACpD,OAAO,GAAG,UAAU,uBAAuB,UAAU,OAAO,WAAW;EACrE,MAAM,OAAO,YAAY,IAAI;EAC7B,MAAM,QAAQ,aAAa,KAAK,SAAS;EAEzC,MAAM,aAAgC,CAAC;EACvC,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAG,MAAM,GAAG;GACtB,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IAAE,MAAM;IAAO,IAAI;IAAO;GAAW;GAChD,UAAU,CAAC;EACb;EAEA,iCAAiC,OAAO,MAAM,OAAO,IAAI;EACzD,uBAAuB,YAAY,MAAM,OAAO,WAAW;EAE3D,IAAI;EACJ,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,SAAS,MAAM,MAAM,QAAQ;IAC7B,WAAW,KAAK;KACd,MAAM;KACN;KACA,QAAQ,OAAO;KACf,QAAQ,OAAO;KACf,MAAM;MAAE,MAAM;MAAM,OAAO,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;KAAE;IAClE,CAAC;IACD;GACF,SACE,MAAM,IAAI,MAAM,qBAAqB,MAAM,WAAW;EAC1D;EAEA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,uBAAuB,OAAO,CAAC,CAAC;EAE3E,MAAM,cAAc,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW;EAGjE,OAAO,OAAO,KAAK,UAAU;GAE3B,QADe,YAAY,IAAI,KAAK,KAAK,CAAC,EAAA,CAC5B;EAChB,CAAC;CACH,CAAC;AACH"}
1
+ {"version":3,"file":"findByUniqueDataLoader.js","names":[],"sources":["../../src/dataloaders/findByUniqueDataLoader.ts"],"sourcesContent":["import type DataLoader from \"dataloader\";\nimport type { Entity } from \"src/Entity.ts\";\nimport type { EntityManager, MaybeAbstractEntityConstructor } from \"src/EntityManager.ts\";\nimport { type Field, getMetadata } from \"src/EntityMetadata.ts\";\nimport { maybeAddNotSoftDeleted } from \"src/queries/entityQueryUtils.ts\";\nimport { type ParsedFindQuery, addTablePerClassJoinsAndClassTag } from \"src/queries/find/QueryParser.ts\";\nimport type { ColumnCondition } from \"src/queries/parsedConditions.ts\";\nimport type { Column } from \"src/serde/columns.ts\";\nimport { abbreviation, groupBy } from \"src/utils.ts\";\n\nexport const findByUniqueOperation = \"find-by-unique\";\n\nexport function findByUniqueDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n field: Field,\n softDeletes: \"include\" | \"exclude\",\n): DataLoader<any, unknown | undefined> {\n const batchKey = `${type.name}-${field.fieldName}-${softDeletes}`;\n return em.getLoader(findByUniqueOperation, batchKey, async (values) => {\n const meta = getMetadata(type);\n const alias = abbreviation(meta.tableName);\n\n const conditions: ColumnCondition[] = [];\n const query: ParsedFindQuery = {\n selects: [`${alias}.*`],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: { kind: \"exp\", op: \"and\", conditions },\n orderBys: [],\n };\n\n addTablePerClassJoinsAndClassTag(query, meta, alias, true);\n maybeAddNotSoftDeleted(conditions, meta, alias, softDeletes);\n\n let column: Column;\n switch (field.kind) {\n case \"primitive\":\n column = field.serde.columns[0];\n conditions.push({\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"in\", value: values.map((v) => column.mapToDb(v)) },\n });\n break;\n default:\n throw new Error(`Unsupported field ${field.fieldName}`);\n }\n\n const rows = await em[\"executeFind\"](meta, findByUniqueOperation, query, {});\n\n const rowsByValue = groupBy(rows, (row) => row[column.columnName]);\n\n // Re-order the output by the batched input\n return values.map((value) => {\n const result = rowsByValue.get(value) ?? [];\n return result[0];\n });\n });\n}\n"],"mappings":";;;;;AAUA,MAAa,wBAAwB;AAErC,SAAgB,uBACd,IACA,MACA,OACA,aACsC;CACtC,MAAM,WAAW,GAAG,KAAK,KAAK,GAAG,MAAM,UAAU,GAAG;CACpD,OAAO,GAAG,UAAU,uBAAuB,UAAU,OAAO,WAAW;EACrE,MAAM,OAAO,YAAY,IAAI;EAC7B,MAAM,QAAQ,aAAa,KAAK,SAAS;EAEzC,MAAM,aAAgC,CAAC;EACvC,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAG,MAAM,GAAG;GACtB,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IAAE,MAAM;IAAO,IAAI;IAAO;GAAW;GAChD,UAAU,CAAC;EACb;EAEA,iCAAiC,OAAO,MAAM,OAAO,IAAI;EACzD,uBAAuB,YAAY,MAAM,OAAO,WAAW;EAE3D,IAAI;EACJ,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,SAAS,MAAM,MAAM,QAAQ;IAC7B,WAAW,KAAK;KACd,MAAM;KACN;KACA,QAAQ,OAAO;KACf,QAAQ,OAAO;KACf,MAAM;MAAE,MAAM;MAAM,OAAO,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;KAAE;IAClE,CAAC;IACD;GACF,SACE,MAAM,IAAI,MAAM,qBAAqB,MAAM,WAAW;EAC1D;EAEA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,uBAAuB,OAAO,CAAC,CAAC;EAE3E,MAAM,cAAc,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW;EAGjE,OAAO,OAAO,KAAK,UAAU;GAE3B,QADe,YAAY,IAAI,KAAK,KAAK,CAAC,EAAA,CAC5B;EAChB,CAAC;CACH,CAAC;AACH"}
@@ -4,7 +4,7 @@ const require_queries_find_scopes = require("../queries/find/scopes.cjs");
4
4
  const require_queries_find_QueryParser = require("../queries/find/QueryParser.cjs");
5
5
  const require_utils = require("../utils.cjs");
6
6
  const require_EntityMetadata = require("../EntityMetadata.cjs");
7
- const require_unnest = require("../unnest.cjs");
7
+ const require_queries_unnest = require("../queries/unnest.cjs");
8
8
  const require_dataloaders_findDataLoader = require("./findDataLoader.cjs");
9
9
  const require_EntityManager = require("../EntityManager.cjs");
10
10
  //#region src/dataloaders/findCountDataLoader.ts
@@ -60,7 +60,7 @@ function findCountDataLoader(em, type, filter) {
60
60
  alias: "_data",
61
61
  fromAlias: "_f"
62
62
  }],
63
- ctes: [require_unnest.buildUnnestCte("_find", argsColumns, require_dataloaders_findDataLoader.createColumnValuesFromPrepared(args, entries))],
63
+ ctes: [require_queries_unnest.buildUnnestCte("_find", argsColumns, require_dataloaders_findDataLoader.createColumnValuesFromPrepared(args, entries))],
64
64
  orderBys: []
65
65
  };
66
66
  const rows = await em["executePreparedFind"](meta, findCountOperation, query2, findSettings, false);
@@ -1 +1 @@
1
- {"version":3,"file":"findCountDataLoader.cjs","names":["getMetadata","parseFindQuery","getBatchKeyFromGenericStructure","fail","kq","collectAndReplaceArgs","buildUnnestCte","createColumnValuesFromPrepared","queryFilterHash","isScope","resolveScope","isSelectAllFilter","getEmInternalApi"],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import type { Entity, IdType } from \"../Entity.ts\";\nimport {\n type EntityManager,\n type FindCountFilterOptions,\n type MaybeAbstractEntityConstructor,\n getEmInternalApi,\n} from \"../EntityManager.ts\";\nimport { getMetadata } from \"../EntityMetadata.ts\";\nimport type { FilterAndSettings, FindFilter } from \"../queries/find/EntityFilter.ts\";\nimport type { GraphQLFilterWithAlias } from \"../queries/find/EntityGraphQLFilter.ts\";\nimport { type ParsedFindQuery, parseFindQuery } from \"../queries/find/QueryParser.ts\";\nimport { isScope, isSelectAllFilter, resolveScope } from \"../queries/find/scopes.ts\";\nimport { kq } from \"../queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"../unnest.ts\";\nimport { fail } from \"../utils.ts\";\nimport {\n collectAndReplaceArgs,\n collectValues,\n createColumnValuesFromPrepared,\n getBatchKeyFromGenericStructure,\n queryFilterHash,\n} from \"./findDataLoader.ts\";\n\nexport const findCountOperation = \"find-count\";\n\nexport function findCountDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n): Promise<number> {\n const { where, ...opts } = filter;\n if (opts.limit || opts.offset) {\n throw new Error(\"Cannot use limit/offset with findCountDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);\n const { findSettings } = em[\"prepareFind\"](meta, findCountOperation, query, { ...opts, checkLimit: false });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, pendingDeletedIds, query, bindings, findSettings };\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<typeof prepared, number>(\n findCountOperation,\n batchKey,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings } = entries[0];\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query, findSettings, false);\n return [Number(rows[0].count)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT _find.tag, _data.count\n // FROM _find\n // CROSS JOIN LATERAL (\n // SELECT count(*) as count\n // FROM author a WHERE a.first_name = _find.arg1 OR a.last_name = _find.arg2\n // ) _data\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings } = entries[0];\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n\n // We're not returning the entities, just counting them...\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n\n const query2: ParsedFindQuery = {\n selects: [\"_find.tag as tag\", \"_data.count as count\"],\n tables: [\n { join: \"primary\", table: \"_find\", alias: \"_find\" },\n // Not sure what fromAlias is for/that it matters...\n { join: \"lateral\", query: query, table: meta.tableName, alias: \"_data\", fromAlias: \"_f\" },\n ],\n // For each unique query, capture its filter values in `bindings` to populate the CTE _find table\n ctes: [buildUnnestCte(\"_find\", argsColumns, createColumnValuesFromPrepared(args, entries))],\n orderBys: [],\n };\n\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query2, findSettings, false);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => 0);\n // Then put each row into the tagged query it matched\n for (const row of rows) {\n results[row.tag] = Number(row.count);\n }\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: (entry) => queryFilterHash(entry) },\n )\n .load(prepared);\n}\n\n/** Merges root-scope count/id settings with caller options, dropping pagination-only settings. */\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindCountFilterOptions<T> = {};\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n\n/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */\nfunction appendPendingDeletedIds<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n query: ParsedFindQuery,\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n where: FilterAndSettings<T>[\"where\"],\n opts: Omit<FilterAndSettings<T>, \"where\">,\n): readonly IdType[] {\n const pendingDeletedIds = isSelectAllFilter(where, opts.conditions)\n ? []\n : getEmInternalApi(em).pendingDeleteIds(type);\n if (pendingDeletedIds.length === 0) return pendingDeletedIds;\n\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n const condition = {\n kind: \"column\" as const,\n alias: primary.alias,\n column: \"id\",\n dbType: idDbType,\n cond: { kind: \"nin\" as const, value: pendingDeletedIds },\n pruneable: true,\n };\n\n if (!query.condition) {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [condition] };\n } else if (query.condition.op === \"and\") {\n query.condition.conditions.push(condition);\n } else {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [query.condition, condition] };\n }\n return pendingDeletedIds;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"findCountDataLoader.cjs","names":["getMetadata","parseFindQuery","getBatchKeyFromGenericStructure","fail","kq","collectAndReplaceArgs","buildUnnestCte","createColumnValuesFromPrepared","queryFilterHash","isScope","resolveScope","isSelectAllFilter","getEmInternalApi"],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import {\n collectAndReplaceArgs,\n collectValues,\n createColumnValuesFromPrepared,\n getBatchKeyFromGenericStructure,\n queryFilterHash,\n} from \"src/dataloaders/findDataLoader.ts\";\nimport type { Entity, IdType } from \"src/Entity.ts\";\nimport {\n type EntityManager,\n type FindCountFilterOptions,\n type MaybeAbstractEntityConstructor,\n getEmInternalApi,\n} from \"src/EntityManager.ts\";\nimport { getMetadata } from \"src/EntityMetadata.ts\";\nimport type { FilterAndSettings, FindFilter } from \"src/queries/find/EntityFilter.ts\";\nimport type { GraphQLFilterWithAlias } from \"src/queries/find/EntityGraphQLFilter.ts\";\nimport { type ParsedFindQuery, parseFindQuery } from \"src/queries/find/QueryParser.ts\";\nimport { isScope, isSelectAllFilter, resolveScope } from \"src/queries/find/scopes.ts\";\nimport { kq } from \"src/queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"src/queries/unnest.ts\";\nimport { fail } from \"src/utils.ts\";\n\nexport const findCountOperation = \"find-count\";\n\nexport function findCountDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n): Promise<number> {\n const { where, ...opts } = filter;\n if (opts.limit || opts.offset) {\n throw new Error(\"Cannot use limit/offset with findCountDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);\n const { findSettings } = em[\"prepareFind\"](meta, findCountOperation, query, { ...opts, checkLimit: false });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, pendingDeletedIds, query, bindings, findSettings };\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<typeof prepared, number>(\n findCountOperation,\n batchKey,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings } = entries[0];\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query, findSettings, false);\n return [Number(rows[0].count)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT _find.tag, _data.count\n // FROM _find\n // CROSS JOIN LATERAL (\n // SELECT count(*) as count\n // FROM author a WHERE a.first_name = _find.arg1 OR a.last_name = _find.arg2\n // ) _data\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings } = entries[0];\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n\n // We're not returning the entities, just counting them...\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n\n const query2: ParsedFindQuery = {\n selects: [\"_find.tag as tag\", \"_data.count as count\"],\n tables: [\n { join: \"primary\", table: \"_find\", alias: \"_find\" },\n // Not sure what fromAlias is for/that it matters...\n { join: \"lateral\", query: query, table: meta.tableName, alias: \"_data\", fromAlias: \"_f\" },\n ],\n // For each unique query, capture its filter values in `bindings` to populate the CTE _find table\n ctes: [buildUnnestCte(\"_find\", argsColumns, createColumnValuesFromPrepared(args, entries))],\n orderBys: [],\n };\n\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query2, findSettings, false);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => 0);\n // Then put each row into the tagged query it matched\n for (const row of rows) {\n results[row.tag] = Number(row.count);\n }\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: (entry) => queryFilterHash(entry) },\n )\n .load(prepared);\n}\n\n/** Merges root-scope count/id settings with caller options, dropping pagination-only settings. */\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindCountFilterOptions<T> = {};\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n\n/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */\nfunction appendPendingDeletedIds<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n query: ParsedFindQuery,\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n where: FilterAndSettings<T>[\"where\"],\n opts: Omit<FilterAndSettings<T>, \"where\">,\n): readonly IdType[] {\n const pendingDeletedIds = isSelectAllFilter(where, opts.conditions)\n ? []\n : getEmInternalApi(em).pendingDeleteIds(type);\n if (pendingDeletedIds.length === 0) return pendingDeletedIds;\n\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n const condition = {\n kind: \"column\" as const,\n alias: primary.alias,\n column: \"id\",\n dbType: idDbType,\n cond: { kind: \"nin\" as const, value: pendingDeletedIds },\n pruneable: true,\n };\n\n if (!query.condition) {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [condition] };\n } else if (query.condition.op === \"and\") {\n query.condition.conditions.push(condition);\n } else {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [query.condition, condition] };\n }\n return pendingDeletedIds;\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { isScope, isSelectAllFilter, resolveScope } from "../queries/find/scopes
3
3
  import { parseFindQuery } from "../queries/find/QueryParser.js";
4
4
  import { fail } from "../utils.js";
5
5
  import { getMetadata } from "../EntityMetadata.js";
6
- import { buildUnnestCte } from "../unnest.js";
6
+ import { buildUnnestCte } from "../queries/unnest.js";
7
7
  import { collectAndReplaceArgs, collectValues, createColumnValuesFromPrepared, getBatchKeyFromGenericStructure, queryFilterHash } from "./findDataLoader.js";
8
8
  import { getEmInternalApi } from "../EntityManager.js";
9
9
  //#region src/dataloaders/findCountDataLoader.ts
@@ -1 +1 @@
1
- {"version":3,"file":"findCountDataLoader.js","names":[],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import type { Entity, IdType } from \"../Entity.ts\";\nimport {\n type EntityManager,\n type FindCountFilterOptions,\n type MaybeAbstractEntityConstructor,\n getEmInternalApi,\n} from \"../EntityManager.ts\";\nimport { getMetadata } from \"../EntityMetadata.ts\";\nimport type { FilterAndSettings, FindFilter } from \"../queries/find/EntityFilter.ts\";\nimport type { GraphQLFilterWithAlias } from \"../queries/find/EntityGraphQLFilter.ts\";\nimport { type ParsedFindQuery, parseFindQuery } from \"../queries/find/QueryParser.ts\";\nimport { isScope, isSelectAllFilter, resolveScope } from \"../queries/find/scopes.ts\";\nimport { kq } from \"../queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"../unnest.ts\";\nimport { fail } from \"../utils.ts\";\nimport {\n collectAndReplaceArgs,\n collectValues,\n createColumnValuesFromPrepared,\n getBatchKeyFromGenericStructure,\n queryFilterHash,\n} from \"./findDataLoader.ts\";\n\nexport const findCountOperation = \"find-count\";\n\nexport function findCountDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n): Promise<number> {\n const { where, ...opts } = filter;\n if (opts.limit || opts.offset) {\n throw new Error(\"Cannot use limit/offset with findCountDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);\n const { findSettings } = em[\"prepareFind\"](meta, findCountOperation, query, { ...opts, checkLimit: false });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, pendingDeletedIds, query, bindings, findSettings };\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<typeof prepared, number>(\n findCountOperation,\n batchKey,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings } = entries[0];\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query, findSettings, false);\n return [Number(rows[0].count)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT _find.tag, _data.count\n // FROM _find\n // CROSS JOIN LATERAL (\n // SELECT count(*) as count\n // FROM author a WHERE a.first_name = _find.arg1 OR a.last_name = _find.arg2\n // ) _data\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings } = entries[0];\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n\n // We're not returning the entities, just counting them...\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n\n const query2: ParsedFindQuery = {\n selects: [\"_find.tag as tag\", \"_data.count as count\"],\n tables: [\n { join: \"primary\", table: \"_find\", alias: \"_find\" },\n // Not sure what fromAlias is for/that it matters...\n { join: \"lateral\", query: query, table: meta.tableName, alias: \"_data\", fromAlias: \"_f\" },\n ],\n // For each unique query, capture its filter values in `bindings` to populate the CTE _find table\n ctes: [buildUnnestCte(\"_find\", argsColumns, createColumnValuesFromPrepared(args, entries))],\n orderBys: [],\n };\n\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query2, findSettings, false);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => 0);\n // Then put each row into the tagged query it matched\n for (const row of rows) {\n results[row.tag] = Number(row.count);\n }\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: (entry) => queryFilterHash(entry) },\n )\n .load(prepared);\n}\n\n/** Merges root-scope count/id settings with caller options, dropping pagination-only settings. */\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindCountFilterOptions<T> = {};\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n\n/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */\nfunction appendPendingDeletedIds<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n query: ParsedFindQuery,\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n where: FilterAndSettings<T>[\"where\"],\n opts: Omit<FilterAndSettings<T>, \"where\">,\n): readonly IdType[] {\n const pendingDeletedIds = isSelectAllFilter(where, opts.conditions)\n ? []\n : getEmInternalApi(em).pendingDeleteIds(type);\n if (pendingDeletedIds.length === 0) return pendingDeletedIds;\n\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n const condition = {\n kind: \"column\" as const,\n alias: primary.alias,\n column: \"id\",\n dbType: idDbType,\n cond: { kind: \"nin\" as const, value: pendingDeletedIds },\n pruneable: true,\n };\n\n if (!query.condition) {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [condition] };\n } else if (query.condition.op === \"and\") {\n query.condition.conditions.push(condition);\n } else {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [query.condition, condition] };\n }\n return pendingDeletedIds;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"findCountDataLoader.js","names":[],"sources":["../../src/dataloaders/findCountDataLoader.ts"],"sourcesContent":["import {\n collectAndReplaceArgs,\n collectValues,\n createColumnValuesFromPrepared,\n getBatchKeyFromGenericStructure,\n queryFilterHash,\n} from \"src/dataloaders/findDataLoader.ts\";\nimport type { Entity, IdType } from \"src/Entity.ts\";\nimport {\n type EntityManager,\n type FindCountFilterOptions,\n type MaybeAbstractEntityConstructor,\n getEmInternalApi,\n} from \"src/EntityManager.ts\";\nimport { getMetadata } from \"src/EntityMetadata.ts\";\nimport type { FilterAndSettings, FindFilter } from \"src/queries/find/EntityFilter.ts\";\nimport type { GraphQLFilterWithAlias } from \"src/queries/find/EntityGraphQLFilter.ts\";\nimport { type ParsedFindQuery, parseFindQuery } from \"src/queries/find/QueryParser.ts\";\nimport { isScope, isSelectAllFilter, resolveScope } from \"src/queries/find/scopes.ts\";\nimport { kq } from \"src/queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"src/queries/unnest.ts\";\nimport { fail } from \"src/utils.ts\";\n\nexport const findCountOperation = \"find-count\";\n\nexport function findCountDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n): Promise<number> {\n const { where, ...opts } = filter;\n if (opts.limit || opts.offset) {\n throw new Error(\"Cannot use limit/offset with findCountDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const pendingDeletedIds = appendPendingDeletedIds(em, type, query, meta.idDbType, where, opts);\n const { findSettings } = em[\"prepareFind\"](meta, findCountOperation, query, { ...opts, checkLimit: false });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, pendingDeletedIds, query, bindings, findSettings };\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<typeof prepared, number>(\n findCountOperation,\n batchKey,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings } = entries[0];\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query, findSettings, false);\n return [Number(rows[0].count)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT _find.tag, _data.count\n // FROM _find\n // CROSS JOIN LATERAL (\n // SELECT count(*) as count\n // FROM author a WHERE a.first_name = _find.arg1 OR a.last_name = _find.arg2\n // ) _data\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings } = entries[0];\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n\n // We're not returning the entities, just counting them...\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n query.selects = [`count(distinct ${kq(primary.alias)}.id) as count`];\n query.orderBys = [];\n\n const query2: ParsedFindQuery = {\n selects: [\"_find.tag as tag\", \"_data.count as count\"],\n tables: [\n { join: \"primary\", table: \"_find\", alias: \"_find\" },\n // Not sure what fromAlias is for/that it matters...\n { join: \"lateral\", query: query, table: meta.tableName, alias: \"_data\", fromAlias: \"_f\" },\n ],\n // For each unique query, capture its filter values in `bindings` to populate the CTE _find table\n ctes: [buildUnnestCte(\"_find\", argsColumns, createColumnValuesFromPrepared(args, entries))],\n orderBys: [],\n };\n\n const rows = await em[\"executePreparedFind\"](meta, findCountOperation, query2, findSettings, false);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => 0);\n // Then put each row into the tagged query it matched\n for (const row of rows) {\n results[row.tag] = Number(row.count);\n }\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: (entry) => queryFilterHash(entry) },\n )\n .load(prepared);\n}\n\n/** Merges root-scope count/id settings with caller options, dropping pagination-only settings. */\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> };\nexport function mergeCountOptions<T extends Entity>(\n where: FindFilter<T> | GraphQLFilterWithAlias<T>,\n options: FindCountFilterOptions<T>,\n): { where: FindFilter<T> | GraphQLFilterWithAlias<T>; options: FindCountFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindCountFilterOptions<T> = {};\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n\n/** Adds `id not in pendingDeletedIds` to the count query so pending deletes are excluded in SQL. */\nfunction appendPendingDeletedIds<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n query: ParsedFindQuery,\n idDbType: \"bigint\" | \"int\" | \"uuid\" | \"text\",\n where: FilterAndSettings<T>[\"where\"],\n opts: Omit<FilterAndSettings<T>, \"where\">,\n): readonly IdType[] {\n const pendingDeletedIds = isSelectAllFilter(where, opts.conditions)\n ? []\n : getEmInternalApi(em).pendingDeleteIds(type);\n if (pendingDeletedIds.length === 0) return pendingDeletedIds;\n\n const primary = query.tables.find((t) => t.join === \"primary\") ?? fail(\"No primary\");\n const condition = {\n kind: \"column\" as const,\n alias: primary.alias,\n column: \"id\",\n dbType: idDbType,\n cond: { kind: \"nin\" as const, value: pendingDeletedIds },\n pruneable: true,\n };\n\n if (!query.condition) {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [condition] };\n } else if (query.condition.op === \"and\") {\n query.condition.conditions.push(condition);\n } else {\n query.condition = { kind: \"exp\", op: \"and\", conditions: [query.condition, condition] };\n }\n return pendingDeletedIds;\n}\n"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_normalizeHints = require("../normalizeHints.cjs");
2
3
  const require_fields = require("../fields.cjs");
3
4
  const require_queries_sql_keywords = require("../queries/sql/keywords.cjs");
4
5
  const require_queries_find_QueryVisitor = require("../queries/find/QueryVisitor.cjs");
5
6
  const require_queries_find_QueryParser = require("../queries/find/QueryParser.cjs");
6
- const require_normalizeHints = require("../normalizeHints.cjs");
7
7
  const require_utils = require("../utils.cjs");
8
8
  const require_EntityMetadata = require("../EntityMetadata.cjs");
9
9
  const require_queries_find_EntityGraphQLFilter = require("../queries/find/EntityGraphQLFilter.cjs");
10
- const require_HintTree = require("../HintTree.cjs");
11
- const require_unnest = require("../unnest.cjs");
12
10
  const require_dataloaders_fastWhereFilterHash = require("./fastWhereFilterHash.cjs");
11
+ const require_loading_HintTree = require("../loading/HintTree.cjs");
12
+ const require_queries_unnest = require("../queries/unnest.cjs");
13
13
  const require_EntityManager = require("../EntityManager.cjs");
14
14
  //#region src/dataloaders/findDataLoader.ts
15
15
  const findOperation = "find";
@@ -36,13 +36,13 @@ function findDataLoader(em, type, filter, hint) {
36
36
  if (entries.length === 1) {
37
37
  const { query, findSettings, checkLimit } = entries[0];
38
38
  const { preloader } = require_EntityManager.getEmInternalApi(em);
39
- const preloadHydrator = preloader && hint && preloader.addPreloading(meta, require_HintTree.buildHintTree(hint), query);
39
+ const preloadHydrator = preloader && hint && preloader.addPreloading(meta, require_loading_HintTree.buildHintTree(hint), query);
40
40
  const rowData = await em["executePreparedFindRowData"](meta, findOperation, query, findSettings, checkLimit);
41
41
  return [filterDeletedEntities(em, em["hydrateAndFinalize"](type, rowData, { sidecars: (entities) => preloadHydrator?.(rowData, entities) }))];
42
42
  }
43
43
  const { query, findSettings, checkLimit } = entries[0];
44
44
  const { preloader } = require_EntityManager.getEmInternalApi(em);
45
- const preloadJoins = preloader && hint && preloader.getPreloadJoins(meta, require_HintTree.buildHintTree(hint), query);
45
+ const preloadJoins = preloader && hint && preloader.getPreloadJoins(meta, require_loading_HintTree.buildHintTree(hint), query);
46
46
  const args = collectAndReplaceArgs(query, entries);
47
47
  const argsColumns = [{
48
48
  columnName: "tag",
@@ -57,7 +57,7 @@ function findDataLoader(em, type, filter, hint) {
57
57
  table: "_find",
58
58
  alias: "_find"
59
59
  }, ...query.tables],
60
- ctes: [require_unnest.buildUnnestCte("_find", argsColumns, columnValues), ...query.ctes ?? []]
60
+ ctes: [require_queries_unnest.buildUnnestCte("_find", argsColumns, columnValues), ...query.ctes ?? []]
61
61
  };
62
62
  if (preloadJoins) {
63
63
  query2.selects.push(...preloadJoins.flatMap((j) => j.selects.map((s) => `(array_agg(${s.value}))[1] AS ${s.as}`)));
@@ -1 +1 @@
1
- {"version":3,"file":"findDataLoader.cjs","names":["getMetadata","parseFindQuery","hintKey","getEmInternalApi","buildHintTree","buildUnnestCte","getTables","fastWhereFilterHash","kqDot","parseAlias","opToFn","fail","equal","equalArrays"],"sources":["../../src/dataloaders/findDataLoader.ts"],"sourcesContent":["import type { OpColumn } from \"../drivers/EntityWriter.ts\";\nimport type { Entity } from \"../Entity.ts\";\nimport { type EntityManager, type MaybeAbstractEntityConstructor, getEmInternalApi } from \"../EntityManager.ts\";\nimport { type EntityMetadata, getMetadata } from \"../EntityMetadata.ts\";\nimport { equal, equalArrays } from \"../fields.ts\";\nimport { buildHintTree } from \"../HintTree.ts\";\nimport type { LoadHint } from \"../loadHints.ts\";\nimport { hintKey } from \"../normalizeHints.ts\";\nimport type { FilterAndSettings } from \"../queries/find/EntityFilter.ts\";\nimport { opToFn } from \"../queries/find/EntityGraphQLFilter.ts\";\nimport {\n type ParsedCteClause,\n type ParsedFindQuery,\n type ParsedGroupBy,\n type ParsedSelect,\n getTables,\n parseAlias,\n parseFindQuery,\n} from \"../queries/find/QueryParser.ts\";\nimport { visitConditions } from \"../queries/find/QueryVisitor.ts\";\nimport type { ColumnCondition, ParsedValueFilter, RawCondition } from \"../queries/parsedConditions.ts\";\nimport { kqDot } from \"../queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"../unnest.ts\";\nimport { assertNever, fail } from \"../utils.ts\";\nimport { fastWhereFilterHash } from \"./fastWhereFilterHash.ts\";\n\nexport const findOperation = \"find\";\n\ninterface PreparedFindEntry<T extends Entity> {\n filter: FilterAndSettings<T>;\n query: ParsedFindQuery;\n bindings: any[];\n findSettings: any;\n checkLimit: boolean | undefined;\n}\n\nexport function findDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n hint: LoadHint<T> | undefined,\n): Promise<T[]> {\n const { where, ...opts } = filter;\n if (\"limit\" in opts || \"offset\" in opts) {\n throw new Error(\"Cannot use limit/offset with findDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const { checkLimit, findSettings } = em[\"prepareFind\"](meta, findOperation, query, {\n ...opts,\n limit: em.entityLimit,\n });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, query, bindings, findSettings, checkLimit } satisfies PreparedFindEntry<T>;\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<PreparedFindEntry<T>, T[]>(\n findOperation,\n // It's unlikely we'll have simultaneous em.finds with the same WHERE clause structure\n // but lots of different load hints, and it'd be complicated to implement the preloading\n // in a way that doesn't naively over-fetch data (which our loadDataLoader does prevent,\n // but it's simpler b/c it's given exact ids to load), so for now just include the load\n // hint in the batch key.\n `${batchKey}-${hintKey(hint)}`,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings, checkLimit } = entries[0];\n // Maybe add preload joins\n const { preloader } = getEmInternalApi(em);\n const preloadHydrator = preloader && hint && preloader.addPreloading(meta, buildHintTree(hint), query);\n const rowData = await em[\"executePreparedFindRowData\"](meta, findOperation, query, findSettings, checkLimit);\n const entities = em[\"hydrateAndFinalize\"](type, rowData, {\n sidecars: (entities) => preloadHydrator?.(rowData, entities),\n });\n return [filterDeletedEntities(em, entities)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT a.*, array_agg(_find.tag) AS _tags\n // FROM authors a\n // CROSS JOIN _find AS _find\n // WHERE a.first_name = _find.arg0 OR a.last_name = _find.arg1\n // GROUP BY a.id\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings, checkLimit } = entries[0];\n const { preloader } = getEmInternalApi(em);\n const preloadJoins = preloader && hint && preloader.getPreloadJoins(meta, buildHintTree(hint), query);\n\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns: OpColumn[] = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n const columnValues = createColumnValuesFromPrepared(args, entries);\n const query2: ParsedFindQuery = {\n ...query,\n selects: [\"array_agg(_find.tag) as _tags\", ...query.selects],\n tables: [{ join: \"cross\", table: \"_find\", alias: \"_find\" }, ...query.tables],\n ctes: [buildUnnestCte(\"_find\", argsColumns, columnValues), ...(query.ctes ?? [])],\n };\n if (preloadJoins) {\n query2.selects.push(\n ...preloadJoins.flatMap((j) =>\n // Because we 'group by primary.id' to collapse the \"a1 matched multiple finds\" into\n // a single row, we also need to pick just the first value of each preload column\n j.selects.map((s) => `(array_agg(${s.value}))[1] AS ${s.as}`),\n ),\n );\n query2.tables.push(...preloadJoins.map((j) => j.join));\n }\n\n // Because we want to use `array_agg(tag)`, add `GROUP BY`s to the values we're selecting\n query2.groupBys = buildGroupBys(query2.selects);\n\n // Also because of our `array_agg` group by, add any order bys to the group by\n const [primary] = getTables(query2);\n for (const { alias, column } of query2.orderBys) {\n if (alias !== primary.alias) {\n query2.groupBys.push({ alias, column });\n }\n }\n\n const rowData = await em[\"executePreparedFindRowData\"](meta, findOperation, query2, findSettings, checkLimit);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => [] as T[]);\n em[\"hydrateAndFinalize\"](type, rowData, {\n sidecars: (entities) => {\n preloadJoins?.forEach((j) => j.hydrator(rowData, entities));\n // Put each row into the tagged query it matched\n for (let i = 0; i < entities.length; i++) {\n const entity = entities[i];\n if (!entity.isDeletedEntity) {\n for (const tag of rowData.get(i, \"_tags\")) results[tag].push(entity);\n }\n }\n },\n });\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: queryFilterHash },\n )\n .load(prepared);\n}\n\n/**\n * Returns a stable cache key from the already-parsed query rather than the raw `where`.\n *\n * A scope `where` is an opaque proxy that `fastWhereFilterHash` can't serialize — but it doesn't need\n * to: by this point the scope's structure and values are already worked into the `ParsedFindQuery`, so\n * hashing that distinguishes e.g. `Author.adult` (age>=18) from `Author.senior` (age>=65) correctly.\n */\nexport function queryFilterHash(entry: { query: ParsedFindQuery; findSettings: object }): any {\n return whereFilterHash({ query: entry.query, findSettings: entry.findSettings });\n}\n\nexport function whereFilterHash(where: object): any {\n const key = fastWhereFilterHash(where);\n if (key === undefined) throw new Error(\"fastWhereFilterHash could not serialize find filter\");\n return key;\n}\n\n/** Filters pending-delete entities in place to avoid allocating a replacement array for the common find path. */\nexport function filterDeletedEntities<T extends Entity>(em: EntityManager, entities: T[]): T[] {\n // Most EMs never delete entities, so skip even the findIndex scan until a delete has happened.\n if (!getEmInternalApi(em).hasAnyDeletes()) return entities;\n\n const firstDeleted = entities.findIndex((entity) => entity.isDeletedEntity);\n if (firstDeleted === -1) return entities;\n\n let writeIndex = firstDeleted;\n for (let readIndex = firstDeleted + 1; readIndex < entities.length; readIndex++) {\n const entity = entities[readIndex];\n if (!entity.isDeletedEntity) {\n entities[writeIndex++] = entity;\n }\n }\n entities.length = writeIndex;\n return entities;\n}\n\nclass ArgCounter {\n private index = 0;\n next(): number {\n return this.index++;\n }\n}\n\n/**\n * A single batched arg: the `_find` CTE column to create, plus the index into each entry's `bindings`\n * array that fills it. `bindingIndex` can differ from the column's position because inlined constants\n * are skipped — see {@link collectAndReplaceArgs}.\n */\nexport interface CteArg {\n column: OpColumn;\n bindingIndex: number;\n}\n\n/**\n * Rewrites each batched arg in `query` into a `_find.argX` placeholder.\n *\n * Any condition whose value(s) are identical across every batched query is left inline (using\n * query's condition as-is from entity0), so it renders as `col = ?` for better query planning.\n *\n * The returned array has the non-constant CTE columns, one {@link CteArg} per `_find.argX`.\n *\n * Because constants are skipped, the 1st CTE column (i.e. for last name) might actually have a\n * binding index of `1` if we've skipped an early constant column (i.e. first name).\n *\n * @param query the initial query in the batch, that all other queries structurally match\n * @param entries the values (bindings) for each query in the batch\n */\nexport function collectAndReplaceArgs(query: ParsedFindQuery, entries: readonly { bindings: any[] }[]): CteArg[] {\n const args: CteArg[] = [];\n const argsIndex = new ArgCounter();\n // `bindings` were pushed in this same `visitConditions` order, so we can walk the conditions and\n // each entry's `bindings` in lockstep, deciding per condition whether to inline or batch its value(s).\n const constant = computeConstantBindings(entries);\n let bindingIndex = 0;\n visitConditions(query, {\n visitCond(c: ColumnCondition) {\n if (\"value\" in c.cond) {\n const { kind } = c.cond;\n // `between` consumes two bindings, everything else (incl. array `in`/`nin`) consumes one.\n const consumed = kind === \"between\" ? 2 : 1;\n const start = bindingIndex;\n bindingIndex += consumed;\n // If every batched query shares this condition's value(s), leave it as a normal `col = ?`\n // condition (rendered from `entries[0]`'s value) instead of threading it through the CTE.\n let allConstant = true;\n for (let k = 0; k < consumed; k++) {\n if (!constant[start + k]) {\n allConstant = false;\n break;\n }\n }\n if (allConstant) return;\n // `arg${args.length}` keeps the CTE column names in step with the `_find.argX` references that\n // `rewriteToRawCondition` emits, since both only advance for the args we actually batch.\n if (kind === \"between\") {\n args.push({ column: { columnName: `arg${args.length}`, dbType: c.dbType }, bindingIndex: start });\n args.push({ column: { columnName: `arg${args.length}`, dbType: c.dbType }, bindingIndex: start + 1 });\n } else {\n // Figure out the _find CTE's `unnest($n::${dbType})` so Postgres knows what we're sending in\n const dbType =\n kind === \"in\" || kind === \"nin\"\n ? `${c.dbType}[]` // `in`/`nin` compare against an array column\n : kind === \"jsonPathExists\" || kind === \"jsonPathPredicate\"\n ? \"jsonpath\" // jsonPath needs `::jsonpath` (not `::jsonb`, which would be an invalid `jsonb @@ jsonb`)\n : c.dbType;\n args.push({ column: { columnName: `arg${args.length}`, dbType }, bindingIndex: start });\n }\n return rewriteToRawCondition(c, argsIndex);\n } else if (c.cond.kind === \"is-null\" || c.cond.kind === \"not-null\") {\n // leave it alone\n } else {\n throw new Error(\"Unsupported\");\n }\n },\n });\n return args;\n}\n\nfunction rewriteToRawCondition(c: ColumnCondition, argsIndex: ArgCounter): RawCondition {\n const [op, negate] = makeOp(c.cond, argsIndex);\n return {\n kind: \"raw\",\n aliases: [c.alias],\n condition: `${negate ? \"NOT \" : \"\"}${kqDot(c.alias, c.column)} ${op}`,\n pruneable: c.pruneable ?? false,\n bindings: [],\n };\n}\n\n/**\n * Builds the column-major values for the `_find` CTE.\n *\n * Column 0 is the per-entry `tag`; the remaining columns mirror `args` 1:1, each pulling its\n * `bindingIndex` from every entry's `bindings` (so inlined constants are naturally skipped).\n */\nexport function createColumnValuesFromPrepared(\n args: readonly CteArg[],\n entries: readonly { bindings: any[] }[],\n): any[][] {\n const columnValues: any[][] = new Array(args.length + 1);\n for (let i = 0; i < columnValues.length; i++) columnValues[i] = [];\n entries.forEach((entry, i) => {\n columnValues[0].push(i);\n for (let k = 0; k < args.length; k++) {\n columnValues[k + 1].push(entry.bindings[args[k].bindingIndex]);\n }\n });\n return columnValues;\n}\n\n/** Pushes the arg values of a given query in the cross-query `bindings` array. */\nexport function collectValues(bindings: any[], query: ParsedFindQuery): void {\n visitConditions(query, {\n visitCond(c: ColumnCondition) {\n if (\"value\" in c.cond) {\n // between has two values\n if (c.cond.kind === \"between\") {\n bindings.push(c.cond.value[0]);\n bindings.push(c.cond.value[1]);\n } else {\n bindings.push(c.cond.value);\n }\n }\n },\n });\n}\n\n/** Returns true for select expressions that do not need to be represented in GROUP BY. */\nfunction isAggregateSelect(select: string): boolean {\n return select.toLowerCase().includes(\"array_agg(\");\n}\n\n/** Builds GROUP BYs for selected values, accounting for whole-row selects that are grouped by primary key. */\nfunction buildGroupBys(selects: ParsedSelect[]): ParsedGroupBy[] {\n const sqlSelects = selects.map(selectSqlForGroupBy);\n const wholeRowAliases = new Set(\n sqlSelects\n .filter((select) => !isAggregateSelect(select) && stripSelectAlias(select).endsWith(\".*\"))\n .map(parseAlias),\n );\n return sqlSelects\n .filter((select) => !isAggregateSelect(select))\n .filter((select) => !isCoveredByWholeRowGroupBy(select, wholeRowAliases))\n .map((select) => groupBySelect(select));\n}\n\n/** Returns a SQL string for group-by analysis, until we support bindings in ParsedGroupBy. */\nfunction selectSqlForGroupBy(select: ParsedSelect): string {\n if (typeof select === \"string\") {\n return select;\n }\n throw new Error(`find batching does not support grouped selects with bindings: ${select.sql}`);\n}\n\n/** Builds a GROUP BY for a selected value so `array_agg(_find.tag)` can coexist with plugin-rewritten selects. */\nfunction groupBySelect(select: string): ParsedGroupBy {\n const expression = stripSelectAlias(select);\n if (expression.endsWith(\".*\")) {\n return { alias: parseAlias(expression), column: \"id\" };\n }\n return { expression };\n}\n\n/** Removes a trailing SQL alias from a select expression, i.e. `(a.id) as id` -> `(a.id)`. */\nfunction stripSelectAlias(select: string): string {\n const match = /^(.*)\\s+as\\s+[^\\s]+$/i.exec(select);\n return match?.[1] ?? select;\n}\n\n/** Returns true when an expression is functionally covered by an already-grouped whole-row alias. */\nfunction isCoveredByWholeRowGroupBy(select: string, wholeRowAliases: Set<string>): boolean {\n const expression = stripSelectAlias(select);\n if (expression.endsWith(\".*\")) {\n return false;\n }\n const aliases = findSelectedAliases(expression);\n return aliases.length > 0 && aliases.every((alias) => wholeRowAliases.has(alias));\n}\n\n/** Finds SQL aliases referenced as `alias.column` or `\"alias\".column`, i.e. `a.first_name` -> `a`. */\nfunction findSelectedAliases(expression: string): string[] {\n const aliases = new Set<string>();\n for (const match of expression.matchAll(/(?:\"([^\"]+)\"|([a-zA-Z_][\\w]*))\\./g)) {\n aliases.add(match[1] ?? match[2]);\n }\n return [...aliases];\n}\n\n/** Returns [operator, argsTaken, negate], i.e. `[\"=\", 1, false]`. */\nfunction makeOp(cond: ParsedValueFilter<any>, argsIndex: ArgCounter): [string, boolean] {\n switch (cond.kind) {\n case \"eq\":\n case \"ne\":\n case \"gte\":\n case \"gt\":\n case \"lte\":\n case \"lt\":\n case \"like\":\n case \"nlike\":\n case \"ilike\":\n case \"nilike\":\n case \"regex\":\n case \"nregex\":\n case \"iregex\":\n case \"niregex\":\n case \"jsonPathExists\":\n case \"jsonPathPredicate\":\n case \"contains\":\n case \"overlaps\":\n case \"containedBy\": {\n const fn = opToFn[cond.kind] ?? fail(`Invalid operator ${cond.kind}`);\n return [`${fn} _find.arg${argsIndex.next()}`, false];\n }\n case \"noverlaps\":\n case \"ncontains\": {\n const fn = (opToFn as any)[cond.kind.substring(1)] ?? fail(`Invalid operator ${cond.kind}`);\n return [`${fn} _find.arg${argsIndex.next()}`, true];\n }\n case \"is-null\":\n return [`IS NULL`, false];\n case \"not-null\":\n return [`IS NOT NULL`, false];\n case \"in\":\n return [`= ANY(_find.arg${argsIndex.next()})`, false];\n case \"nin\":\n return [`!= ALL(_find.arg${argsIndex.next()})`, false];\n case \"between\":\n return [`BETWEEN _find.arg${argsIndex.next()} AND _find.arg${argsIndex.next()}`, false];\n default:\n assertNever(cond);\n }\n}\n\n/**\n * Creates a `VALUES (...), (...)` SQL string for use in a CTE, typically for our\n * batch INSERTs/UPDATEs where the CTE is how we inject N rows of data/params into\n * the single INSERT/UPDATE statement.\n *\n * The caller is responsible for filling in the `bindings`, which should have 1\n * entry for each `rows x columns` cell.\n *\n * @deprecated Use newUnnestCte instead because it uses arrays to have a bounded number of parameters.\n */\nexport function buildValuesCte(\n alias: string,\n columns: { columnName: string; dbType: string }[],\n rows: readonly any[],\n // Should have a value for each `row x column` cell.\n bindings: readonly any[],\n): ParsedCteClause {\n return {\n alias,\n columns,\n query: {\n kind: \"raw\",\n sql: `VALUES\n ${rows.map((_, i) => `(${columns.map((c) => (i === 0 ? `?::${c.dbType}` : `?`)).join(\", \")})`).join(\", \")}\n `,\n bindings,\n },\n };\n}\n\n/** Returns, per binding slot, whether every batched query shares the same value. */\nfunction computeConstantBindings(entries: readonly { bindings: any[] }[]): boolean[] {\n const length = entries[0].bindings.length;\n const constant = new Array<boolean>(length);\n for (let j = 0; j < length; j++) {\n const first = entries[0].bindings[j];\n let same = true;\n for (let i = 1; i < entries.length; i++) {\n if (!argsEqual(entries[i].bindings[j], first)) {\n same = false;\n break;\n }\n }\n constant[j] = same;\n }\n return constant;\n}\n\n/**\n * Deep-equals two find-arg values (scalars, Dates, Temporals, or arrays thereof), reusing the same\n * scalar/array equality `setField` uses for change detection.\n *\n * Only used to decide whether a condition can be inlined, so false negatives are safe (we just fall\n * back to the CTE); we only return true when the values are genuinely equal.\n */\nfunction argsEqual(a: any, b: any): boolean {\n return equal(a, b) || (Array.isArray(a) && Array.isArray(b) && equalArrays(a, b));\n}\n\nexport function getBatchKeyFromGenericStructure(meta: EntityMetadata, query: ParsedFindQuery): string {\n // Temporarily swap condition values for `*` so we can see the generic structure of the query,\n // then restore them; this avoids deep-cloning the entire parsed query on every em.find call.\n // Track values per condition object b/c parseFindQuery does not deep copy complex conditions,\n // i.e. `a.firstName.eq(...)`, so the same condition instance could appear twice.\n const saved = new Map<any, any>();\n visitConditions(query, {\n visitCond(c: ColumnCondition) {\n const { cond } = c;\n if (\"value\" in cond && !saved.has(cond)) {\n saved.set(cond, cond.value);\n cond.value = \"*\";\n }\n },\n });\n const structure = JSON.stringify(query);\n for (const [cond, value] of saved) cond.value = value;\n // Include the meta b/c STI queries for different subtypes will look identical\n return meta.stiDiscriminatorValue ? `${structure}|${meta.type}` : structure;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"findDataLoader.cjs","names":["getMetadata","parseFindQuery","hintKey","getEmInternalApi","buildHintTree","buildUnnestCte","getTables","fastWhereFilterHash","kqDot","parseAlias","opToFn","fail","equal","equalArrays"],"sources":["../../src/dataloaders/findDataLoader.ts"],"sourcesContent":["import { fastWhereFilterHash } from \"src/dataloaders/fastWhereFilterHash.ts\";\nimport type { OpColumn } from \"src/drivers/EntityWriter.ts\";\nimport type { Entity } from \"src/Entity.ts\";\nimport { type EntityManager, type MaybeAbstractEntityConstructor, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, getMetadata } from \"src/EntityMetadata.ts\";\nimport { equal, equalArrays } from \"src/fields.ts\";\nimport { buildHintTree } from \"src/loading/HintTree.ts\";\nimport type { LoadHint } from \"src/loading/loadHints.ts\";\nimport { hintKey } from \"src/normalizeHints.ts\";\nimport type { FilterAndSettings } from \"src/queries/find/EntityFilter.ts\";\nimport { opToFn } from \"src/queries/find/EntityGraphQLFilter.ts\";\nimport {\n type ParsedCteClause,\n type ParsedFindQuery,\n type ParsedGroupBy,\n type ParsedSelect,\n getTables,\n parseAlias,\n parseFindQuery,\n} from \"src/queries/find/QueryParser.ts\";\nimport { visitConditions } from \"src/queries/find/QueryVisitor.ts\";\nimport type { ColumnCondition, ParsedValueFilter, RawCondition } from \"src/queries/parsedConditions.ts\";\nimport { kqDot } from \"src/queries/sql/keywords.ts\";\nimport { buildUnnestCte } from \"src/queries/unnest.ts\";\nimport { assertNever, fail } from \"src/utils.ts\";\n\nexport const findOperation = \"find\";\n\ninterface PreparedFindEntry<T extends Entity> {\n filter: FilterAndSettings<T>;\n query: ParsedFindQuery;\n bindings: any[];\n findSettings: any;\n checkLimit: boolean | undefined;\n}\n\nexport function findDataLoader<T extends Entity>(\n em: EntityManager,\n type: MaybeAbstractEntityConstructor<T>,\n filter: FilterAndSettings<T>,\n hint: LoadHint<T> | undefined,\n): Promise<T[]> {\n const { where, ...opts } = filter;\n if (\"limit\" in opts || \"offset\" in opts) {\n throw new Error(\"Cannot use limit/offset with findDataLoader\");\n }\n\n const meta = getMetadata(type);\n const query = parseFindQuery(meta, where, opts);\n const { checkLimit, findSettings } = em[\"prepareFind\"](meta, findOperation, query, {\n ...opts,\n limit: em.entityLimit,\n });\n const bindings: any[] = [];\n collectValues(bindings, query);\n const prepared = { filter, query, bindings, findSettings, checkLimit } satisfies PreparedFindEntry<T>;\n const batchKey = getBatchKeyFromGenericStructure(meta, query);\n\n return em\n .getLoader<PreparedFindEntry<T>, T[]>(\n findOperation,\n // It's unlikely we'll have simultaneous em.finds with the same WHERE clause structure\n // but lots of different load hints, and it'd be complicated to implement the preloading\n // in a way that doesn't naively over-fetch data (which our loadDataLoader does prevent,\n // but it's simpler b/c it's given exact ids to load), so for now just include the load\n // hint in the batch key.\n `${batchKey}-${hintKey(hint)}`,\n async (entries) => {\n // We're guaranteed that these queries all have the same structure\n\n // Don't bother with the CTE if there's only 1 query (or each query has exactly the same filter values)\n if (entries.length === 1) {\n const { query, findSettings, checkLimit } = entries[0];\n // Maybe add preload joins\n const { preloader } = getEmInternalApi(em);\n const preloadHydrator = preloader && hint && preloader.addPreloading(meta, buildHintTree(hint), query);\n const rowData = await em[\"executePreparedFindRowData\"](meta, findOperation, query, findSettings, checkLimit);\n const entities = em[\"hydrateAndFinalize\"](type, rowData, {\n sidecars: (entities) => preloadHydrator?.(rowData, entities),\n });\n return [filterDeletedEntities(em, entities)];\n }\n\n // WITH _find (tag, arg1, arg2) AS (\n // SELECT unnest($0::int[]), unnest($0::varchar[]), unnest($0::varchar[])\n // )\n // SELECT a.*, array_agg(_find.tag) AS _tags\n // FROM authors a\n // CROSS JOIN _find AS _find\n // WHERE a.first_name = _find.arg0 OR a.last_name = _find.arg1\n // GROUP BY a.id\n\n // Build the list of 'arg1', 'arg2', ... strings\n const { query, findSettings, checkLimit } = entries[0];\n const { preloader } = getEmInternalApi(em);\n const preloadJoins = preloader && hint && preloader.getPreloadJoins(meta, buildHintTree(hint), query);\n\n const args = collectAndReplaceArgs(query, entries);\n const argsColumns: OpColumn[] = [{ columnName: \"tag\", dbType: \"int\" }, ...args.map((a) => a.column)];\n const columnValues = createColumnValuesFromPrepared(args, entries);\n const query2: ParsedFindQuery = {\n ...query,\n selects: [\"array_agg(_find.tag) as _tags\", ...query.selects],\n tables: [{ join: \"cross\", table: \"_find\", alias: \"_find\" }, ...query.tables],\n ctes: [buildUnnestCte(\"_find\", argsColumns, columnValues), ...(query.ctes ?? [])],\n };\n if (preloadJoins) {\n query2.selects.push(\n ...preloadJoins.flatMap((j) =>\n // Because we 'group by primary.id' to collapse the \"a1 matched multiple finds\" into\n // a single row, we also need to pick just the first value of each preload column\n j.selects.map((s) => `(array_agg(${s.value}))[1] AS ${s.as}`),\n ),\n );\n query2.tables.push(...preloadJoins.map((j) => j.join));\n }\n\n // Because we want to use `array_agg(tag)`, add `GROUP BY`s to the values we're selecting\n query2.groupBys = buildGroupBys(query2.selects);\n\n // Also because of our `array_agg` group by, add any order bys to the group by\n const [primary] = getTables(query2);\n for (const { alias, column } of query2.orderBys) {\n if (alias !== primary.alias) {\n query2.groupBys.push({ alias, column });\n }\n }\n\n const rowData = await em[\"executePreparedFindRowData\"](meta, findOperation, query2, findSettings, checkLimit);\n\n // Make an empty array for each batched query, per the dataloader contract\n const results = entries.map(() => [] as T[]);\n em[\"hydrateAndFinalize\"](type, rowData, {\n sidecars: (entities) => {\n preloadJoins?.forEach((j) => j.hydrator(rowData, entities));\n // Put each row into the tagged query it matched\n for (let i = 0; i < entities.length; i++) {\n const entity = entities[i];\n if (!entity.isDeletedEntity) {\n for (const tag of rowData.get(i, \"_tags\")) results[tag].push(entity);\n }\n }\n },\n });\n return results;\n },\n // Our filter/order tuple is a complex object, so use a stable cache key to ensure caching works.\n { cacheKeyFn: queryFilterHash },\n )\n .load(prepared);\n}\n\n/**\n * Returns a stable cache key from the already-parsed query rather than the raw `where`.\n *\n * A scope `where` is an opaque proxy that `fastWhereFilterHash` can't serialize — but it doesn't need\n * to: by this point the scope's structure and values are already worked into the `ParsedFindQuery`, so\n * hashing that distinguishes e.g. `Author.adult` (age>=18) from `Author.senior` (age>=65) correctly.\n */\nexport function queryFilterHash(entry: { query: ParsedFindQuery; findSettings: object }): any {\n return whereFilterHash({ query: entry.query, findSettings: entry.findSettings });\n}\n\nexport function whereFilterHash(where: object): any {\n const key = fastWhereFilterHash(where);\n if (key === undefined) throw new Error(\"fastWhereFilterHash could not serialize find filter\");\n return key;\n}\n\n/** Filters pending-delete entities in place to avoid allocating a replacement array for the common find path. */\nexport function filterDeletedEntities<T extends Entity>(em: EntityManager, entities: T[]): T[] {\n // Most EMs never delete entities, so skip even the findIndex scan until a delete has happened.\n if (!getEmInternalApi(em).hasAnyDeletes()) return entities;\n\n const firstDeleted = entities.findIndex((entity) => entity.isDeletedEntity);\n if (firstDeleted === -1) return entities;\n\n let writeIndex = firstDeleted;\n for (let readIndex = firstDeleted + 1; readIndex < entities.length; readIndex++) {\n const entity = entities[readIndex];\n if (!entity.isDeletedEntity) {\n entities[writeIndex++] = entity;\n }\n }\n entities.length = writeIndex;\n return entities;\n}\n\nclass ArgCounter {\n private index = 0;\n next(): number {\n return this.index++;\n }\n}\n\n/**\n * A single batched arg: the `_find` CTE column to create, plus the index into each entry's `bindings`\n * array that fills it. `bindingIndex` can differ from the column's position because inlined constants\n * are skipped — see {@link collectAndReplaceArgs}.\n */\nexport interface CteArg {\n column: OpColumn;\n bindingIndex: number;\n}\n\n/**\n * Rewrites each batched arg in `query` into a `_find.argX` placeholder.\n *\n * Any condition whose value(s) are identical across every batched query is left inline (using\n * query's condition as-is from entity0), so it renders as `col = ?` for better query planning.\n *\n * The returned array has the non-constant CTE columns, one {@link CteArg} per `_find.argX`.\n *\n * Because constants are skipped, the 1st CTE column (i.e. for last name) might actually have a\n * binding index of `1` if we've skipped an early constant column (i.e. first name).\n *\n * @param query the initial query in the batch, that all other queries structurally match\n * @param entries the values (bindings) for each query in the batch\n */\nexport function collectAndReplaceArgs(query: ParsedFindQuery, entries: readonly { bindings: any[] }[]): CteArg[] {\n const args: CteArg[] = [];\n const argsIndex = new ArgCounter();\n // `bindings` were pushed in this same `visitConditions` order, so we can walk the conditions and\n // each entry's `bindings` in lockstep, deciding per condition whether to inline or batch its value(s).\n const constant = computeConstantBindings(entries);\n let bindingIndex = 0;\n visitConditions(query, {\n visitCond(c: ColumnCondition) {\n if (\"value\" in c.cond) {\n const { kind } = c.cond;\n // `between` consumes two bindings, everything else (incl. array `in`/`nin`) consumes one.\n const consumed = kind === \"between\" ? 2 : 1;\n const start = bindingIndex;\n bindingIndex += consumed;\n // If every batched query shares this condition's value(s), leave it as a normal `col = ?`\n // condition (rendered from `entries[0]`'s value) instead of threading it through the CTE.\n let allConstant = true;\n for (let k = 0; k < consumed; k++) {\n if (!constant[start + k]) {\n allConstant = false;\n break;\n }\n }\n if (allConstant) return;\n // `arg${args.length}` keeps the CTE column names in step with the `_find.argX` references that\n // `rewriteToRawCondition` emits, since both only advance for the args we actually batch.\n if (kind === \"between\") {\n args.push({ column: { columnName: `arg${args.length}`, dbType: c.dbType }, bindingIndex: start });\n args.push({ column: { columnName: `arg${args.length}`, dbType: c.dbType }, bindingIndex: start + 1 });\n } else {\n // Figure out the _find CTE's `unnest($n::${dbType})` so Postgres knows what we're sending in\n const dbType =\n kind === \"in\" || kind === \"nin\"\n ? `${c.dbType}[]` // `in`/`nin` compare against an array column\n : kind === \"jsonPathExists\" || kind === \"jsonPathPredicate\"\n ? \"jsonpath\" // jsonPath needs `::jsonpath` (not `::jsonb`, which would be an invalid `jsonb @@ jsonb`)\n : c.dbType;\n args.push({ column: { columnName: `arg${args.length}`, dbType }, bindingIndex: start });\n }\n return rewriteToRawCondition(c, argsIndex);\n } else if (c.cond.kind === \"is-null\" || c.cond.kind === \"not-null\") {\n // leave it alone\n } else {\n throw new Error(\"Unsupported\");\n }\n },\n });\n return args;\n}\n\nfunction rewriteToRawCondition(c: ColumnCondition, argsIndex: ArgCounter): RawCondition {\n const [op, negate] = makeOp(c.cond, argsIndex);\n return {\n kind: \"raw\",\n aliases: [c.alias],\n condition: `${negate ? \"NOT \" : \"\"}${kqDot(c.alias, c.column)} ${op}`,\n pruneable: c.pruneable ?? false,\n bindings: [],\n };\n}\n\n/**\n * Builds the column-major values for the `_find` CTE.\n *\n * Column 0 is the per-entry `tag`; the remaining columns mirror `args` 1:1, each pulling its\n * `bindingIndex` from every entry's `bindings` (so inlined constants are naturally skipped).\n */\nexport function createColumnValuesFromPrepared(\n args: readonly CteArg[],\n entries: readonly { bindings: any[] }[],\n): any[][] {\n const columnValues: any[][] = new Array(args.length + 1);\n for (let i = 0; i < columnValues.length; i++) columnValues[i] = [];\n entries.forEach((entry, i) => {\n columnValues[0].push(i);\n for (let k = 0; k < args.length; k++) {\n columnValues[k + 1].push(entry.bindings[args[k].bindingIndex]);\n }\n });\n return columnValues;\n}\n\n/** Pushes the arg values of a given query in the cross-query `bindings` array. */\nexport function collectValues(bindings: any[], query: ParsedFindQuery): void {\n visitConditions(query, {\n visitCond(c: ColumnCondition) {\n if (\"value\" in c.cond) {\n // between has two values\n if (c.cond.kind === \"between\") {\n bindings.push(c.cond.value[0]);\n bindings.push(c.cond.value[1]);\n } else {\n bindings.push(c.cond.value);\n }\n }\n },\n });\n}\n\n/** Returns true for select expressions that do not need to be represented in GROUP BY. */\nfunction isAggregateSelect(select: string): boolean {\n return select.toLowerCase().includes(\"array_agg(\");\n}\n\n/** Builds GROUP BYs for selected values, accounting for whole-row selects that are grouped by primary key. */\nfunction buildGroupBys(selects: ParsedSelect[]): ParsedGroupBy[] {\n const sqlSelects = selects.map(selectSqlForGroupBy);\n const wholeRowAliases = new Set(\n sqlSelects\n .filter((select) => !isAggregateSelect(select) && stripSelectAlias(select).endsWith(\".*\"))\n .map(parseAlias),\n );\n return sqlSelects\n .filter((select) => !isAggregateSelect(select))\n .filter((select) => !isCoveredByWholeRowGroupBy(select, wholeRowAliases))\n .map((select) => groupBySelect(select));\n}\n\n/** Returns a SQL string for group-by analysis, until we support bindings in ParsedGroupBy. */\nfunction selectSqlForGroupBy(select: ParsedSelect): string {\n if (typeof select === \"string\") {\n return select;\n }\n throw new Error(`find batching does not support grouped selects with bindings: ${select.sql}`);\n}\n\n/** Builds a GROUP BY for a selected value so `array_agg(_find.tag)` can coexist with plugin-rewritten selects. */\nfunction groupBySelect(select: string): ParsedGroupBy {\n const expression = stripSelectAlias(select);\n if (expression.endsWith(\".*\")) {\n return { alias: parseAlias(expression), column: \"id\" };\n }\n return { expression };\n}\n\n/** Removes a trailing SQL alias from a select expression, i.e. `(a.id) as id` -> `(a.id)`. */\nfunction stripSelectAlias(select: string): string {\n const match = /^(.*)\\s+as\\s+[^\\s]+$/i.exec(select);\n return match?.[1] ?? select;\n}\n\n/** Returns true when an expression is functionally covered by an already-grouped whole-row alias. */\nfunction isCoveredByWholeRowGroupBy(select: string, wholeRowAliases: Set<string>): boolean {\n const expression = stripSelectAlias(select);\n if (expression.endsWith(\".*\")) {\n return false;\n }\n const aliases = findSelectedAliases(expression);\n return aliases.length > 0 && aliases.every((alias) => wholeRowAliases.has(alias));\n}\n\n/** Finds SQL aliases referenced as `alias.column` or `\"alias\".column`, i.e. `a.first_name` -> `a`. */\nfunction findSelectedAliases(expression: string): string[] {\n const aliases = new Set<string>();\n for (const match of expression.matchAll(/(?:\"([^\"]+)\"|([a-zA-Z_][\\w]*))\\./g)) {\n aliases.add(match[1] ?? match[2]);\n }\n return [...aliases];\n}\n\n/** Returns [operator, argsTaken, negate], i.e. `[\"=\", 1, false]`. */\nfunction makeOp(cond: ParsedValueFilter<any>, argsIndex: ArgCounter): [string, boolean] {\n switch (cond.kind) {\n case \"eq\":\n case \"ne\":\n case \"gte\":\n case \"gt\":\n case \"lte\":\n case \"lt\":\n case \"like\":\n case \"nlike\":\n case \"ilike\":\n case \"nilike\":\n case \"regex\":\n case \"nregex\":\n case \"iregex\":\n case \"niregex\":\n case \"jsonPathExists\":\n case \"jsonPathPredicate\":\n case \"contains\":\n case \"overlaps\":\n case \"containedBy\": {\n const fn = opToFn[cond.kind] ?? fail(`Invalid operator ${cond.kind}`);\n return [`${fn} _find.arg${argsIndex.next()}`, false];\n }\n case \"noverlaps\":\n case \"ncontains\": {\n const fn = (opToFn as any)[cond.kind.substring(1)] ?? fail(`Invalid operator ${cond.kind}`);\n return [`${fn} _find.arg${argsIndex.next()}`, true];\n }\n case \"is-null\":\n return [`IS NULL`, false];\n case \"not-null\":\n return [`IS NOT NULL`, false];\n case \"in\":\n return [`= ANY(_find.arg${argsIndex.next()})`, false];\n case \"nin\":\n return [`!= ALL(_find.arg${argsIndex.next()})`, false];\n case \"between\":\n return [`BETWEEN _find.arg${argsIndex.next()} AND _find.arg${argsIndex.next()}`, false];\n default:\n assertNever(cond);\n }\n}\n\n/**\n * Creates a `VALUES (...), (...)` SQL string for use in a CTE, typically for our\n * batch INSERTs/UPDATEs where the CTE is how we inject N rows of data/params into\n * the single INSERT/UPDATE statement.\n *\n * The caller is responsible for filling in the `bindings`, which should have 1\n * entry for each `rows x columns` cell.\n *\n * @deprecated Use newUnnestCte instead because it uses arrays to have a bounded number of parameters.\n */\nexport function buildValuesCte(\n alias: string,\n columns: { columnName: string; dbType: string }[],\n rows: readonly any[],\n // Should have a value for each `row x column` cell.\n bindings: readonly any[],\n): ParsedCteClause {\n return {\n alias,\n columns,\n query: {\n kind: \"raw\",\n sql: `VALUES\n ${rows.map((_, i) => `(${columns.map((c) => (i === 0 ? `?::${c.dbType}` : `?`)).join(\", \")})`).join(\", \")}\n `,\n bindings,\n },\n };\n}\n\n/** Returns, per binding slot, whether every batched query shares the same value. */\nfunction computeConstantBindings(entries: readonly { bindings: any[] }[]): boolean[] {\n const length = entries[0].bindings.length;\n const constant = new Array<boolean>(length);\n for (let j = 0; j < length; j++) {\n const first = entries[0].bindings[j];\n let same = true;\n for (let i = 1; i < entries.length; i++) {\n if (!argsEqual(entries[i].bindings[j], first)) {\n same = false;\n break;\n }\n }\n constant[j] = same;\n }\n return constant;\n}\n\n/**\n * Deep-equals two find-arg values (scalars, Dates, Temporals, or arrays thereof), reusing the same\n * scalar/array equality `setField` uses for change detection.\n *\n * Only used to decide whether a condition can be inlined, so false negatives are safe (we just fall\n * back to the CTE); we only return true when the values are genuinely equal.\n */\nfunction argsEqual(a: any, b: any): boolean {\n return equal(a, b) || (Array.isArray(a) && Array.isArray(b) && equalArrays(a, b));\n}\n\nexport function getBatchKeyFromGenericStructure(meta: EntityMetadata, query: ParsedFindQuery): string {\n // Temporarily swap condition values for `*` so we can see the generic structure of the query,\n // then restore them; this avoids deep-cloning the entire parsed query on every em.find call.\n // Track values per condition object b/c parseFindQuery does not deep copy complex conditions,\n // i.e. `a.firstName.eq(...)`, so the same condition instance could appear twice.\n const saved = new Map<any, any>();\n visitConditions(query, {\n visitCond(c: ColumnCondition) {\n const { cond } = c;\n if (\"value\" in cond && !saved.has(cond)) {\n saved.set(cond, cond.value);\n cond.value = \"*\";\n }\n },\n });\n const structure = JSON.stringify(query);\n for (const [cond, value] of saved) cond.value = value;\n // Include the meta b/c STI queries for different subtypes will look identical\n return meta.stiDiscriminatorValue ? `${structure}|${meta.type}` : structure;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ParsedCteClause, ParsedFindQuery } from "../queries/find/QueryParser.cjs";
2
2
  import { FilterAndSettings } from "../queries/find/EntityFilter.cjs";
3
- import { LoadHint } from "../loadHints.cjs";
3
+ import { LoadHint } from "../loading/loadHints.cjs";
4
4
  import { OpColumn } from "../drivers/EntityWriter.cjs";
5
5
  import { EntityMetadata } from "../EntityMetadata.cjs";
6
6
  import { EntityManager, MaybeAbstractEntityConstructor } from "../EntityManager.cjs";
@@ -1,6 +1,6 @@
1
1
  import { ParsedCteClause, ParsedFindQuery } from "../queries/find/QueryParser.mjs";
2
2
  import { FilterAndSettings } from "../queries/find/EntityFilter.mjs";
3
- import { LoadHint } from "../loadHints.mjs";
3
+ import { LoadHint } from "../loading/loadHints.mjs";
4
4
  import { OpColumn } from "../drivers/EntityWriter.mjs";
5
5
  import { EntityMetadata } from "../EntityMetadata.mjs";
6
6
  import { EntityManager, MaybeAbstractEntityConstructor } from "../EntityManager.mjs";
@@ -1,14 +1,14 @@
1
+ import { hintKey } from "../normalizeHints.js";
1
2
  import { equal, equalArrays } from "../fields.js";
2
3
  import { kqDot } from "../queries/sql/keywords.js";
3
4
  import { visitConditions } from "../queries/find/QueryVisitor.js";
4
5
  import { getTables, parseAlias, parseFindQuery } from "../queries/find/QueryParser.js";
5
- import { hintKey } from "../normalizeHints.js";
6
6
  import { assertNever, fail } from "../utils.js";
7
7
  import { getMetadata } from "../EntityMetadata.js";
8
8
  import { opToFn } from "../queries/find/EntityGraphQLFilter.js";
9
- import { buildHintTree } from "../HintTree.js";
10
- import { buildUnnestCte } from "../unnest.js";
11
9
  import { fastWhereFilterHash } from "./fastWhereFilterHash.js";
10
+ import { buildHintTree } from "../loading/HintTree.js";
11
+ import { buildUnnestCte } from "../queries/unnest.js";
12
12
  import { getEmInternalApi } from "../EntityManager.js";
13
13
  //#region src/dataloaders/findDataLoader.ts
14
14
  const findOperation = "find";