@rocicorp/zero 1.10.0-canary.24 → 1.10.0-canary.26

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 (568) hide show
  1. package/out/analyze-query/src/bin-analyze.js +8 -9
  2. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  3. package/out/replicache/src/btree/node.d.ts.map +1 -1
  4. package/out/replicache/src/btree/node.js +6 -3
  5. package/out/replicache/src/btree/node.js.map +1 -1
  6. package/out/replicache/src/btree/read.d.ts +1 -12
  7. package/out/replicache/src/btree/read.d.ts.map +1 -1
  8. package/out/replicache/src/btree/read.js +12 -24
  9. package/out/replicache/src/btree/read.js.map +1 -1
  10. package/out/replicache/src/dag/gc.d.ts.map +1 -1
  11. package/out/replicache/src/dag/gc.js +11 -8
  12. package/out/replicache/src/dag/gc.js.map +1 -1
  13. package/out/replicache/src/dag/store-impl.d.ts +2 -12
  14. package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
  15. package/out/replicache/src/dag/store-impl.js +8 -22
  16. package/out/replicache/src/dag/store-impl.js.map +1 -1
  17. package/out/replicache/src/db/rebase.d.ts +2 -14
  18. package/out/replicache/src/db/rebase.d.ts.map +1 -1
  19. package/out/replicache/src/db/rebase.js +5 -27
  20. package/out/replicache/src/db/rebase.js.map +1 -1
  21. package/out/replicache/src/db/write.js.map +1 -1
  22. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  23. package/out/replicache/src/kv/expo-sqlite/store.js +5 -28
  24. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  25. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +5 -15
  26. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +1 -1
  27. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +25 -25
  28. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -1
  29. package/out/replicache/src/kv/idb-store.d.ts +0 -9
  30. package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
  31. package/out/replicache/src/kv/idb-store.js +2 -14
  32. package/out/replicache/src/kv/idb-store.js.map +1 -1
  33. package/out/replicache/src/kv/mem-store.d.ts +0 -1
  34. package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
  35. package/out/replicache/src/kv/mem-store.js +0 -3
  36. package/out/replicache/src/kv/mem-store.js.map +1 -1
  37. package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
  38. package/out/replicache/src/kv/op-sqlite/store.js +1 -1
  39. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  40. package/out/replicache/src/kv/sqlite-store.d.ts +1 -13
  41. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  42. package/out/replicache/src/kv/sqlite-store.js +6 -73
  43. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  44. package/out/replicache/src/kv/store.d.ts +0 -6
  45. package/out/replicache/src/kv/store.d.ts.map +1 -1
  46. package/out/replicache/src/persist/collect-idb-databases.d.ts +5 -10
  47. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  48. package/out/replicache/src/persist/collect-idb-databases.js +9 -16
  49. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  50. package/out/replicache/src/persist/persist.d.ts.map +1 -1
  51. package/out/replicache/src/persist/persist.js +6 -13
  52. package/out/replicache/src/persist/persist.js.map +1 -1
  53. package/out/replicache/src/persist/refresh.js +2 -6
  54. package/out/replicache/src/persist/refresh.js.map +1 -1
  55. package/out/replicache/src/replicache-impl.d.ts +3 -14
  56. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  57. package/out/replicache/src/replicache-impl.js +11 -118
  58. package/out/replicache/src/replicache-impl.js.map +1 -1
  59. package/out/replicache/src/replicache-options.d.ts +0 -9
  60. package/out/replicache/src/replicache-options.d.ts.map +1 -1
  61. package/out/replicache/src/transactions.d.ts.map +1 -1
  62. package/out/replicache/src/transactions.js +1 -1
  63. package/out/replicache/src/transactions.js.map +1 -1
  64. package/out/shared/src/arrays.d.ts +0 -5
  65. package/out/shared/src/arrays.d.ts.map +1 -1
  66. package/out/shared/src/arrays.js +24 -8
  67. package/out/shared/src/arrays.js.map +1 -1
  68. package/out/shared/src/base64.d.ts +19 -0
  69. package/out/shared/src/base64.d.ts.map +1 -0
  70. package/out/shared/src/base64.js +40 -0
  71. package/out/shared/src/base64.js.map +1 -0
  72. package/out/shared/src/error.d.ts +0 -11
  73. package/out/shared/src/error.d.ts.map +1 -1
  74. package/out/shared/src/error.js +1 -35
  75. package/out/shared/src/error.js.map +1 -1
  76. package/out/shared/src/hash.d.ts +0 -1
  77. package/out/shared/src/hash.d.ts.map +1 -1
  78. package/out/shared/src/hash.js +10 -87
  79. package/out/shared/src/hash.js.map +1 -1
  80. package/out/shared/src/iterables.d.ts +0 -2
  81. package/out/shared/src/iterables.d.ts.map +1 -1
  82. package/out/shared/src/iterables.js +1 -18
  83. package/out/shared/src/iterables.js.map +1 -1
  84. package/out/shared/src/json.d.ts.map +1 -1
  85. package/out/shared/src/json.js +2 -2
  86. package/out/shared/src/json.js.map +1 -1
  87. package/out/shared/src/map.d.ts +2 -24
  88. package/out/shared/src/map.d.ts.map +1 -1
  89. package/out/shared/src/map.js +4 -18
  90. package/out/shared/src/map.js.map +1 -1
  91. package/out/shared/src/ring-buffer.d.ts +0 -8
  92. package/out/shared/src/ring-buffer.d.ts.map +1 -1
  93. package/out/shared/src/ring-buffer.js +1 -22
  94. package/out/shared/src/ring-buffer.js.map +1 -1
  95. package/out/z2s/src/sql.d.ts.map +1 -1
  96. package/out/z2s/src/sql.js +2 -2
  97. package/out/z2s/src/sql.js.map +1 -1
  98. package/out/zero/package.js +3 -2
  99. package/out/zero/package.js.map +1 -1
  100. package/out/zero-cache/src/auth/read-authorizer.js +1 -1
  101. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  102. package/out/zero-cache/src/auth/write-authorizer.js +0 -1
  103. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  104. package/out/zero-cache/src/config/zero-config.d.ts +2 -42
  105. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  106. package/out/zero-cache/src/config/zero-config.js +28 -149
  107. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  108. package/out/zero-cache/src/custom-queries/transform-query.js +1 -1
  109. package/out/zero-cache/src/db/create.d.ts.map +1 -1
  110. package/out/zero-cache/src/db/create.js +1 -4
  111. package/out/zero-cache/src/db/create.js.map +1 -1
  112. package/out/zero-cache/src/db/lite-tables.d.ts +2 -10
  113. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  114. package/out/zero-cache/src/db/lite-tables.js +6 -10
  115. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  116. package/out/zero-cache/src/db/specs.d.ts +0 -41
  117. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  118. package/out/zero-cache/src/db/specs.js +3 -30
  119. package/out/zero-cache/src/db/specs.js.map +1 -1
  120. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  121. package/out/zero-cache/src/observability/metrics.js +7 -2
  122. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  123. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  124. package/out/zero-cache/src/server/change-streamer.js +4 -13
  125. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  126. package/out/zero-cache/src/server/inspector-delegate.d.ts +2 -18
  127. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  128. package/out/zero-cache/src/server/inspector-delegate.js +17 -25
  129. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  130. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  131. package/out/zero-cache/src/server/main.js +1 -8
  132. package/out/zero-cache/src/server/main.js.map +1 -1
  133. package/out/zero-cache/src/server/mutator.js +0 -2
  134. package/out/zero-cache/src/server/mutator.js.map +1 -1
  135. package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
  136. package/out/zero-cache/src/server/reaper.js +0 -2
  137. package/out/zero-cache/src/server/reaper.js.map +1 -1
  138. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  139. package/out/zero-cache/src/server/replicator.js +2 -8
  140. package/out/zero-cache/src/server/replicator.js.map +1 -1
  141. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  142. package/out/zero-cache/src/server/runner/zero-dispatcher.js +0 -3
  143. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  144. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  145. package/out/zero-cache/src/server/syncer.js +1 -5
  146. package/out/zero-cache/src/server/syncer.js.map +1 -1
  147. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  148. package/out/zero-cache/src/services/analyze.js +9 -11
  149. package/out/zero-cache/src/services/analyze.js.map +1 -1
  150. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
  151. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +1 -14
  152. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  153. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +1 -1
  154. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +3 -15
  155. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  156. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +1 -11
  157. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  158. package/out/zero-cache/src/services/change-source/pg/change-source.js +2 -21
  159. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  160. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +0 -1
  161. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  162. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +7 -8
  163. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  164. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +229 -1513
  165. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  166. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +2 -2
  167. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  168. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +1 -1
  169. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  170. package/out/zero-cache/src/services/change-source/pg/schema/init.js +6 -15
  171. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  172. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +20 -137
  173. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
  174. package/out/zero-cache/src/services/change-source/pg/schema/published.js +13 -82
  175. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  176. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +21 -128
  177. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  178. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +5 -5
  179. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  180. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +0 -2
  181. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  182. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +0 -3
  183. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  184. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +0 -3
  185. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  186. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +1 -3
  187. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  188. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +0 -1
  189. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  190. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  191. package/out/zero-cache/src/services/litestream/commands.js +3 -8
  192. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  193. package/out/zero-cache/src/services/litestream/config-v5.yml +1 -15
  194. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +0 -5
  195. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  196. package/out/zero-cache/src/services/mutagen/mutagen.js +1 -7
  197. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  198. package/out/zero-cache/src/services/mutagen/pusher.d.ts +119 -119
  199. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  200. package/out/zero-cache/src/services/mutagen/pusher.js +6 -5
  201. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  202. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  203. package/out/zero-cache/src/services/replicator/change-processor.js +16 -16
  204. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  205. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  206. package/out/zero-cache/src/services/replicator/incremental-sync.js +0 -1
  207. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  208. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +2 -27
  209. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
  210. package/out/zero-cache/src/services/replicator/write-worker-client.js +2 -3
  211. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  212. package/out/zero-cache/src/services/replicator/write-worker.js +5 -24
  213. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  214. package/out/zero-cache/src/services/run-ast.d.ts +0 -12
  215. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  216. package/out/zero-cache/src/services/run-ast.js +15 -27
  217. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  218. package/out/zero-cache/src/services/runner.d.ts.map +1 -1
  219. package/out/zero-cache/src/services/runner.js +1 -1
  220. package/out/zero-cache/src/services/runner.js.map +1 -1
  221. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +0 -45
  222. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  223. package/out/zero-cache/src/services/view-syncer/cvr.js +1 -133
  224. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  225. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +1 -14
  226. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
  227. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +4 -30
  228. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  229. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +1 -1
  230. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
  231. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +2 -2
  232. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  233. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +1 -2
  234. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  235. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +27 -48
  236. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  237. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
  238. package/out/zero-cache/src/services/view-syncer/query-covering.js +6 -2
  239. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  240. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +4 -42
  241. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  242. package/out/zero-cache/src/services/view-syncer/snapshotter.js +28 -117
  243. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  244. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +1 -11
  245. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  246. package/out/zero-cache/src/services/view-syncer/view-syncer.js +95 -466
  247. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  248. package/out/zero-cache/src/types/processes.d.ts +0 -32
  249. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  250. package/out/zero-cache/src/types/processes.js +4 -43
  251. package/out/zero-cache/src/types/processes.js.map +1 -1
  252. package/out/zero-cache/src/types/profiler.d.ts +0 -12
  253. package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
  254. package/out/zero-cache/src/types/profiler.js +1 -46
  255. package/out/zero-cache/src/types/profiler.js.map +1 -1
  256. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  257. package/out/zero-cache/src/types/row-key.js +5 -5
  258. package/out/zero-cache/src/types/row-key.js.map +1 -1
  259. package/out/zero-cache/src/workers/connect-params.d.ts +7 -0
  260. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  261. package/out/zero-cache/src/workers/connect-params.js +20 -1
  262. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  263. package/out/zero-cache/src/workers/connection.d.ts +4 -4
  264. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  265. package/out/zero-cache/src/workers/connection.js +8 -8
  266. package/out/zero-cache/src/workers/connection.js.map +1 -1
  267. package/out/zero-cache/src/workers/replicator.d.ts +0 -1
  268. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  269. package/out/zero-cache/src/workers/replicator.js +2 -4
  270. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  271. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  272. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +16 -21
  273. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  274. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  275. package/out/zero-cache/src/workers/syncer.js +1 -10
  276. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  277. package/out/zero-client/src/client/connection-manager.d.ts +0 -20
  278. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  279. package/out/zero-client/src/client/connection-manager.js +13 -77
  280. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  281. package/out/zero-client/src/client/connection-status-enum.d.ts +0 -2
  282. package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
  283. package/out/zero-client/src/client/connection-status-enum.js +1 -3
  284. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  285. package/out/zero-client/src/client/connection.d.ts +0 -6
  286. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  287. package/out/zero-client/src/client/connection.js +1 -2
  288. package/out/zero-client/src/client/connection.js.map +1 -1
  289. package/out/zero-client/src/client/context.d.ts +2 -27
  290. package/out/zero-client/src/client/context.d.ts.map +1 -1
  291. package/out/zero-client/src/client/context.js +1 -112
  292. package/out/zero-client/src/client/context.js.map +1 -1
  293. package/out/zero-client/src/client/custom.js +2 -2
  294. package/out/zero-client/src/client/custom.js.map +1 -1
  295. package/out/zero-client/src/client/error.js +1 -1
  296. package/out/zero-client/src/client/inspector/lazy-inspector.js +2 -2
  297. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  298. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  299. package/out/zero-client/src/client/ivm-branch.js +3 -20
  300. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  301. package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
  302. package/out/zero-client/src/client/mutation-tracker.js +1 -1
  303. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  304. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  305. package/out/zero-client/src/client/mutator-proxy.js +1 -2
  306. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  307. package/out/zero-client/src/client/options.d.ts +0 -3
  308. package/out/zero-client/src/client/options.d.ts.map +1 -1
  309. package/out/zero-client/src/client/options.js.map +1 -1
  310. package/out/zero-client/src/client/query-manager.d.ts +0 -2
  311. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  312. package/out/zero-client/src/client/query-manager.js +14 -50
  313. package/out/zero-client/src/client/query-manager.js.map +1 -1
  314. package/out/zero-client/src/client/version.js +1 -1
  315. package/out/zero-client/src/client/zero-rep.d.ts +0 -1
  316. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  317. package/out/zero-client/src/client/zero-rep.js +6 -9
  318. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  319. package/out/zero-client/src/client/zero.d.ts +3 -18
  320. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  321. package/out/zero-client/src/client/zero.js +36 -123
  322. package/out/zero-client/src/client/zero.js.map +1 -1
  323. package/out/zero-client/src/types/query-result.d.ts +0 -2
  324. package/out/zero-client/src/types/query-result.d.ts.map +1 -1
  325. package/out/zero-protocol/src/analyze-query-result.d.ts +5 -5
  326. package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -1
  327. package/out/zero-protocol/src/analyze-query-result.js +1 -1
  328. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  329. package/out/zero-protocol/src/ast.d.ts +1 -64
  330. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  331. package/out/zero-protocol/src/ast.js +54 -225
  332. package/out/zero-protocol/src/ast.js.map +1 -1
  333. package/out/zero-protocol/src/connect.d.ts +13 -0
  334. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  335. package/out/zero-protocol/src/connect.js +30 -1
  336. package/out/zero-protocol/src/connect.js.map +1 -1
  337. package/out/zero-protocol/src/down.d.ts +2 -2
  338. package/out/zero-protocol/src/error.d.ts +1 -1
  339. package/out/zero-protocol/src/inspect-down.d.ts +6 -6
  340. package/out/zero-protocol/src/poke.d.ts +11 -4
  341. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  342. package/out/zero-protocol/src/poke.js +3 -2
  343. package/out/zero-protocol/src/poke.js.map +1 -1
  344. package/out/zero-protocol/src/protocol-flag-enum.d.ts +7 -0
  345. package/out/zero-protocol/src/protocol-flag-enum.d.ts.map +1 -0
  346. package/out/zero-protocol/src/protocol-flag-enum.js +7 -0
  347. package/out/zero-protocol/src/protocol-flag-enum.js.map +1 -0
  348. package/out/zero-protocol/src/protocol-flag.d.ts +14 -0
  349. package/out/zero-protocol/src/protocol-flag.d.ts.map +1 -0
  350. package/out/zero-protocol/src/protocol-flag.js +8 -0
  351. package/out/zero-protocol/src/protocol-flag.js.map +1 -0
  352. package/out/zero-protocol/src/protocol-version.d.ts +30 -6
  353. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  354. package/out/zero-protocol/src/protocol-version.js +1 -1
  355. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  356. package/out/zero-protocol/src/query-hash.d.ts +2 -7
  357. package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
  358. package/out/zero-protocol/src/query-hash.js +10 -10
  359. package/out/zero-protocol/src/query-hash.js.map +1 -1
  360. package/out/zero-react/src/use-query.d.ts +4 -5
  361. package/out/zero-react/src/use-query.d.ts.map +1 -1
  362. package/out/zero-react/src/use-query.js +9 -86
  363. package/out/zero-react/src/use-query.js.map +1 -1
  364. package/out/zero-solid/src/solid-view.d.ts +0 -17
  365. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  366. package/out/zero-solid/src/solid-view.js +1 -39
  367. package/out/zero-solid/src/solid-view.js.map +1 -1
  368. package/out/zero-solid/src/use-query.js +3 -5
  369. package/out/zero-solid/src/use-query.js.map +1 -1
  370. package/out/zql/src/builder/builder.d.ts +0 -19
  371. package/out/zql/src/builder/builder.d.ts.map +1 -1
  372. package/out/zql/src/builder/builder.js +11 -28
  373. package/out/zql/src/builder/builder.js.map +1 -1
  374. package/out/zql/src/builder/debug-delegate.d.ts +1 -6
  375. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  376. package/out/zql/src/builder/debug-delegate.js +2 -14
  377. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  378. package/out/zql/src/ivm/array-view.d.ts +0 -29
  379. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  380. package/out/zql/src/ivm/array-view.js +12 -63
  381. package/out/zql/src/ivm/array-view.js.map +1 -1
  382. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  383. package/out/zql/src/ivm/cap.js +3 -5
  384. package/out/zql/src/ivm/cap.js.map +1 -1
  385. package/out/zql/src/ivm/data.d.ts.map +1 -1
  386. package/out/zql/src/ivm/data.js +3 -8
  387. package/out/zql/src/ivm/data.js.map +1 -1
  388. package/out/zql/src/ivm/exists.d.ts +1 -1
  389. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  390. package/out/zql/src/ivm/exists.js.map +1 -1
  391. package/out/zql/src/ivm/fan-in.d.ts +2 -2
  392. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  393. package/out/zql/src/ivm/fan-in.js +5 -6
  394. package/out/zql/src/ivm/fan-in.js.map +1 -1
  395. package/out/zql/src/ivm/fan-out.d.ts +2 -2
  396. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  397. package/out/zql/src/ivm/fan-out.js.map +1 -1
  398. package/out/zql/src/ivm/filter-operators.d.ts +6 -7
  399. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  400. package/out/zql/src/ivm/filter-operators.js +12 -29
  401. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  402. package/out/zql/src/ivm/filter.d.ts +2 -2
  403. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  404. package/out/zql/src/ivm/filter.js +4 -7
  405. package/out/zql/src/ivm/filter.js.map +1 -1
  406. package/out/zql/src/ivm/flipped-join.js +2 -2
  407. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  408. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  409. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  410. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +4 -6
  411. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  412. package/out/zql/src/ivm/memory-source.d.ts +3 -15
  413. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  414. package/out/zql/src/ivm/memory-source.js +23 -57
  415. package/out/zql/src/ivm/memory-source.js.map +1 -1
  416. package/out/zql/src/ivm/operator.d.ts +0 -40
  417. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  418. package/out/zql/src/ivm/operator.js.map +1 -1
  419. package/out/zql/src/ivm/take.d.ts.map +1 -1
  420. package/out/zql/src/ivm/take.js +4 -3
  421. package/out/zql/src/ivm/take.js.map +1 -1
  422. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  423. package/out/zql/src/ivm/union-fan-in.js +7 -9
  424. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  425. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  426. package/out/zql/src/ivm/view-apply-change.js +4 -9
  427. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  428. package/out/zql/src/ivm/view.d.ts +0 -15
  429. package/out/zql/src/ivm/view.d.ts.map +1 -1
  430. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  431. package/out/zql/src/mutate/mutator-registry.js +2 -2
  432. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  433. package/out/zql/src/planner/planner-builder.d.ts +3 -12
  434. package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
  435. package/out/zql/src/planner/planner-builder.js +20 -40
  436. package/out/zql/src/planner/planner-builder.js.map +1 -1
  437. package/out/zql/src/planner/planner-connection.d.ts +2 -28
  438. package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
  439. package/out/zql/src/planner/planner-connection.js +8 -108
  440. package/out/zql/src/planner/planner-connection.js.map +1 -1
  441. package/out/zql/src/planner/planner-debug.d.ts +1 -1
  442. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  443. package/out/zql/src/planner/planner-debug.js +8 -3
  444. package/out/zql/src/planner/planner-debug.js.map +1 -1
  445. package/out/zql/src/planner/planner-fan-out.d.ts +0 -1
  446. package/out/zql/src/planner/planner-fan-out.d.ts.map +1 -1
  447. package/out/zql/src/planner/planner-fan-out.js +0 -3
  448. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  449. package/out/zql/src/planner/planner-graph.d.ts +0 -2
  450. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  451. package/out/zql/src/planner/planner-graph.js +0 -2
  452. package/out/zql/src/planner/planner-graph.js.map +1 -1
  453. package/out/zql/src/planner/planner-join.d.ts +0 -2
  454. package/out/zql/src/planner/planner-join.d.ts.map +1 -1
  455. package/out/zql/src/planner/planner-join.js +0 -7
  456. package/out/zql/src/planner/planner-join.js.map +1 -1
  457. package/out/zql/src/planner/planner-node.d.ts +1 -2
  458. package/out/zql/src/planner/planner-node.d.ts.map +1 -1
  459. package/out/zql/src/planner/planner-node.js.map +1 -1
  460. package/out/zql/src/planner/planner-source.d.ts +2 -2
  461. package/out/zql/src/planner/planner-source.d.ts.map +1 -1
  462. package/out/zql/src/planner/planner-source.js +2 -2
  463. package/out/zql/src/planner/planner-source.js.map +1 -1
  464. package/out/zql/src/query/query-delegate-base.d.ts +1 -9
  465. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  466. package/out/zql/src/query/query-delegate-base.js +36 -132
  467. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  468. package/out/zql/src/query/query-delegate.d.ts +1 -50
  469. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  470. package/out/zql/src/query/query-impl.d.ts +14 -25
  471. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  472. package/out/zql/src/query/query-impl.js +94 -397
  473. package/out/zql/src/query/query-impl.js.map +1 -1
  474. package/out/zql/src/query/query-internals.d.ts +11 -21
  475. package/out/zql/src/query/query-internals.d.ts.map +1 -1
  476. package/out/zql/src/query/query-internals.js.map +1 -1
  477. package/out/zql/src/query/query.d.ts +2 -11
  478. package/out/zql/src/query/query.d.ts.map +1 -1
  479. package/out/zql/src/query/runnable-query-impl.d.ts +2 -3
  480. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  481. package/out/zql/src/query/runnable-query-impl.js +2 -15
  482. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  483. package/out/zql/src/query/typed-view.d.ts +1 -1
  484. package/out/zql/src/query/typed-view.d.ts.map +1 -1
  485. package/out/zqlite/src/db.d.ts +1 -9
  486. package/out/zqlite/src/db.d.ts.map +1 -1
  487. package/out/zqlite/src/db.js +2 -8
  488. package/out/zqlite/src/db.js.map +1 -1
  489. package/out/zqlite/src/query-builder.d.ts +1 -1
  490. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  491. package/out/zqlite/src/query-builder.js +2 -4
  492. package/out/zqlite/src/query-builder.js.map +1 -1
  493. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  494. package/out/zqlite/src/query-delegate.js +6 -5
  495. package/out/zqlite/src/query-delegate.js.map +1 -1
  496. package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
  497. package/out/zqlite/src/sqlite-cost-model.js +30 -2
  498. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  499. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
  500. package/out/zqlite/src/sqlite-stat-fanout.js +5 -4
  501. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  502. package/out/zqlite/src/table-source.d.ts +3 -16
  503. package/out/zqlite/src/table-source.d.ts.map +1 -1
  504. package/out/zqlite/src/table-source.js +14 -33
  505. package/out/zqlite/src/table-source.js.map +1 -1
  506. package/package.json +3 -2
  507. package/out/replicache/src/dag/invalid-ref-count-error.d.ts +0 -12
  508. package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +0 -1
  509. package/out/replicache/src/dag/invalid-ref-count-error.js +0 -19
  510. package/out/replicache/src/dag/invalid-ref-count-error.js.map +0 -1
  511. package/out/shared/src/xxhash32.d.ts +0 -36
  512. package/out/shared/src/xxhash32.d.ts.map +0 -1
  513. package/out/shared/src/xxhash32.js +0 -51
  514. package/out/shared/src/xxhash32.js.map +0 -1
  515. package/out/zero-cache/src/db/index-predicate.d.ts +0 -4
  516. package/out/zero-cache/src/db/index-predicate.d.ts.map +0 -1
  517. package/out/zero-cache/src/db/index-predicate.js +0 -46
  518. package/out/zero-cache/src/db/index-predicate.js.map +0 -1
  519. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts +0 -19
  520. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +0 -1
  521. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +0 -581
  522. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +0 -1
  523. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +0 -131
  524. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +0 -1
  525. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +0 -70
  526. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +0 -1
  527. package/out/zero-cache/src/services/litestream/litestream-controller.js +0 -101
  528. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +0 -1
  529. package/out/zero-cache/src/services/profz.d.ts +0 -7
  530. package/out/zero-cache/src/services/profz.d.ts.map +0 -1
  531. package/out/zero-cache/src/services/profz.js +0 -103
  532. package/out/zero-cache/src/services/profz.js.map +0 -1
  533. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +0 -33
  534. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +0 -1
  535. package/out/zero-cache/src/services/view-syncer/hydration-budget.js +0 -62
  536. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +0 -1
  537. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +0 -51
  538. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +0 -1
  539. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +0 -78
  540. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +0 -1
  541. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +0 -95
  542. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +0 -1
  543. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +0 -155
  544. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +0 -1
  545. package/out/zero-protocol/src/query-hash-visitor.d.ts +0 -81
  546. package/out/zero-protocol/src/query-hash-visitor.d.ts.map +0 -1
  547. package/out/zero-protocol/src/query-hash-visitor.js +0 -324
  548. package/out/zero-protocol/src/query-hash-visitor.js.map +0 -1
  549. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +0 -43
  550. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +0 -1
  551. package/out/zql/src/builder/correlated-predicate-pushdown.js +0 -161
  552. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +0 -1
  553. package/out/zql/src/ivm/connection-index.d.ts +0 -68
  554. package/out/zql/src/ivm/connection-index.d.ts.map +0 -1
  555. package/out/zql/src/ivm/connection-index.js +0 -149
  556. package/out/zql/src/ivm/connection-index.js.map +0 -1
  557. package/out/zql/src/ivm/deferred-input.d.ts +0 -44
  558. package/out/zql/src/ivm/deferred-input.d.ts.map +0 -1
  559. package/out/zql/src/ivm/deferred-input.js +0 -89
  560. package/out/zql/src/ivm/deferred-input.js.map +0 -1
  561. package/out/zql/src/planner/planner-filter.d.ts +0 -59
  562. package/out/zql/src/planner/planner-filter.d.ts.map +0 -1
  563. package/out/zql/src/planner/planner-filter.js +0 -116
  564. package/out/zql/src/planner/planner-filter.js.map +0 -1
  565. package/out/zql/src/query/query-transitions.d.ts +0 -171
  566. package/out/zql/src/query/query-transitions.d.ts.map +0 -1
  567. package/out/zql/src/query/query-transitions.js +0 -204
  568. package/out/zql/src/query/query-transitions.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"query-impl.js","names":["#schema","#tableName","#ast","#system","#currentJunction","#newQuery","#transitions","#record","#parent","#derive","#hash","#canonicalize","#byHash","#sameAs","#deriveBounded","#expressionBuilder","#exists"],"sources":["../../../../../zql/src/query/query-impl.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\nimport {assert} from '../../../shared/src/asserts.ts';\nimport {\n deepEqual,\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n} from '../../../shared/src/json.ts';\nimport {getOrInsertComputed, newMap} from '../../../shared/src/map.ts';\nimport {\n type AST,\n type CompoundKey,\n type Condition,\n type NormalizedAST,\n type Parameter,\n type LiteralValue,\n type SimpleCondition,\n type SimpleOperator,\n type System,\n insertRelated,\n normalizeAST,\n normalizeCondition,\n normalizedRelated,\n SUBQ_PREFIX,\n tableAST,\n} from '../../../zero-protocol/src/ast.ts';\nimport {hashOfQueryInternals} from '../../../zero-protocol/src/query-hash-visitor.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {NotImplementedError} from '../error.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport {\n type ExpressionFactory,\n ExpressionBuilder,\n and,\n cmp,\n simplifyCondition,\n} from './expression.ts';\nimport type {CustomQueryID} from './named.ts';\nimport {type QueryInternals, queryInternalsTag} from './query-internals.ts';\nimport {\n HashIndex,\n Transitions,\n type Delta,\n type TransitionValue,\n} from './query-transitions.ts';\nimport type {\n AnyQuery,\n ExistsOptions,\n GetFilterType,\n HumanReadable,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\ntype GetFilterTypeAny = GetFilterType<any, any, any>;\n\ntype NewQueryFunction<TSchema extends Schema> = <\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n>(\n this: unknown,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n) => QueryImpl<TTable, TSchema, TReturn>;\n\nexport function newQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(schema: TSchema, table: TTable): Query<TTable, TSchema> {\n return newQueryInternal(\n schema,\n table,\n tableAST(table),\n defaultFormat,\n 'client',\n );\n}\n\nexport function newQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System,\n): QueryImpl<TTable, TSchema, TReturn> {\n // This is the entry point for ASTs that were not built by QueryImpl, so\n // normalize it here to establish the invariant that #ast is normalized.\n return newQueryInternal(schema, tableName, normalizeAST(ast), format, system);\n}\n\n/**\n * Root queries are interned per schema so that two `createBuilder(schema)` calls\n * hand out the same starting point, and therefore share the whole transition\n * tree below it. Only cleared entries accumulate here, at most one per\n * system/table pair, so no sweeping is needed.\n */\nconst rootsBySchema = new WeakMap<\n Schema,\n Map<string, WeakRef<QueryImpl<any, any, any>>>\n>();\n\n/**\n * Whether this is the AST `tableAST(tableName)` produces -- the whole table,\n * nothing else. A normalized AST carries every field, so this cannot be a key\n * count; each one has to be checked.\n */\nfunction isRootAST(ast: NormalizedAST, tableName: string): boolean {\n return (\n ast.table === tableName &&\n ast.schema === undefined &&\n ast.alias === undefined &&\n ast.where === undefined &&\n ast.related === undefined &&\n ast.start === undefined &&\n ast.limit === undefined &&\n ast.orderBy === undefined\n );\n}\n\nfunction newQueryInternal<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n system: System,\n): QueryImpl<TTable, TSchema, TReturn> {\n // Callers that hand in a pre-built AST -- benchmarks and the integration-test\n // harnesses -- are not roots and are not interned.\n const interned = format === defaultFormat && isRootAST(ast, tableName);\n const key = `${system}:${tableName}`;\n let roots: Map<string, WeakRef<QueryImpl<any, any, any>>> | undefined;\n\n if (interned) {\n roots = rootsBySchema.get(schema);\n const existing = roots?.get(key)?.deref();\n if (existing) {\n return existing as QueryImpl<TTable, TSchema, TReturn>;\n }\n }\n\n const inner: NewQueryFunction<TSchema> = (\n tableName,\n ast,\n format,\n customQueryID,\n currentJunction,\n ) =>\n new QueryImpl(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n inner,\n );\n\n const created = inner<TTable, TReturn>(\n tableName,\n ast,\n format,\n undefined,\n undefined,\n );\n\n if (interned) {\n if (!roots) {\n roots = new Map();\n rootsBySchema.set(schema, roots);\n }\n roots.set(key, new WeakRef(created));\n }\n\n return created;\n}\n\n/**\n * The AST of a QueryImpl is always normalized. Each step builds its AST in\n * normalized form rather than normalizing afterwards: a normalized AST has\n * every field, so spreading one and replacing a field keeps the field order\n * intact, and only the field a step actually changes needs normalizing (the\n * conditions of a `where`, the position of a new `related`). The ASTs that\n * come in from the outside are normalized by {@link newQueryImpl}, which is\n * what the `NormalizedAST` of the AST it holds stands for.\n */\nexport class QueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n implements\n Query<TTable, TSchema, TReturn>,\n QueryInternals<TTable, TSchema, TReturn>\n{\n readonly [queryInternalsTag] = true;\n\n readonly #schema: TSchema;\n readonly #tableName: TTable;\n readonly #ast: NormalizedAST;\n readonly format: Format;\n #hash: string = '';\n readonly #system: System;\n readonly #currentJunction: string | undefined;\n readonly customQueryID: CustomQueryID | undefined;\n readonly #newQuery: NewQueryFunction<TSchema>;\n\n /**\n * The query this one was derived from, held *strongly*, and the queries\n * derived from this one, held *weakly*. This is the arrangement V8 uses for\n * hidden-class transitions, and it is what makes interning stable: as long as\n * a query is reachable its whole ancestor spine is too, so re-deriving it from\n * the root yields the same instance. See `query-transitions.ts`.\n */\n #parent: QueryImpl<any, any, any> | undefined;\n #transitions: Transitions<QueryImpl<any, any, any>> | undefined;\n\n /**\n * The second level of interning, keyed by hash; see `HashIndex`. Set on the\n * root only, which is what scopes it to one schema and one delegate.\n */\n #byHash: HashIndex<QueryImpl<any, any, any>> | undefined;\n\n /**\n * Memoized because a query is interned: the same node serves every rebuild of\n * a chain, so building this once rather than per `where(fn)` call takes the\n * whole thing -- the builder and the bound `#exists` -- off the repeat path.\n */\n #expressionBuilder: ExpressionBuilder<TTable, TSchema> | undefined;\n\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n system: System,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n newQuery: NewQueryFunction<TSchema>,\n ) {\n this.#schema = schema;\n this.#tableName = tableName;\n this.#ast = ast;\n this.format = format;\n this.#system = system;\n this.#currentJunction = currentJunction;\n this.customQueryID = customQueryID;\n this.#newQuery = newQuery;\n }\n\n /**\n * Interns a transition whose key space is finite and schema-derived; see\n * {@linkcode Transitions.storeBounded}. Used for the base sub-query handed to\n * a `related`/`exists` callback, which is determined entirely by the\n * relationship name.\n */\n #deriveBounded<T>(key: string, build: () => T): T {\n const existing = this.#transitions?.lookupBounded(key);\n if (existing !== undefined) {\n return existing as T;\n }\n return this.#record(key, undefined, undefined, build(), true);\n }\n\n /**\n * Interns the result of applying a builder operation to this query.\n *\n * `key` names the operation and `value` carries its varying argument, kept\n * apart so the key stays a string V8 has already hashed. When the two do not\n * settle it, `delta` carries the rest and is compared with `deepEqual`. Only\n * the delta is compared, never the whole AST: this query is already canonical,\n * so two of its children are equal exactly when the operations that produced\n * them are.\n *\n * `T` is deliberately unconstrained so that the contextual return type at each\n * call site still drives `#newQuery`'s inference, exactly as it did when the\n * call sites returned `this.#newQuery(...)` directly.\n */\n #derive<T>(\n key: string,\n value: TransitionValue,\n delta: Delta,\n build: () => T,\n ): T {\n const existing = this.#transitions?.lookup(key, value, delta);\n if (existing !== undefined) {\n return existing as T;\n }\n return this.#record(key, value, delta, build(), false);\n }\n\n #record<T>(\n key: string,\n value: TransitionValue,\n delta: Delta,\n created: T,\n bounded: boolean,\n ): T {\n const q = created as unknown as QueryImpl<any, any, any>;\n q.#parent = this;\n const transitions = (this.#transitions ??= new Transitions());\n if (bounded) {\n transitions.storeBounded(key, q);\n } else {\n transitions.store(key, value, delta, q);\n }\n return created;\n }\n\n run(_options?: RunOptions): Promise<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n preload(_options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n cached: Promise<void>;\n } {\n throwQueryNotRunnable();\n }\n\n materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n materialize<T>(\n _factoryOrTTL?: ViewFactory<TTable, TSchema, TReturn, T> | TTL,\n _ttl?: TTL,\n ): T | TypedView<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn> {\n return this.#derive('nameAndArgs', name, args, () =>\n this.#newQuery(\n this.#tableName,\n this.#ast,\n this.format,\n {\n name,\n args,\n },\n this.#currentJunction,\n ),\n );\n }\n\n hash(): string {\n if (!this.#hash) {\n this.#hash = hashOfQueryInternals(\n this.#ast,\n this.format,\n this.#system,\n this.#currentJunction,\n this.customQueryID?.name,\n this.customQueryID?.args,\n );\n this.#canonicalize();\n }\n return this.#hash;\n }\n\n /**\n * Folds this query into its root's hash index, now that its hash is known.\n *\n * If an equal query is already indexed, the transition that produced this\n * one is re-pointed at it, so the next rebuild along this path yields that\n * instance rather than a second copy. This query itself is left alone: its\n * identity has already been handed out. Content is verified with `#sameAs`\n * before anything is redirected, so a hash collision costs nothing worse\n * than a missed unification.\n */\n #canonicalize(): void {\n const parent = this.#parent;\n if (parent === undefined) {\n // A root has no path to redirect and is its own canonical form.\n return;\n }\n let root = parent;\n while (root.#parent !== undefined) {\n root = root.#parent;\n }\n const index = (root.#byHash ??= new HashIndex());\n const existing = index.get(this.#hash);\n if (existing === undefined) {\n index.set(this.#hash, this);\n } else if (existing !== this && this.#sameAs(existing)) {\n parent.#transitions?.replace(this, existing);\n }\n }\n\n /**\n * Whether `other` is interchangeable with this query: everything `hash()`\n * covers, compared structurally. Schema and delegate are not compared. Both\n * are fixed by the root, and this only ever compares queries under one root.\n */\n #sameAs(other: QueryImpl<any, any, any>): boolean {\n return (\n this.#system === other.#system &&\n this.#currentJunction === other.#currentJunction &&\n this.customQueryID?.name === other.customQueryID?.name &&\n deepEqual(this.customQueryID?.args, other.customQueryID?.args) &&\n deepEqual(this.format, other.format) &&\n deepEqual(this.#ast, other.#ast)\n );\n }\n\n one(): Query<TTable, TSchema, TReturn | undefined> {\n return this.#derive('one', undefined, undefined, () =>\n this.#newQuery(\n this.#tableName,\n {...this.#ast, limit: 1},\n {\n ...this.format,\n singular: true,\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n whereExists(\n relationship: string,\n cbOrOptions?: ((q: AnyQuery) => AnyQuery) | ExistsOptions,\n options?: ExistsOptions,\n ): Query<TTable, TSchema, TReturn> {\n const cb = typeof cbOrOptions === 'function' ? cbOrOptions : undefined;\n const opts = typeof cbOrOptions === 'function' ? options : cbOrOptions;\n return this.where(({exists}) => exists(relationship, cb, opts)) as Query<\n TTable,\n TSchema,\n TReturn\n >;\n }\n\n related(\n relationship: string,\n cb?: (q: AnyQuery) => AnyQuery,\n ): Query<TTable, TSchema, any> {\n if (relationship.startsWith(SUBQ_PREFIX)) {\n throw new Error(\n `Relationship names may not start with \"${SUBQ_PREFIX}\". That is a reserved prefix.`,\n );\n }\n cb = cb ?? (q => q);\n\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n if (isOneHop(related)) {\n const {destSchema, destField, sourceField, cardinality} = related[0];\n // Intern the base handed to the callback too. A deterministic callback\n // then walks the same interned chain and hands back the *same* sub-query,\n // which makes the comparison below a pointer compare.\n const q: AnyQuery = this.#deriveBounded(\n `relatedBase:${relationship}`,\n () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, relationship),\n {\n relationships: {},\n singular: cardinality === 'one',\n },\n this.customQueryID,\n undefined,\n ),\n ) as AnyQuery;\n // Intentionally not setting to `one` as it is a perf degradation\n // and the user should not be making the mistake of setting cardinality to\n // `one` when it is actually not.\n // if (cardinality === 'one') {\n // q = q.one();\n // }\n const subQuery = asQueryImpl(cb(q));\n assert(\n isCompoundKey(sourceField),\n 'The source of a relationship must specify at last 1 field',\n );\n assert(\n isCompoundKey(destField),\n 'The destination of a relationship must specify at last 1 field',\n );\n assert(\n sourceField.length === destField.length,\n 'The source and destination of a relationship must have the same number of fields',\n );\n\n // Keyed by the sub-query's identity. Each query owns its AST object, so\n // this distinguishes even `q.one()` from `q.limit(1)`, whose ASTs are\n // structurally equal but whose formats differ. Comparing them as a delta\n // instead would put every sibling under one key and scan.\n return this.#derive(\n relatedKey(relationship),\n astID(subQuery.#ast),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: insertRelated(this.#ast.related, {\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n system: this.#system,\n }),\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: subQuery.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n ) as AnyQuery;\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const sq = asQueryImpl(\n cb(\n this.#deriveBounded(`relatedBase:${relationship}`, () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, relationship),\n {\n relationships: {},\n singular: secondRelation.cardinality === 'one',\n },\n this.customQueryID,\n relationship,\n ),\n ) as AnyQuery,\n ),\n );\n\n // Bound to consts so the `isCompoundKey` narrowing survives into the\n // closure below; TypeScript drops narrowing of property accesses there.\n const {sourceField: firstSource, destField: firstDest} = firstRelation;\n const {sourceField: secondSource, destField: secondDest} = secondRelation;\n assert(isCompoundKey(firstSource), 'Invalid relationship');\n assert(isCompoundKey(firstDest), 'Invalid relationship');\n assert(isCompoundKey(secondSource), 'Invalid relationship');\n assert(isCompoundKey(secondDest), 'Invalid relationship');\n\n return this.#derive(\n relatedKey(relationship),\n astID(sq.#ast),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: insertRelated(this.#ast.related, {\n correlation: {\n parentField: firstSource,\n childField: firstDest,\n },\n hidden: true,\n subquery: {\n ...tableAST(junctionSchema, relationship),\n // A single subquery is sorted.\n related: [\n normalizedRelated({\n correlation: {\n parentField: secondSource,\n childField: secondDest,\n },\n subquery: sq.#ast,\n system: this.#system,\n }),\n ],\n },\n system: this.#system,\n }),\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: sq.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n ) as AnyQuery;\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n }\n\n // The declared return is the *bottom* of the pinned dimension, which is\n // assignable to every `where` overload's declared return. The overloads\n // refine `TPinned` for callers only; a single non-generic implementation\n // signature cannot express that refinement.\n where(\n fieldOrExpressionFactory: string | ExpressionFactory<TTable, TSchema>,\n opOrValue?: SimpleOperator | GetFilterTypeAny | Parameter,\n value?: GetFilterTypeAny | Parameter,\n ): Query<TTable, TSchema, TReturn, any> {\n let cond: Condition;\n\n if (typeof fieldOrExpressionFactory === 'function') {\n cond = fieldOrExpressionFactory(this.expressionBuilder());\n } else {\n assert(arguments.length >= 2, 'Invalid condition. Too few arguments.');\n // Distinguish between 2-arg form (field, value) and 3-arg form (field, op, value)\n // using arguments.length to allow explicit undefined in 3-arg form.\n const twoArg = arguments.length === 2;\n const op = (twoArg ? '=' : opOrValue) as SimpleOperator;\n const raw = twoArg ? opOrValue : value;\n\n // Comparing a column to a primitive is by far the most common thing anyone\n // does with a query, and the transition it names is fully determined by\n // (column, op, value) -- so check for it before building anything. On a hit\n // this returns without allocating the `Condition` at all. Objects are\n // excluded, which covers both parameter references and `IN` arrays; `cmp`\n // maps a missing value to null, so this must too.\n if (raw === null || typeof raw !== 'object') {\n const hit = this.#transitions?.lookup(\n whereKey(fieldOrExpressionFactory, op),\n (raw ?? null) as TransitionValue,\n undefined,\n );\n if (hit !== undefined) {\n return hit as unknown as Query<TTable, TSchema, TReturn, any>;\n }\n }\n\n cond = twoArg\n ? cmp(fieldOrExpressionFactory, opOrValue)\n : cmp(fieldOrExpressionFactory, opOrValue, value);\n }\n\n // The delta is the condition as built here, *before* it is merged with the\n // existing where and normalized. Both steps are deterministic and the\n // existing where is fixed by this query, so an equal `cond` always produces\n // an equal result.\n //\n // A simple comparison against a column splits cleanly: the column and\n // operator come from a small fixed set and give a memoized, stable key,\n // while the compared value -- the part that varies per call -- is handed\n // through as the transition value and never concatenated into a string.\n let key: string;\n let tValue: TransitionValue;\n let delta: Delta = cond;\n if (cond.type === 'simple' && cond.left.type === 'column') {\n key = whereKey(cond.left.name, cond.op);\n const right = cond.right;\n tValue =\n right.type === 'literal' && isPrimitive(right.value)\n ? right.value\n : rightTag(right);\n delta = undefined;\n } else {\n // A sub-query an `exists` correlates to is itself interned, so its\n // identity settles that part of the tree without walking it.\n const exact = condKey(cond);\n if (exact === undefined) {\n key = treeKey(cond);\n } else {\n key = 'where:tree';\n tValue = exact;\n delta = undefined;\n }\n }\n\n return this.#derive(key, tValue, delta, () => {\n const existingWhere = this.#ast.where;\n const merged = existingWhere ? and(existingWhere, cond) : cond;\n return this.#newQuery(\n this.#tableName,\n {...this.#ast, where: normalizeCondition(simplifyCondition(merged))},\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n }) as unknown as Query<TTable, TSchema, TReturn, any>;\n }\n\n start(\n row: Partial<Record<string, ReadonlyJSONValue | undefined>>,\n opts?: {inclusive: boolean},\n ): Query<TTable, TSchema, TReturn> {\n // The row is an object, so it is encoded to a string to serve as the\n // lookup key. Property order is part of that string.\n return this.#derive(\n opts?.inclusive ? 'start:inclusive' : 'start:exclusive',\n valueTag(row as ReadonlyJSONValue),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n start: {\n row,\n exclusive: !opts?.inclusive,\n },\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n limit(limit: number): Query<TTable, TSchema, TReturn> {\n if (limit < 0) {\n throw new Error('Limit must be non-negative');\n }\n if ((limit | 0) !== limit) {\n throw new Error('Limit must be an integer');\n }\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Limit is not supported in junction relationships yet. Junction relationship being limited: ' +\n this.#currentJunction,\n );\n }\n\n return this.#derive('limit', limit, undefined, () =>\n this.#newQuery(\n this.#tableName,\n {...this.#ast, limit},\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n orderBy<TSelector extends keyof TSchema['tables'][TTable]['columns']>(\n field: TSelector,\n direction: 'asc' | 'desc',\n ): Query<TTable, TSchema, TReturn> {\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Order by is not supported in junction relationships yet. Junction relationship being ordered: ' +\n this.#currentJunction,\n );\n }\n return this.#derive(\n direction === 'asc' ? 'orderBy:asc' : 'orderBy:desc',\n field as string,\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n orderBy: [\n ...(this.#ast.orderBy ?? []),\n [field as string, direction],\n ],\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n #exists(\n relationship: string,\n cb: ((query: AnyQuery) => AnyQuery) | undefined,\n options?: ExistsOptions,\n ): Condition {\n cb = cb ?? (q => q);\n const flip = options?.flip;\n const scalar = options?.scalar;\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n\n if (isOneHop(related)) {\n const {destSchema: destTableName, sourceField, destField} = related[0];\n assert(isCompoundKey(sourceField), 'Invalid relationship');\n assert(isCompoundKey(destField), 'Invalid relationship');\n\n const subQuery = asQueryImpl(\n cb(\n this.#deriveBounded(`existsBase:${relationship}`, () =>\n this.#newQuery(\n destTableName,\n tableAST(destTableName, `${SUBQ_PREFIX}${relationship}`),\n defaultFormat,\n this.customQueryID,\n undefined,\n ),\n ) as AnyQuery,\n ),\n );\n // Give the sub-query's AST an id so the enclosing `where` can key on it\n // exactly rather than comparing the sub-tree.\n astID(subQuery.#ast);\n // Unlike the entries of `related`, the correlated subqueries of a\n // condition keep the order their fields are written in: normalization\n // does not reorder them either.\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n };\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(firstRelation.destField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.destField), 'Invalid relationship');\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const queryToDest = cb(\n this.#deriveBounded(`existsJunctionBase:${relationship}`, () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, `${SUBQ_PREFIX}zhidden_${relationship}`),\n defaultFormat,\n this.customQueryID,\n relationship,\n ),\n ) as AnyQuery,\n );\n\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: firstRelation.sourceField,\n childField: firstRelation.destField,\n },\n subquery: {\n ...tableAST(junctionSchema, `${SUBQ_PREFIX}${relationship}`),\n // A single condition needs no flattening or sorting, but the node\n // itself still has to be rebuilt into the canonical field order.\n where: normalizeCondition({\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: secondRelation.sourceField,\n childField: secondRelation.destField,\n },\n subquery: asQueryImpl(queryToDest).#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n }),\n },\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n };\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n }\n\n get ast(): NormalizedAST {\n return this.#ast;\n }\n\n expressionBuilder(): ExpressionBuilder<TTable, TSchema> {\n // Built on demand rather than held as an eagerly initialized field: a field\n // would cost a closure on every query constructed, where this costs one only\n // for queries that actually use an expression factory.\n return (this.#expressionBuilder ??= new ExpressionBuilder<TTable, TSchema>(\n this.#exists.bind(this) as ConstructorParameters<\n typeof ExpressionBuilder<TTable, TSchema>\n >[0],\n ));\n }\n}\n\nexport function asQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(q: Query<TTable, TSchema, TReturn>): QueryImpl<TTable, TSchema, TReturn> {\n assert(q instanceof QueryImpl, 'Expected QueryImpl instance');\n return q;\n}\n\n/**\n * A stable id per query AST.\n *\n * Every `QueryImpl` allocates its own AST object, so these are one-to-one with\n * queries, and interning makes the object identity stable across rebuilds. That\n * lets a `related` or `exists` transition key on *which* sub-query it points at\n * rather than comparing the sub-tree.\n *\n * Assigned only where it is needed. A `WeakMap.set` costs on the order of a\n * hundred nanoseconds, so doing this for every query rather than for the few\n * that are sub-queries was one of the largest single costs of building a query\n * from cold. ASTs that never pass through here -- including the junction AST a\n * two-hop `exists` builds inline -- are absent, and fall back to a delta.\n */\nconst astIDs = new WeakMap<AST, number>();\nlet nextASTID = 0;\n\nconst newASTID = () => ++nextASTID;\n\nfunction astID(ast: AST): number {\n return getOrInsertComputed(astIDs, ast, newASTID);\n}\n\n/**\n * Memoized transition keys.\n *\n * A transition key must be a string V8 has already hashed, or the `Map` lookup\n * has to hash it from scratch -- measured at ~148ns against ~10ns, which dwarfs\n * everything else a lookup does. Both tables are keyed by schema-derived names,\n * so they are bounded by the schema.\n */\nconst whereKeys = new Map<string, Map<string, string>>();\n\nfunction whereKey(column: string, op: string): string {\n const byOp = getOrInsertComputed(whereKeys, column, newMap);\n return getOrInsertComputed(byOp, op, op => `where:${column}:${op}`);\n}\n\nconst relatedKeys = new Map<string, string>();\n\nconst newRelatedKey = (relationship: string) => `related:${relationship}`;\n\nfunction relatedKey(relationship: string): string {\n return getOrInsertComputed(relatedKeys, relationship, newRelatedKey);\n}\n\nfunction isPrimitive(v: LiteralValue): v is string | number | boolean | null {\n return v === null || typeof v !== 'object';\n}\n\n/**\n * Folds a JSON value into a self-delimiting token: a string is\n * length-prefixed, a number is terminated, an array or object is\n * count-prefixed and encodes its members recursively, and the rest are fixed\n * width. Tokens can therefore be concatenated into a key with no way for one\n * to run into the next, and the leading tag keeps `'1'` and `1` apart.\n *\n * Not `JSON.stringify`: it writes `Infinity`, `NaN` and `null` all as `null`,\n * and this token is trusted as exact, so a nested value that serialized like\n * another's would hand back a query with the wrong value in its AST. Numbers\n * are written the way `String` writes them, which keeps those apart. An\n * `undefined` property is skipped, as `deepEqual` would skip it; property\n * order is part of the encoding, so an object spelled in another order\n * interns separately.\n */\nfunction valueTag(v: ReadonlyJSONValue): string {\n switch (typeof v) {\n case 'string':\n return `:s${enc(v)}`;\n case 'number':\n return `:n${v};`;\n case 'boolean':\n return v ? ':t' : ':f';\n default: {\n if (v === null) {\n return ':z';\n }\n if (Array.isArray(v)) {\n let out = `:a${v.length}:`;\n for (const e of v) {\n out += valueTag(e);\n }\n return out;\n }\n // `Array.isArray` does not narrow a readonly array out of the union.\n const o = v as ReadonlyJSONObject;\n let body = '';\n let n = 0;\n for (const key in o) {\n const e = o[key];\n if (e !== undefined && Object.hasOwn(o, key)) {\n body += enc(key) + valueTag(e);\n n++;\n }\n }\n return `:o${n}:${body}`;\n }\n }\n}\n\n/**\n * Folds the right-hand side of a simple condition into a transition value, so\n * that the transition is exact and the lookup needs no comparison at all.\n *\n * Arrays (`IN`) and parameter references are encoded in full: that is one\n * pass over a small value, where leaving them in the delta would instead cost\n * a `deepEqual` over the whole condition for every sibling a lookup walks\n * past.\n */\nfunction rightTag(right: SimpleCondition['right']): string {\n if (right.type !== 'literal') {\n return `:p${valueTag(right as unknown as ReadonlyJSONValue)}`;\n }\n return valueTag(right.value);\n}\n\n/**\n * Length-prefixes a free-form string so it can be concatenated into a key\n * without a separator being ambiguous with the content.\n */\nfunction enc(s: string): string {\n return `${s.length}:${s}`;\n}\n\n/** Encodes an optional boolean without collapsing `undefined` into `false`. */\nfunction tri(b: boolean | undefined): string {\n return b === undefined ? '-' : b ? 't' : 'f';\n}\n\n/**\n * An exact key for a whole condition tree, or `undefined` for a shape we cannot\n * encode (which falls back to {@linkcode treeKey} plus a delta).\n *\n * Everything variable-length is length-prefixed, so distinct trees cannot\n * produce the same string and the key needs no `deepEqual` to back it up. That\n * matters because the alternative -- one coarse bucket per shape -- turns N\n * sibling conditions off the same parent into an N-deep scan of tree\n * comparisons, which measured far slower than not interning at all.\n */\nfunction condKey(cond: Condition): string | undefined {\n switch (cond.type) {\n case 'simple': {\n if (cond.left.type !== 'column') {\n return undefined;\n }\n return `S${enc(cond.left.name)}${enc(cond.op)}${rightTag(cond.right)}`;\n }\n case 'correlatedSubquery': {\n const id = astIDs.get(cond.related.subquery);\n return id === undefined\n ? undefined\n : `E${id}:${enc(cond.op)}${tri(cond.flip)}${tri(cond.scalar)}`;\n }\n case 'and':\n case 'or': {\n let out = `${cond.type === 'and' ? 'A' : 'O'}${cond.conditions.length}:`;\n for (const c of cond.conditions) {\n const k = condKey(c);\n if (k === undefined) {\n return undefined;\n }\n out += k;\n }\n return out;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * A coarse bucket key for the conditions {@linkcode condKey} cannot encode --\n * a two-hop `exists`, whose junction AST is built inline and so has no identity\n * of its own. Reads only the top of the tree, so it is cheap; the delta tells\n * apart what shares it.\n */\nfunction treeKey(cond: Condition): string {\n switch (cond.type) {\n case 'correlatedSubquery':\n return `where:e:${cond.related.subquery.alias}:${cond.op}`;\n case 'and':\n case 'or':\n return `where:${cond.type}:${cond.conditions.length}`;\n default:\n return 'where:*';\n }\n}\n\nfunction throwQueryNotRunnable(): never {\n throw new Error('Query is not runnable');\n}\n\nfunction isCompoundKey(field: readonly string[]): field is CompoundKey {\n return Array.isArray(field) && field.length >= 1;\n}\n\nfunction isOneHop<T>(r: readonly T[]): r is readonly [T] {\n return r.length === 1;\n}\n\nfunction isTwoHop<T>(r: readonly T[]): r is readonly [T, T] {\n return r.length === 2;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"query-impl.js","names":["#schema","#tableName","#ast","#system","#currentJunction","#newQuery","#hash","#exists"],"sources":["../../../../../zql/src/query/query-impl.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\nimport {assert} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {\n type AST,\n type CompoundKey,\n type Condition,\n type Parameter,\n type SimpleOperator,\n type System,\n SUBQ_PREFIX,\n} from '../../../zero-protocol/src/ast.ts';\nimport {hashOfAST} from '../../../zero-protocol/src/query-hash.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {NotImplementedError} from '../error.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport {\n type ExpressionFactory,\n ExpressionBuilder,\n and,\n cmp,\n simplifyCondition,\n} from './expression.ts';\nimport type {CustomQueryID} from './named.ts';\nimport {type QueryInternals, queryInternalsTag} from './query-internals.ts';\nimport type {\n AnyQuery,\n ExistsOptions,\n GetFilterType,\n HumanReadable,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\ntype GetFilterTypeAny = GetFilterType<any, any, any>;\n\ntype NewQueryFunction<TSchema extends Schema> = <\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n>(\n this: unknown,\n tableName: TTable,\n ast: AST,\n format: Format,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n) => QueryImpl<TTable, TSchema, TReturn>;\n\nexport function newQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(schema: TSchema, table: TTable): Query<TTable, TSchema> {\n return newQueryImpl(schema, table, {table}, defaultFormat, 'client');\n}\n\nexport function newQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System,\n): QueryImpl<TTable, TSchema, TReturn> {\n const inner: NewQueryFunction<TSchema> = (\n tableName,\n ast,\n format,\n customQueryID,\n currentJunction,\n ) =>\n new QueryImpl(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n inner,\n );\n\n return inner(tableName, ast, format, undefined, undefined);\n}\n\nexport class QueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n implements\n Query<TTable, TSchema, TReturn>,\n QueryInternals<TTable, TSchema, TReturn>\n{\n readonly [queryInternalsTag] = true;\n\n readonly #schema: TSchema;\n readonly #tableName: TTable;\n readonly #ast: AST;\n readonly format: Format;\n #hash: string = '';\n readonly #system: System;\n readonly #currentJunction: string | undefined;\n readonly customQueryID: CustomQueryID | undefined;\n readonly #newQuery: NewQueryFunction<TSchema>;\n\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n newQuery: NewQueryFunction<TSchema>,\n ) {\n this.#schema = schema;\n this.#tableName = tableName;\n this.#ast = ast;\n this.format = format;\n this.#system = system;\n this.#currentJunction = currentJunction;\n this.customQueryID = customQueryID;\n this.#newQuery = newQuery;\n }\n\n run(_options?: RunOptions): Promise<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n preload(_options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n throwQueryNotRunnable();\n }\n\n materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n materialize<T>(\n _factoryOrTTL?: ViewFactory<TTable, TSchema, TReturn, T> | TTL,\n _ttl?: TTL,\n ): T | TypedView<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn> {\n return this.#newQuery(\n this.#tableName,\n this.#ast,\n this.format,\n {\n name,\n args,\n },\n this.#currentJunction,\n );\n }\n\n hash(): string {\n if (!this.#hash) {\n this.#hash = hashOfAST(this.#ast);\n }\n return this.#hash;\n }\n\n one = (): Query<TTable, TSchema, TReturn | undefined> =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n limit: 1,\n },\n {\n ...this.format,\n singular: true,\n },\n this.customQueryID,\n this.#currentJunction,\n );\n\n whereExists = (\n relationship: string,\n cbOrOptions?: ((q: AnyQuery) => AnyQuery) | ExistsOptions,\n options?: ExistsOptions,\n ): Query<TTable, TSchema, TReturn> => {\n const cb = typeof cbOrOptions === 'function' ? cbOrOptions : undefined;\n const opts = typeof cbOrOptions === 'function' ? options : cbOrOptions;\n return this.where(({exists}) => exists(relationship, cb, opts)) as Query<\n TTable,\n TSchema,\n TReturn\n >;\n };\n\n related = (\n relationship: string,\n cb?: (q: AnyQuery) => AnyQuery,\n ): Query<TTable, TSchema, any> => {\n if (relationship.startsWith(SUBQ_PREFIX)) {\n throw new Error(\n `Relationship names may not start with \"${SUBQ_PREFIX}\". That is a reserved prefix.`,\n );\n }\n cb = cb ?? (q => q);\n\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n if (isOneHop(related)) {\n const {destSchema, destField, sourceField, cardinality} = related[0];\n const q: AnyQuery = this.#newQuery(\n destSchema,\n {\n table: destSchema,\n alias: relationship,\n },\n {\n relationships: {},\n singular: cardinality === 'one',\n },\n this.customQueryID,\n undefined,\n ) as AnyQuery;\n // Intentionally not setting to `one` as it is a perf degradation\n // and the user should not be making the mistake of setting cardinality to\n // `one` when it is actually not.\n // if (cardinality === 'one') {\n // q = q.one();\n // }\n const subQuery = asQueryImpl(cb(q));\n assert(\n isCompoundKey(sourceField),\n 'The source of a relationship must specify at last 1 field',\n );\n assert(\n isCompoundKey(destField),\n 'The destination of a relationship must specify at last 1 field',\n );\n assert(\n sourceField.length === destField.length,\n 'The source and destination of a relationship must have the same number of fields',\n );\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: [\n ...(this.#ast.related ?? []),\n {\n system: this.#system,\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n },\n ],\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: subQuery.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ) as AnyQuery;\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const sq = asQueryImpl(\n cb(\n this.#newQuery(\n destSchema,\n {\n table: destSchema,\n alias: relationship,\n },\n {\n relationships: {},\n singular: secondRelation.cardinality === 'one',\n },\n this.customQueryID,\n relationship,\n ) as AnyQuery,\n ),\n );\n\n assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(firstRelation.destField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.destField), 'Invalid relationship');\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: [\n ...(this.#ast.related ?? []),\n {\n system: this.#system,\n correlation: {\n parentField: firstRelation.sourceField,\n childField: firstRelation.destField,\n },\n hidden: true,\n subquery: {\n table: junctionSchema,\n alias: relationship,\n related: [\n {\n system: this.#system,\n correlation: {\n parentField: secondRelation.sourceField,\n childField: secondRelation.destField,\n },\n subquery: sq.#ast,\n },\n ],\n },\n },\n ],\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: sq.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ) as AnyQuery;\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n };\n\n // The declared return is the *bottom* of the pinned dimension, which is\n // assignable to every `where` overload's declared return. The overloads\n // refine `TPinned` for callers only; a single non-generic implementation\n // signature cannot express that refinement.\n where = function (\n this: QueryImpl<TTable, TSchema, TReturn>,\n fieldOrExpressionFactory: string | ExpressionFactory<TTable, TSchema>,\n opOrValue?: SimpleOperator | GetFilterTypeAny | Parameter,\n value?: GetFilterTypeAny | Parameter,\n ): Query<TTable, TSchema, TReturn, any> {\n let cond: Condition;\n\n if (typeof fieldOrExpressionFactory === 'function') {\n cond = fieldOrExpressionFactory(this.expressionBuilder());\n } else {\n assert(arguments.length >= 2, 'Invalid condition. Too few arguments.');\n // Distinguish between 2-arg form (field, value) and 3-arg form (field, op, value)\n // using arguments.length to allow explicit undefined in 3-arg form.\n if (arguments.length === 2) {\n cond = cmp(fieldOrExpressionFactory, opOrValue);\n } else {\n cond = cmp(fieldOrExpressionFactory, opOrValue, value);\n }\n }\n\n const existingWhere = this.#ast.where;\n if (existingWhere) {\n cond = and(existingWhere, cond);\n }\n\n const where = simplifyCondition(cond);\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n where,\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ) as unknown as Query<TTable, TSchema, TReturn, any>;\n }.bind(this);\n\n start = (\n row: Partial<Record<string, ReadonlyJSONValue | undefined>>,\n opts?: {inclusive: boolean},\n ): Query<TTable, TSchema, TReturn> =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n start: {\n row,\n exclusive: !opts?.inclusive,\n },\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n\n limit = (limit: number): Query<TTable, TSchema, TReturn> => {\n if (limit < 0) {\n throw new Error('Limit must be non-negative');\n }\n if ((limit | 0) !== limit) {\n throw new Error('Limit must be an integer');\n }\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Limit is not supported in junction relationships yet. Junction relationship being limited: ' +\n this.#currentJunction,\n );\n }\n\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n limit,\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n };\n\n orderBy = <TSelector extends keyof TSchema['tables'][TTable]['columns']>(\n field: TSelector,\n direction: 'asc' | 'desc',\n ): Query<TTable, TSchema, TReturn> => {\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Order by is not supported in junction relationships yet. Junction relationship being ordered: ' +\n this.#currentJunction,\n );\n }\n return this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n orderBy: [...(this.#ast.orderBy ?? []), [field as string, direction]],\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n };\n\n #exists = (\n relationship: string,\n cb: ((query: AnyQuery) => AnyQuery) | undefined,\n options?: ExistsOptions,\n ): Condition => {\n cb = cb ?? (q => q);\n const flip = options?.flip;\n const scalar = options?.scalar;\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n\n if (isOneHop(related)) {\n const {destSchema: destTableName, sourceField, destField} = related[0];\n assert(isCompoundKey(sourceField), 'Invalid relationship');\n assert(isCompoundKey(destField), 'Invalid relationship');\n\n const subQuery = asQueryImpl(\n cb(\n this.#newQuery(\n destTableName,\n {\n table: destTableName,\n alias: `${SUBQ_PREFIX}${relationship}`,\n },\n defaultFormat,\n this.customQueryID,\n undefined,\n ) as AnyQuery,\n ),\n );\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n };\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(firstRelation.destField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.destField), 'Invalid relationship');\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const queryToDest = cb(\n this.#newQuery(\n destSchema,\n {\n table: destSchema,\n alias: `${SUBQ_PREFIX}zhidden_${relationship}`,\n },\n defaultFormat,\n this.customQueryID,\n relationship,\n ) as AnyQuery,\n );\n\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: firstRelation.sourceField,\n childField: firstRelation.destField,\n },\n subquery: {\n table: junctionSchema,\n alias: `${SUBQ_PREFIX}${relationship}`,\n where: {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: secondRelation.sourceField,\n childField: secondRelation.destField,\n },\n subquery: asQueryImpl(queryToDest).#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n },\n },\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n };\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n };\n\n get ast(): AST {\n return this.#ast;\n }\n\n expressionBuilder(): ExpressionBuilder<TTable, TSchema> {\n return new ExpressionBuilder<TTable, TSchema>(\n this.#exists as ConstructorParameters<\n typeof ExpressionBuilder<TTable, TSchema>\n >[0],\n );\n }\n}\n\nexport function asQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(q: Query<TTable, TSchema, TReturn>): QueryImpl<TTable, TSchema, TReturn> {\n assert(q instanceof QueryImpl, 'Expected QueryImpl instance');\n return q;\n}\n\nfunction throwQueryNotRunnable(): never {\n throw new Error('Query is not runnable');\n}\n\nfunction isCompoundKey(field: readonly string[]): field is CompoundKey {\n return Array.isArray(field) && field.length >= 1;\n}\n\nfunction isOneHop<T>(r: readonly T[]): r is readonly [T] {\n return r.length === 1;\n}\n\nfunction isTwoHop<T>(r: readonly T[]): r is readonly [T, T] {\n return r.length === 2;\n}\n"],"mappings":"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"}
@@ -23,35 +23,25 @@ export interface QueryInternals<TTable extends keyof TSchema['tables'] & string,
23
23
  */
24
24
  readonly format: Format;
25
25
  /**
26
- * A string that uniquely identifies this query object: two queries share it
27
- * exactly when they are interchangeable, down to how their builder methods
28
- * behave.
26
+ * A string that uniquely identifies this query. This can be used to determine
27
+ * if two queries are the same.
29
28
  *
30
- * It covers the AST, the {@linkcode format} the results take, the system the
31
- * query was built for, the junction relationship it is being built inside,
32
- * and, for a custom query, the name and arguments it was declared with.
33
- * Everything past the AST is hashed explicitly because it leaves no trace
34
- * there: {@linkcode nameAndArgs} reuses the AST it is given, a query with no
35
- * relationship and no `exists` has nowhere to stamp its system, and the
36
- * junction flag -- which decides whether `limit` and `orderBy` throw --
37
- * appears nowhere in the AST at all. Without them, such queries would share a
38
- * hash and anything keyed by it would conflate them.
29
+ * The hash of a custom query, on the client, is the hash of its AST.
30
+ * The hash of a custom query, on the server, is the hash of its name and args.
39
31
  *
40
- * It does *not* cover the schema, which has no stable identity to hash.
41
- * Anything keyed by this that could see more than one schema has to scope
42
- * itself by schema as well.
32
+ * The first allows many client-side queries to be pinned to the same backend query.
33
+ * The second ensures we do not invoke a named query on the backend more than once for the same `name:arg` pairing.
43
34
  *
44
- * This is entirely client-side and never reaches the server. The server knows
45
- * a custom query by the hash of its name and args, and any other query by the
46
- * hash of its AST alone -- see `materializeImpl`.
35
+ * If the query.hash was of `name:args` then `useQuery` would de-dupe
36
+ * queries with divergent ASTs.
37
+ *
38
+ * QueryManager will hash based on `name:args` since it is speaking with
39
+ * the server which tracks queries by `name:args`.
47
40
  */
48
41
  hash(): string;
49
42
  /**
50
43
  * The completed AST for this query, with any missing primary keys added to
51
44
  * orderBy and start.
52
- *
53
- * A QueryImpl hands out a `NormalizedAST`; this stays an `AST` so that the
54
- * ASTs derived from it (e.g. by binding static parameters) still fit.
55
45
  */
56
46
  readonly ast: AST;
57
47
  readonly customQueryID: CustomQueryID | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"query-internals.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-internals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,KAAK,EAAC,MAAM,IAAI,UAAU,EAAC,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAEtC,eAAO,MAAM,iBAAiB,eAAW,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc,CAC7B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO;IAEP,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,IAAI,MAAM,CAAC;IAEf;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAElB,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAElD;;;;;OAKG;IACH,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACrC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EAEP,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GACrC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAM1C;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EACP,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAE/D;AAED,wBAAgB,OAAO,CACrB,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EAEP,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GACvD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAGjC;AAGD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"query-internals.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-internals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,KAAK,EAAC,MAAM,IAAI,UAAU,EAAC,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAEtC,eAAO,MAAM,iBAAiB,eAAW,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc,CAC7B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO;IAEP,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;;;;;;;;;;;;OAeG;IACH,IAAI,IAAI,MAAM,CAAC;IAEf;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAElB,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAElD;;;;;OAKG;IACH,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACrC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EAEP,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GACrC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAM1C;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EACP,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAE/D;AAED,wBAAgB,OAAO,CACrB,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,EAC1B,OAAO,EAEP,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GACvD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAGjC;AAGD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-internals.js","names":[],"sources":["../../../../../zql/src/query/query-internals.ts"],"sourcesContent":["import {assert} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema as ZeroSchema} from '../../../zero-types/src/schema.ts';\nimport type {Format} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {Query} from './query.ts';\n\nexport const queryInternalsTag = Symbol();\n\n/**\n * Internal interface for query implementation details.\n * This is not part of the public API and should only be accessed via\n * the {@linkcode asQueryInternals} function.\n *\n * @typeParam TSchema The database schema type extending ZeroSchema\n * @typeParam TTable The name of the table being queried, must be a key of TSchema['tables']\n * @typeParam TReturn The return type of the query, defaults to PullRow<TTable, TSchema>\n */\nexport interface QueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n> {\n readonly [queryInternalsTag]: true;\n\n /**\n * Format is used to specify the shape of the query results. This is used by\n * {@linkcode one} and it also describes the shape when using\n * {@linkcode related}.\n */\n readonly format: Format;\n\n /**\n * A string that uniquely identifies this query object: two queries share it\n * exactly when they are interchangeable, down to how their builder methods\n * behave.\n *\n * It covers the AST, the {@linkcode format} the results take, the system the\n * query was built for, the junction relationship it is being built inside,\n * and, for a custom query, the name and arguments it was declared with.\n * Everything past the AST is hashed explicitly because it leaves no trace\n * there: {@linkcode nameAndArgs} reuses the AST it is given, a query with no\n * relationship and no `exists` has nowhere to stamp its system, and the\n * junction flag -- which decides whether `limit` and `orderBy` throw --\n * appears nowhere in the AST at all. Without them, such queries would share a\n * hash and anything keyed by it would conflate them.\n *\n * It does *not* cover the schema, which has no stable identity to hash.\n * Anything keyed by this that could see more than one schema has to scope\n * itself by schema as well.\n *\n * This is entirely client-side and never reaches the server. The server knows\n * a custom query by the hash of its name and args, and any other query by the\n * hash of its AST alone -- see `materializeImpl`.\n */\n hash(): string;\n\n /**\n * The completed AST for this query, with any missing primary keys added to\n * orderBy and start.\n *\n * A QueryImpl hands out a `NormalizedAST`; this stays an `AST` so that the\n * ASTs derived from it (e.g. by binding static parameters) still fit.\n */\n readonly ast: AST;\n\n readonly customQueryID: CustomQueryID | undefined;\n\n /**\n * Associates a name and arguments with this query for custom query tracking.\n * This is used internally to track named queries on the server.\n *\n * @internal\n */\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn>;\n}\n\n/**\n * Helper function to cast a Query to QueryInternals.\n * This is used in tests and internal code to access query implementation details.\n * The function asserts that the query has the queryInternalsTag to ensure it\n * properly implements the QueryInternals interface.\n *\n * @internal\n */\nexport function asQueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n): QueryInternals<TTable, TSchema, TReturn> {\n assert(\n queryInternalsTag in query,\n 'Query does not implement QueryInternals. This likely means there are two copies of Zero in your runtime.',\n );\n return query as unknown as QueryInternals<TTable, TSchema, TReturn>;\n}\n\nexport function isQueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(obj: unknown): obj is QueryInternals<TTable, TSchema, TReturn> {\n return typeof obj === 'object' && obj !== null && queryInternalsTag in obj;\n}\n\nexport function asQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(\n queryInternals: QueryInternals<TTable, TSchema, TReturn>,\n): Query<TTable, TSchema, TReturn> {\n assert(queryInternalsTag in queryInternals, 'Expected query internals tag');\n return queryInternals as unknown as Query<TTable, TSchema, TReturn>;\n}\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyQueryInternals = QueryInternals<string, ZeroSchema, any>;\n"],"mappings":";;AAQA,IAAa,oBAAoB,OAAO;;;;;;;;;AAiFxC,SAAgB,iBAKd,OAC0C;CAC1C,OACE,qBAAqB,OACrB,0GACF;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"query-internals.js","names":[],"sources":["../../../../../zql/src/query/query-internals.ts"],"sourcesContent":["import {assert} from '../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema as ZeroSchema} from '../../../zero-types/src/schema.ts';\nimport type {Format} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {Query} from './query.ts';\n\nexport const queryInternalsTag = Symbol();\n\n/**\n * Internal interface for query implementation details.\n * This is not part of the public API and should only be accessed via\n * the {@linkcode asQueryInternals} function.\n *\n * @typeParam TSchema The database schema type extending ZeroSchema\n * @typeParam TTable The name of the table being queried, must be a key of TSchema['tables']\n * @typeParam TReturn The return type of the query, defaults to PullRow<TTable, TSchema>\n */\nexport interface QueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n> {\n readonly [queryInternalsTag]: true;\n\n /**\n * Format is used to specify the shape of the query results. This is used by\n * {@linkcode one} and it also describes the shape when using\n * {@linkcode related}.\n */\n readonly format: Format;\n\n /**\n * A string that uniquely identifies this query. This can be used to determine\n * if two queries are the same.\n *\n * The hash of a custom query, on the client, is the hash of its AST.\n * The hash of a custom query, on the server, is the hash of its name and args.\n *\n * The first allows many client-side queries to be pinned to the same backend query.\n * The second ensures we do not invoke a named query on the backend more than once for the same `name:arg` pairing.\n *\n * If the query.hash was of `name:args` then `useQuery` would de-dupe\n * queries with divergent ASTs.\n *\n * QueryManager will hash based on `name:args` since it is speaking with\n * the server which tracks queries by `name:args`.\n */\n hash(): string;\n\n /**\n * The completed AST for this query, with any missing primary keys added to\n * orderBy and start.\n */\n readonly ast: AST;\n\n readonly customQueryID: CustomQueryID | undefined;\n\n /**\n * Associates a name and arguments with this query for custom query tracking.\n * This is used internally to track named queries on the server.\n *\n * @internal\n */\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn>;\n}\n\n/**\n * Helper function to cast a Query to QueryInternals.\n * This is used in tests and internal code to access query implementation details.\n * The function asserts that the query has the queryInternalsTag to ensure it\n * properly implements the QueryInternals interface.\n *\n * @internal\n */\nexport function asQueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n): QueryInternals<TTable, TSchema, TReturn> {\n assert(\n queryInternalsTag in query,\n 'Query does not implement QueryInternals. This likely means there are two copies of Zero in your runtime.',\n );\n return query as unknown as QueryInternals<TTable, TSchema, TReturn>;\n}\n\nexport function isQueryInternals<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(obj: unknown): obj is QueryInternals<TTable, TSchema, TReturn> {\n return typeof obj === 'object' && obj !== null && queryInternalsTag in obj;\n}\n\nexport function asQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends ZeroSchema,\n TReturn,\n>(\n queryInternals: QueryInternals<TTable, TSchema, TReturn>,\n): Query<TTable, TSchema, TReturn> {\n assert(queryInternalsTag in queryInternals, 'Expected query internals tag');\n return queryInternals as unknown as Query<TTable, TSchema, TReturn>;\n}\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyQueryInternals = QueryInternals<string, ZeroSchema, any>;\n"],"mappings":";;AAQA,IAAa,oBAAoB,OAAO;;;;;;;;;AAuExC,SAAgB,iBAKd,OAC0C;CAC1C,OACE,qBAAqB,OACrB,0GACF;CACA,OAAO;AACT"}
@@ -204,7 +204,6 @@ export interface Query<TTable extends keyof TSchema['tables'] & string, TSchema
204
204
  preload(options?: PreloadOptions): {
205
205
  cleanup: () => void;
206
206
  complete: Promise<void>;
207
- cached: Promise<void>;
208
207
  };
209
208
  /**
210
209
  * @deprecated Use {@linkcode MaterializeOptions} with {@linkcode zero.materialize} instead.
@@ -235,15 +234,7 @@ export type HumanReadableRecursive<T> = undefined extends T ? ExpandRecursive<T>
235
234
  * The kind of results we want to wait for when using {@linkcode run} on {@linkcode Query}.
236
235
  *
237
236
  * `unknown` means we don't want to wait for the server to return results. The result is a
238
- * snapshot of the data at the time the query was run. It never waits: while the client is
239
- * still starting up (its local data is being loaded and the queries registered so far are
240
- * being hydrated) that snapshot is empty, even when data from a previous session is stored
241
- * locally. Use `cached` or `complete` when the call has to wait for data.
242
- *
243
- * `cached` means we want a result the server has confirmed, but one confirmed by a previous
244
- * connection is fine: it resolves as soon as the result is `cached` or `complete`. Use it
245
- * on the launch path when the client may be offline and the store holds last session's
246
- * complete result for this query. If nothing is cached it waits like `complete`.
237
+ * snapshot of the data at the time the query was run.
247
238
  *
248
239
  * `complete` means we want to ensure that we have the latest result from the server. The
249
240
  * result is a complete and up-to-date view of the data. In some cases this means that we
@@ -256,7 +247,7 @@ export type HumanReadableRecursive<T> = undefined extends T ? ExpandRecursive<T>
256
247
  * time to keep the rows associated with this query after the promise has resolved.
257
248
  */
258
249
  export type RunOptions = {
259
- type: 'unknown' | 'cached' | 'complete';
250
+ type: 'unknown' | 'complete';
260
251
  ttl?: TTL | undefined;
261
252
  };
262
253
  export declare const DEFAULT_RUN_OPTIONS_UNKNOWN: {
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,MAAM,EAAE,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAC,KAAK,cAAc,EAAC,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0CAA0C,CAAC;AAC5E,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,MAAM,IAAI,UAAU,EACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAC,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE/C,KAAK,QAAQ,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;AAE1D,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,WAAW,IAAI,OAAO,CACjE,QAAQ,CAAC,CAAC,CAAC,EACX,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CACrC,CAAC;AAEF,KAAK,aAAa,CAAC,CAAC,SAAS,WAAW,IAAI;KACzC,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GAAG,CAAC,GAAG,KAAK;CAC9E,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAEtB,KAAK,cAAc,CAAC,CAAC,SAAS,WAAW,IAAI;KAC1C,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,yBAAyB,CAC1E,GAAG,EAAE,CACN,GACG,CAAC,GACD,KAAK;CACV,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAEtB,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE5E,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE3E,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,IAAI;IAC7D;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,MAAM,CAAC;AAE3C;;;GAGG;AACH,KAAK,YAAY,CACf,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,UAAU,IACxB,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,SAAS,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;CAC3E,GACG,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC,GAC5D,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAErD,2EAA2E;AAC3E,KAAK,aAAa,CAChB,KAAK,SAAS,SAAS,OAAO,EAAE,EAChC,OAAO,SAAS,MAAM,IACpB,KAAK,SAAS,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC,GACpD,KAAK,SAAS,SAAS,MAAM,EAAE,GAC7B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAC/B,IAAI,GACJ,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,GAC/B,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,GAC/B,KAAK,CAAC;AAEV;;;;;;;;;;;;GAYG;AACH,KAAK,iBAAiB,CACpB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,UAAU,EAC1B,OAAO,SAAS,MAAM,IAEtB,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,GAC9D,OAAO,GACP;IACE,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,kNAAkN,CAAC;CACrP,CAAC;AAER,OAAO,CAAC,MAAM,oBAAoB,EAAE,OAAO,MAAM,CAAC;AAElD;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,CACb,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,UAAU,EAC1B,aAAa,SAAS,MAAM,IAC1B,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,SAAS,SAAS;IACnE,MAAM,KAAK;CACZ,GACG,KAAK,SAAS;IACZ,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,SAAS,SAAS,MAAM,EAAE,CAAC;CAC/D,GACC,OAAO,CAAC,MAAM,CAAC,GACf,KAAK,GACP,KAAK,CAAC;AAEV,MAAM,MAAM,aAAa,CACvB,OAAO,SAAS,WAAW,EAC3B,OAAO,SAAS,MAAM,OAAO,CAAC,SAAS,CAAC,EACxC,SAAS,SAAS,cAAc,IAC9B,SAAS,SAAS,IAAI,GAAG,QAAQ,GAK/B,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GACrE,SAAS,SAAS,IAAI,GAAG,QAAQ,GAI/B,SAAS,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAEtE,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,GAC/D,SAAS,CAAC;AAEpB,MAAM,MAAM,sBAAsB,CAChC,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,UAAU,IACxB,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,aAAa,CACvB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,UAAU,EAC1B,aAAa,SAAS,MAAM,IAC1B,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAE/E,KAAK,OAAO,CACV,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,UAAU,EAC1B,aAAa,SAAS,MAAM,IAC1B,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,MAAM,GAChF,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,GAC/D,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;AAEhF,KAAK,YAAY,CAAC,eAAe,EAAE,gBAAgB,EAAE,GAAG,SAAS,MAAM,IAAI;IACzE,QAAQ,EAAE,CAAC,IAAI,GAAG,GAAG,SAAS,SAAS,gBAAgB,GACnD,gBAAgB,GAChB,SAAS,gBAAgB,EAAE;CAChC,SAAS,MAAM,gBAAgB,GAC5B,SAAS,SAAS,eAAe,GAC/B,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,gBAAgB,CAAC,GAAG,SAAS,GACpE,eAAe,GAAG,gBAAgB,GACpC,KAAK,CAAC;AAEV,MAAM,MAAM,eAAe,CACzB,MAAM,SAAS,MAAM,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,EAClD,QAAQ,SAAS,UAAU,IACzB,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/B,MAAM,MAAM,OAAO,CACjB,MAAM,SAAS,MAAM,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,EAClD,OAAO,SAAS,UAAU,GAAG,aAAa,IACxC;IACF,QAAQ,EAAE,CAAC,IAAI,MAAM,eAAe,CAClC,MAAM,EACN,OAAO,CACR,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAChC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAC/C;CACF,GAAG,EAAE,CAAC;AAEP,KAAK,YAAY,CAAC,CAAC,SAAS,UAAU,GAAG,SAAS,IAAI,CAAC,SAAS,UAAU,GACtE;IACE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,GAC9B,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,WAAW,GACzC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GACnB;QACE,KAAK,EAAE,8BAA8B,CAAC,GAAG,MAAM,6EAA6E,CAAC;QAC7H,qBAAqB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;KACvC;CACN,GACD,CAAC,CAAC;AAEN,MAAM,MAAM,GAAG,CACb,CAAC,SAAS,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,IAC/D,CAAC,SAAS,UAAU,GACpB,YAAY,CAAC,CAAC,CAAC,GACf,CAAC,SAAS,WAAW,GACnB;IACE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,mBAAmB,CACrD,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAChB;CACF,GACD,CAAC,SAAS,YAAY,GACpB,YAAY,CAAC,CAAC,CAAC,GACf,KAAK,CAAC;AAEd;;;GAGG;AACH,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,GAAG,EAAE;QACZ,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,GAC9B,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAClD,kBAAkB,CAAC;AAEvB,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,SAAS,CAC3D,GAAG,IAAI,EAAE,GAAG,KACT,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,GACzB,CAAC,GACD,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,GAChC,CAAC,GACD,CAAC,SAAS,kBAAkB,GAC1B,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GACjB,KAAK,CAAC;AAEd,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,SACnD,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,GAC9B,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,GAClD,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC9B,CAAC,SAAS,kBAAkB,GAC1B,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,GAChC,KAAK,CAAC;AAEZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,KAAK,CACpB,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,UAAU,GAAG,aAAa,EAC1C,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,SAAS,MAAM,GAAG,KAAK;IAE9B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAEnE,OAAO,CAAC,aAAa,SAAS,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,YAAY,EAAE,aAAa,GAC1B,KAAK,CACN,MAAM,EACN,OAAO,EACP,YAAY,CACV,OAAO,EACP,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,EACvC,aAAa,CACd,EACD,OAAO,CACR,CAAC;IACF,OAAO,CACL,aAAa,SAAS,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAExC,YAAY,EAAE,aAAa,EAC3B,EAAE,EAAE,CACF,CAAC,EAAE,KAAK,CACN,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,EAC7C,OAAO,EACP,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CACxC,KACE,IAAI,GACR,KAAK,CACN,MAAM,EACN,OAAO,EACP,YAAY,CACV,OAAO,EACP,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC,GACjD,UAAU,GACV,KAAK,EACT,aAAa,CACd,EACD,OAAO,CACR,CAAC;IAMF,KAAK,CACH,SAAS,SAAS,sBAAsB,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAE1E,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,GAAG,EACP,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,GACrE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;IACnE,KAAK,CACH,SAAS,SAAS,sBAAsB,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAE1E,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,GACrE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;IACnE,KAAK,CACH,SAAS,SAAS,sBAAsB,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC1E,SAAS,SAAS,cAAc,EAEhC,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,SAAS,EACb,KAAK,EACD,aAAa,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,GACrE,kBAAkB,GAClB,SAAS,GACZ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,KAAK,CACH,SAAS,SAAS,sBAAsB,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAE1E,KAAK,EAAE,SAAS,EAChB,KAAK,EACD,aAAa,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,GAC/D,kBAAkB,GAClB,SAAS,GACZ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,KAAK,CACH,iBAAiB,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,GACpD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAI5C,WAAW,CACT,YAAY,EAAE,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,EACrD,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,GAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAG5C,WAAW,CACT,aAAa,SAAS,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,UAAU,SAAS,MAAM,GAAG,KAAK,EAEjC,YAAY,EAAE,aAAa,EAC3B,EAAE,EAAE,CACF,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,KAC7D,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,GAC1C,iBAAiB,CACf,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,EAC7C,OAAO,EACP,UAAU,CACX,EACH,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG;QAAC,MAAM,EAAE,IAAI,CAAA;KAAC,GAC/C,KAAK,CACN,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CACrD,CAAC;IACF,WAAW,CAAC,aAAa,SAAS,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,YAAY,EAAE,aAAa,EAC3B,EAAE,EAAE,CACF,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,KAC7D,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAChC,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,GAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,KAAK,CACH,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACtC,IAAI,CAAC,EAAE;QAAC,SAAS,EAAE,OAAO,CAAA;KAAC,GAC1B,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE/D,OAAO,CAAC,SAAS,SAAS,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAClE,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,KAAK,GAAG,MAAM,GACxB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;IAE5D;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3D;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG;QACjC,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,CAAC;IAEF;;OAEG;IACH,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D;;OAEG;IACH,WAAW,CAAC,CAAC,EACX,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EACjD,GAAG,CAAC,EAAE,GAAG,GACR,CAAC,CAAC;CACN;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,SAAS,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAE7E;;GAEG;AAEH,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,SAAS,SAAS,CAAC,GACvD,eAAe,CAAC,CAAC,CAAC,GAClB,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,2BAA2B;;CAE9B,CAAC;AAEX,eAAO,MAAM,4BAA4B;;CAE/B,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type NormalizedAST, type System } from '../../../zero-protocol/src/ast.ts';
1
+ import type { AST, System } from '../../../zero-protocol/src/ast.ts';
2
2
  import type { Schema } from '../../../zero-types/src/schema.ts';
3
3
  import type { Format, ViewFactory } from '../ivm/view.ts';
4
4
  import type { CustomQueryID } from './named.ts';
@@ -10,12 +10,11 @@ import type { TypedView } from './typed-view.ts';
10
10
  export declare function newRunnableQuery<TTable extends keyof TSchema['tables'] & string, TSchema extends Schema>(delegate: QueryDelegate, schema: TSchema, table: TTable): Query<TTable, TSchema>;
11
11
  export declare class RunnableQueryImpl<TTable extends keyof TSchema['tables'] & string, TSchema extends Schema, TReturn = PullRow<TTable, TSchema>> extends QueryImpl<TTable, TSchema, TReturn> implements Query<TTable, TSchema, TReturn> {
12
12
  #private;
13
- constructor(delegate: QueryDelegate, schema: TSchema, tableName: TTable, ast?: NormalizedAST, format?: Format, system?: System, customQueryID?: CustomQueryID, currentJunction?: string);
13
+ constructor(delegate: QueryDelegate, schema: TSchema, tableName: TTable, ast?: AST, format?: Format, system?: System, customQueryID?: CustomQueryID, currentJunction?: string);
14
14
  run(options?: RunOptions): Promise<HumanReadable<TReturn>>;
15
15
  preload(options?: PreloadOptions): {
16
16
  cleanup: () => void;
17
17
  complete: Promise<void>;
18
- cached: Promise<void>;
19
18
  };
20
19
  materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;
21
20
  materialize<T>(factory: ViewFactory<TTable, TSchema, TReturn, T>, ttl?: TTL): T;
@@ -1 +1 @@
1
- {"version":3,"file":"runnable-query-impl.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAE9D,OAAO,KAAK,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,OAAO,EACP,KAAK,EACL,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAa/C,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EAEtB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBxB;AAED,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EACtB,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAElC,SAAQ,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAC1C,YAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;;gBAKxC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,aAAmC,EACxC,MAAM,GAAE,MAAsB,EAC9B,MAAM,GAAE,MAAiB,EACzB,aAAa,CAAC,EAAE,aAAa,EAC7B,eAAe,CAAC,EAAE,MAAM;IAyBjB,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAU1D,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG;QAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;KACvB;IAIQ,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,CAAC,CAAC,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EACjD,GAAG,CAAC,EAAE,GAAG,GACR,CAAC;CAsBL"}
1
+ {"version":3,"file":"runnable-query-impl.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAE,MAAM,EAAC,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAE9D,OAAO,KAAK,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,OAAO,EACP,KAAK,EACL,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE/C,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EAEtB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CASxB;AAED,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EACtB,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAElC,SAAQ,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAC1C,YAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;;gBAKxC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,GAAwB,EAC7B,MAAM,GAAE,MAAsB,EAC9B,MAAM,GAAE,MAAiB,EACzB,aAAa,CAAC,EAAE,aAAa,EAC7B,eAAe,CAAC,EAAE,MAAM;IAyBjB,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAI1D,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG;QAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB;IAIQ,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,CAAC,CAAC,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EACjD,GAAG,CAAC,EAAE,GAAG,GACR,CAAC;CAkBL"}
@@ -1,25 +1,12 @@
1
- import { getOrInsertComputed, newMap, newWeakMap } from "../../../shared/src/map.js";
2
- import { tableAST } from "../../../zero-protocol/src/ast.js";
3
1
  import { defaultFormat } from "../../../zero-types/src/format.js";
4
2
  import { QueryImpl } from "./query-impl.js";
5
3
  //#region ../zql/src/query/runnable-query-impl.ts
6
- /**
7
- * Runnable roots are interned per delegate *and* schema -- a query is only
8
- * interchangeable with another if it would run against the same delegate. See
9
- * `query-transitions.ts` for why roots need to be shared at all.
10
- */
11
- var rootsByDelegate = /* @__PURE__ */ new WeakMap();
12
4
  function newRunnableQuery(delegate, schema, table) {
13
- const roots = getOrInsertComputed(getOrInsertComputed(rootsByDelegate, delegate, newWeakMap), schema, newMap);
14
- const existing = roots.get(table)?.deref();
15
- if (existing) return existing;
16
- const created = new RunnableQueryImpl(delegate, schema, table, tableAST(table), defaultFormat, void 0);
17
- roots.set(table, new WeakRef(created));
18
- return created;
5
+ return new RunnableQueryImpl(delegate, schema, table, { table }, defaultFormat, void 0);
19
6
  }
20
7
  var RunnableQueryImpl = class RunnableQueryImpl extends QueryImpl {
21
8
  #delegate;
22
- constructor(delegate, schema, tableName, ast = tableAST(tableName), format = defaultFormat, system = "client", customQueryID, currentJunction) {
9
+ constructor(delegate, schema, tableName, ast = { table: tableName }, format = defaultFormat, system = "client", customQueryID, currentJunction) {
23
10
  super(schema, tableName, ast, format, system, customQueryID, currentJunction, (tableName, ast, format, customQueryID, currentJunction) => new RunnableQueryImpl(delegate, schema, tableName, ast, format, system, customQueryID, currentJunction));
24
11
  this.#delegate = delegate;
25
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runnable-query-impl.js","names":["#delegate"],"sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"sourcesContent":["import {\n getOrInsertComputed,\n newMap,\n newWeakMap,\n} from '../../../shared/src/map.ts';\nimport {\n tableAST,\n type NormalizedAST,\n type System,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {QueryDelegate} from './query-delegate.ts';\nimport {QueryImpl} from './query-impl.ts';\nimport type {\n HumanReadable,\n MaterializeOptions,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\n/**\n * Runnable roots are interned per delegate *and* schema -- a query is only\n * interchangeable with another if it would run against the same delegate. See\n * `query-transitions.ts` for why roots need to be shared at all.\n */\nconst rootsByDelegate = new WeakMap<\n QueryDelegate,\n // oxlint-disable-next-line no-explicit-any\n WeakMap<Schema, Map<string, WeakRef<RunnableQueryImpl<any, any, any>>>>\n>();\n\nexport function newRunnableQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(\n delegate: QueryDelegate,\n schema: TSchema,\n table: TTable,\n): Query<TTable, TSchema> {\n const bySchema = getOrInsertComputed(rootsByDelegate, delegate, newWeakMap);\n const roots = getOrInsertComputed(bySchema, schema, newMap);\n\n const existing = roots.get(table)?.deref();\n if (existing) {\n return existing as RunnableQueryImpl<TTable, TSchema>;\n }\n\n const created = new RunnableQueryImpl<TTable, TSchema>(\n delegate,\n schema,\n table,\n tableAST(table),\n defaultFormat,\n undefined,\n );\n roots.set(table, new WeakRef(created));\n return created;\n}\n\nexport class RunnableQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n extends QueryImpl<TTable, TSchema, TReturn>\n implements Query<TTable, TSchema, TReturn>\n{\n readonly #delegate: QueryDelegate;\n\n constructor(\n delegate: QueryDelegate,\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST = tableAST(tableName),\n format: Format = defaultFormat,\n system: System = 'client',\n customQueryID?: CustomQueryID,\n currentJunction?: string,\n ) {\n super(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n (tableName, ast, format, customQueryID, currentJunction) =>\n new RunnableQueryImpl(\n delegate,\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n ),\n );\n this.#delegate = delegate;\n }\n\n override run(options?: RunOptions): Promise<HumanReadable<TReturn>> {\n // The type arguments on the delegate calls in this class are written out\n // because tsc 7.0.2 fails to infer them in some program layouts (the\n // packages/zero declaration build, apps/zero-throughput): inference\n // collapses TSchema to its constraint and the call misreports as a\n // TS2345 assignability error. Explicit arguments are inert where\n // inference works and correct where it does not.\n return this.#delegate.run<TTable, TSchema, TReturn>(this, options);\n }\n\n override preload(options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n cached: Promise<void>;\n } {\n return this.#delegate.preload<TTable, TSchema, TReturn>(this, options);\n }\n\n override materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n override materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n override materialize<T>(\n factory?: unknown,\n ttl?: unknown,\n ): T | TypedView<HumanReadable<TReturn>> {\n let actualFactory: ViewFactory<TTable, TSchema, TReturn, T> | undefined;\n let options: MaterializeOptions | undefined;\n\n if (typeof factory === 'function') {\n actualFactory = factory as ViewFactory<TTable, TSchema, TReturn, T>;\n options = {ttl: ttl as TTL | undefined};\n } else {\n actualFactory = undefined;\n options = {ttl: factory as TTL | undefined};\n }\n\n return this.#delegate.materialize<TTable, TSchema, TReturn, T>(\n this,\n actualFactory,\n options,\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAgCA,IAAM,kCAAkB,IAAI,QAI1B;AAEF,SAAgB,iBAId,UACA,QACA,OACwB;CAExB,MAAM,QAAQ,oBADG,oBAAoB,iBAAiB,UAAU,UAC9B,GAAU,QAAQ,MAAM;CAE1D,MAAM,WAAW,MAAM,IAAI,KAAK,GAAG,MAAM;CACzC,IAAI,UACF,OAAO;CAGT,MAAM,UAAU,IAAI,kBAClB,UACA,QACA,OACA,SAAS,KAAK,GACd,eACA,KAAA,CACF;CACA,MAAM,IAAI,OAAO,IAAI,QAAQ,OAAO,CAAC;CACrC,OAAO;AACT;AAEA,IAAa,oBAAb,MAAa,0BAKH,UAEV;CACE;CAEA,YACE,UACA,QACA,WACA,MAAqB,SAAS,SAAS,GACvC,SAAiB,eACjB,SAAiB,UACjB,eACA,iBACA;EACA,MACE,QACA,WACA,KACA,QACA,QACA,eACA,kBACC,WAAW,KAAK,QAAQ,eAAe,oBACtC,IAAI,kBACF,UACA,QACA,WACA,KACA,QACA,QACA,eACA,eACF,CACJ;EACA,KAAKA,YAAY;CACnB;CAEA,IAAa,SAAuD;EAOlE,OAAO,KAAKA,UAAU,IAA8B,MAAM,OAAO;CACnE;CAEA,QAAiB,SAIf;EACA,OAAO,KAAKA,UAAU,QAAkC,MAAM,OAAO;CACvE;CAOA,YACE,SACA,KACuC;EACvC,IAAI;EACJ,IAAI;EAEJ,IAAI,OAAO,YAAY,YAAY;GACjC,gBAAgB;GAChB,UAAU,EAAM,IAAsB;EACxC,OAAO;GACL,gBAAgB,KAAA;GAChB,UAAU,EAAC,KAAK,QAA0B;EAC5C;EAEA,OAAO,KAAKA,UAAU,YACpB,MACA,eACA,OACF;CACF;AACF"}
1
+ {"version":3,"file":"runnable-query-impl.js","names":["#delegate"],"sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"sourcesContent":["import type {AST, System} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {QueryDelegate} from './query-delegate.ts';\nimport {QueryImpl} from './query-impl.ts';\nimport type {\n HumanReadable,\n MaterializeOptions,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\nexport function newRunnableQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(\n delegate: QueryDelegate,\n schema: TSchema,\n table: TTable,\n): Query<TTable, TSchema> {\n return new RunnableQueryImpl(\n delegate,\n schema,\n table,\n {table},\n defaultFormat,\n undefined,\n );\n}\n\nexport class RunnableQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n extends QueryImpl<TTable, TSchema, TReturn>\n implements Query<TTable, TSchema, TReturn>\n{\n readonly #delegate: QueryDelegate;\n\n constructor(\n delegate: QueryDelegate,\n schema: TSchema,\n tableName: TTable,\n ast: AST = {table: tableName},\n format: Format = defaultFormat,\n system: System = 'client',\n customQueryID?: CustomQueryID,\n currentJunction?: string,\n ) {\n super(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n (tableName, ast, format, customQueryID, currentJunction) =>\n new RunnableQueryImpl(\n delegate,\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n ),\n );\n this.#delegate = delegate;\n }\n\n override run(options?: RunOptions): Promise<HumanReadable<TReturn>> {\n return this.#delegate.run(this, options);\n }\n\n override preload(options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n return this.#delegate.preload(this, options);\n }\n\n override materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n override materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n override materialize<T>(\n factory?: unknown,\n ttl?: unknown,\n ): T | TypedView<HumanReadable<TReturn>> {\n let actualFactory: ViewFactory<TTable, TSchema, TReturn, T> | undefined;\n let options: MaterializeOptions | undefined;\n\n if (typeof factory === 'function') {\n actualFactory = factory as ViewFactory<TTable, TSchema, TReturn, T>;\n options = {ttl: ttl as TTL | undefined};\n } else {\n actualFactory = undefined;\n options = {ttl: factory as TTL | undefined};\n }\n\n return this.#delegate.materialize(this, actualFactory, options);\n }\n}\n"],"mappings":";;;AAkBA,SAAgB,iBAId,UACA,QACA,OACwB;CACxB,OAAO,IAAI,kBACT,UACA,QACA,OACA,EAAC,MAAK,GACN,eACA,KAAA,CACF;AACF;AAEA,IAAa,oBAAb,MAAa,0BAKH,UAEV;CACE;CAEA,YACE,UACA,QACA,WACA,MAAW,EAAC,OAAO,UAAS,GAC5B,SAAiB,eACjB,SAAiB,UACjB,eACA,iBACA;EACA,MACE,QACA,WACA,KACA,QACA,QACA,eACA,kBACC,WAAW,KAAK,QAAQ,eAAe,oBACtC,IAAI,kBACF,UACA,QACA,WACA,KACA,QACA,QACA,eACA,eACF,CACJ;EACA,KAAKA,YAAY;CACnB;CAEA,IAAa,SAAuD;EAClE,OAAO,KAAKA,UAAU,IAAI,MAAM,OAAO;CACzC;CAEA,QAAiB,SAGf;EACA,OAAO,KAAKA,UAAU,QAAQ,MAAM,OAAO;CAC7C;CAOA,YACE,SACA,KACuC;EACvC,IAAI;EACJ,IAAI;EAEJ,IAAI,OAAO,YAAY,YAAY;GACjC,gBAAgB;GAChB,UAAU,EAAM,IAAsB;EACxC,OAAO;GACL,gBAAgB,KAAA;GAChB,UAAU,EAAC,KAAK,QAA0B;EAC5C;EAEA,OAAO,KAAKA,UAAU,YAAY,MAAM,eAAe,OAAO;CAChE;AACF"}
@@ -1,7 +1,7 @@
1
1
  import type { Immutable } from '../../../shared/src/immutable.ts';
2
2
  import type { ErroredQuery } from '../../../zero-protocol/src/custom-queries.ts';
3
3
  import type { TTL } from './ttl.ts';
4
- export type ResultType = 'unknown' | 'cached' | 'complete' | 'error';
4
+ export type ResultType = 'unknown' | 'complete' | 'error';
5
5
  /**
6
6
  * Called when the view changes. The received data should be considered
7
7
  * immutable. Caller must not modify it. Passed data is valid until next
@@ -1 +1 @@
1
- {"version":3,"file":"typed-view.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/typed-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,8CAA8C,CAAC;AAC/E,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAElC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAErE;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CACxB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAClB,UAAU,EAAE,UAAU,EACtB,KAAK,CAAC,EAAE,YAAY,KACjB,IAAI,CAAC;AAEV,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;IAChB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"typed-view.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/typed-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,8CAA8C,CAAC;AAC/E,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAElC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CACxB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAClB,UAAU,EAAE,UAAU,EACtB,KAAK,CAAC,EAAE,YAAY,KACjB,IAAI,CAAC;AAEV,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;IAChB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB,CAAC"}
@@ -9,15 +9,7 @@ export declare class Database implements Disposable {
9
9
  pragma<T = unknown>(sql: string): T[];
10
10
  compact(freeableBytesThreshold: number): void;
11
11
  unsafeMode(unsafe: boolean): void;
12
- /**
13
- * Closes the database. For writable connections, `PRAGMA optimize` is run
14
- * first (as recommended by SQLite) unless `optimize` is `false`, which is
15
- * appropriate for short-lived handles on a database whose statistics are
16
- * maintained by a longer-lived writer.
17
- */
18
- close({ optimize }?: {
19
- optimize?: boolean | undefined;
20
- }): void;
12
+ close(): void;
21
13
  transaction<T>(fn: () => T): T;
22
14
  get name(): string;
23
15
  get inTransaction(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,eAAe,EAAE,EAEtB,KAAK,SAAS,EACd,KAAK,SAAS,IAAI,gBAAgB,EACnC,MAAM,wBAAwB,CAAC;AAehC,qBAAa,QAAS,YAAW,UAAU;;gBAOvC,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,EACjC,kBAAkB,SAAM;IAwB1B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAc/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE;IAQrC,OAAO,CAAC,sBAAsB,EAAE,MAAM;IAyCtC,UAAU,CAAC,MAAM,EAAE,OAAO;IAuB1B;;;;;OAKG;IACH,KAAK,CAAC,EAAC,QAAe,EAAC,GAAE;QAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAM,GAAG,IAAI;IAgBrE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAI9B,IAAI,IAAI,WAEP;IAED,IAAI,aAAa,YAEhB;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGzB;AAED,qBAAa,SAAS;;IAKpB,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACtD,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;gBAG5D,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM;IAUnB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS;IAYpC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;IAY/B,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAYjC,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAQtD;AAkFD;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;CAAG"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,eAAe,EAAE,EAEtB,KAAK,SAAS,EACd,KAAK,SAAS,IAAI,gBAAgB,EACnC,MAAM,wBAAwB,CAAC;AAehC,qBAAa,QAAS,YAAW,UAAU;;gBAOvC,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,EACjC,kBAAkB,SAAM;IAwB1B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAc/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE;IAQrC,OAAO,CAAC,sBAAsB,EAAE,MAAM;IAyCtC,UAAU,CAAC,MAAM,EAAE,OAAO;IAuB1B,KAAK,IAAI,IAAI;IAgBb,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAI9B,IAAI,IAAI,WAEP;IAED,IAAI,aAAa,YAEhB;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGzB;AAED,qBAAa,SAAS;;IAKpB,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACtD,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;gBAG5D,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM;IAUnB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS;IAYpC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;IAY/B,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAYjC,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAQtD;AAkFD;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;CAAG"}
@@ -73,15 +73,9 @@ var Database = class {
73
73
  logIfSlow(this.#lc.withContext("method", method), performance.now() - start, { method }, this.#threshold);
74
74
  }
75
75
  }
76
- /**
77
- * Closes the database. For writable connections, `PRAGMA optimize` is run
78
- * first (as recommended by SQLite) unless `optimize` is `false`, which is
79
- * appropriate for short-lived handles on a database whose statistics are
80
- * maintained by a longer-lived writer.
81
- */
82
- close({ optimize = true } = {}) {
76
+ close() {
83
77
  const start = Date.now();
84
- if (optimize && !this.#db.readonly) try {
78
+ if (!this.#db.readonly) try {
85
79
  this.#db.pragma("optimize");
86
80
  const elapsed = Date.now() - start;
87
81
  if (elapsed > 2) this.#lc.debug?.(`PRAGMA optimized (${elapsed} ms)`);
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","names":["#db","#threshold","#lc","#pageSize","#run","#bytes","#stmt","#attrs","#it","#start","#sqliteRowTimeSum","#log"],"sources":["../../../../zqlite/src/db.ts"],"sourcesContent":["import {trace, type Attributes} from '@opentelemetry/api';\nimport type {LogContext} from '@rocicorp/logger';\nimport SQLite3Database, {\n SqliteError,\n type RunResult,\n type Statement as SQLite3Statement,\n} from '@rocicorp/zero-sqlite3';\nimport {manualSpan} from '../../otel/src/span.ts';\nimport {version} from '../../otel/src/version.ts';\n\nconst tracer = trace.getTracer('view-syncer', version);\n\n// https://www.sqlite.org/pragma.html#pragma_auto_vacuum\nconst AUTO_VACUUM_INCREMENTAL = 2;\n\nconst MB = 1024 * 1024;\n\nfunction mb(bytes: number): string {\n return (bytes / MB).toFixed(2);\n}\n\nexport class Database implements Disposable {\n readonly #db: SQLite3Database.Database;\n readonly #threshold: number;\n readonly #lc: LogContext;\n readonly #pageSize: number;\n\n constructor(\n lc: LogContext,\n path: string,\n options?: SQLite3Database.Options,\n slowQueryThreshold = 100,\n ) {\n try {\n this.#lc = lc.withContext('class', 'Database').withContext('path', path);\n this.#db = new SQLite3Database(path, options);\n this.#threshold = slowQueryThreshold;\n\n // Match Postgres LIKE/ILIKE semantics. Postgres LIKE is case-sensitive,\n // but SQLite's LIKE operator is case-insensitive by default; enable\n // case-sensitive LIKE so the bare operator matches Postgres. Case-\n // insensitive ILIKE is handled in query-builder.ts by lower()-ing both\n // operands (using the Unicode-aware lower() that @rocicorp/zero-sqlite3\n // provides via ICU).\n this.pragma('case_sensitive_like = ON');\n\n const [{page_size: pageSize}] = this.pragma<{page_size: number}>(\n 'page_size',\n );\n this.#pageSize = pageSize;\n } catch (cause) {\n throw new DatabaseInitError(String(cause), {cause});\n }\n }\n\n prepare(sql: string): Statement {\n return this.#run(\n 'prepare',\n sql,\n () =>\n new Statement(\n this.#lc.withContext('sql', sql),\n {class: 'Statement', sql},\n this.#db.prepare(sql),\n this.#threshold,\n ),\n );\n }\n\n exec(sql: string): void {\n this.#run('exec', sql, () => this.#db.exec(sql));\n }\n\n pragma<T = unknown>(sql: string): T[] {\n return this.#run<T[]>('pragma', sql, () => this.#db.pragma(sql) as T[]);\n }\n\n #bytes(pages: number) {\n return pages * this.#pageSize;\n }\n\n compact(freeableBytesThreshold: number) {\n const [{freelist_count: freelistCount}] = this.pragma<{\n freelist_count: number;\n }>('freelist_count');\n\n const freeable = this.#bytes(freelistCount);\n if (freeable < freeableBytesThreshold) {\n this.#lc.debug?.(\n `Not compacting ${this.#db.name}: ${mb(freeable)} freeable MB`,\n );\n return;\n }\n const [{auto_vacuum: autoVacuumMode}] = this.pragma<{auto_vacuum: number}>(\n 'auto_vacuum',\n );\n if (autoVacuumMode !== AUTO_VACUUM_INCREMENTAL) {\n this.#lc.warn?.(\n `Cannot compact ${mb(freeable)} MB of ` +\n `${this.#db.name} because AUTO_VACUUM mode is ${autoVacuumMode}.`,\n );\n return;\n }\n const start = Date.now();\n const [{page_count: pageCountBefore}] = this.pragma<{page_count: number}>(\n 'page_count',\n );\n\n this.pragma('incremental_vacuum');\n\n const [{page_count: pageCountAfter}] = this.pragma<{page_count: number}>(\n 'page_count',\n );\n\n this.#lc.info?.(\n `Compacted ${this.#db.name} from ` +\n `${mb(this.#bytes(pageCountBefore))} MB to ` +\n `${mb(this.#bytes(pageCountAfter))} MB ` +\n `(${Date.now() - start} ms)`,\n );\n }\n\n unsafeMode(unsafe: boolean) {\n this.#db.unsafeMode(unsafe);\n }\n\n #run<T>(method: string, sql: string, fn: () => T): T {\n const start = performance.now();\n try {\n return fn();\n } catch (e) {\n if (e instanceof SqliteError) {\n e.message += `: ${sql}`;\n }\n throw e;\n } finally {\n logIfSlow(\n this.#lc.withContext('method', method),\n performance.now() - start,\n {method},\n this.#threshold,\n );\n }\n }\n\n /**\n * Closes the database. For writable connections, `PRAGMA optimize` is run\n * first (as recommended by SQLite) unless `optimize` is `false`, which is\n * appropriate for short-lived handles on a database whose statistics are\n * maintained by a longer-lived writer.\n */\n close({optimize = true}: {optimize?: boolean | undefined} = {}): void {\n const start = Date.now();\n if (optimize && !this.#db.readonly) {\n try {\n this.#db.pragma('optimize');\n const elapsed = Date.now() - start;\n if (elapsed > 2) {\n this.#lc.debug?.(`PRAGMA optimized (${elapsed} ms)`);\n }\n } catch (e) {\n this.#lc.warn?.('error running PRAGMA optimize', e);\n }\n }\n this.#db.close();\n }\n\n transaction<T>(fn: () => T): T {\n return this.#db.transaction(fn)();\n }\n\n get name() {\n return this.#db.name;\n }\n\n get inTransaction() {\n return this.#db.inTransaction;\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n}\n\nexport class Statement {\n readonly #stmt: SQLite3Statement;\n readonly #lc: LogContext;\n readonly #threshold: number;\n readonly #attrs: Attributes;\n readonly scanStatus: SQLite3Statement['scanStatusV2'];\n readonly scanStatusReset: SQLite3Statement['scanStatusReset'];\n\n constructor(\n lc: LogContext,\n attrs: Attributes,\n stmt: SQLite3Statement,\n threshold: number,\n ) {\n this.#lc = lc.withContext('class', 'Statement');\n this.#attrs = attrs;\n this.#stmt = stmt;\n this.#threshold = threshold;\n this.scanStatus = this.#stmt.scanStatusV2.bind(this.#stmt);\n this.scanStatusReset = this.#stmt.scanStatusReset.bind(this.#stmt);\n }\n\n safeIntegers(useBigInt: boolean): this {\n this.#stmt.safeIntegers(useBigInt);\n return this;\n }\n\n run(...params: unknown[]): RunResult {\n const start = performance.now();\n const ret = this.#stmt.run(...params);\n logIfSlow(\n this.#lc.withContext('method', 'run'),\n performance.now() - start,\n {...this.#attrs, method: 'run'},\n this.#threshold,\n );\n return ret;\n }\n\n get<T>(...params: unknown[]): T {\n const start = performance.now();\n const ret = this.#stmt.get(...params);\n logIfSlow(\n this.#lc.withContext('method', 'get'),\n performance.now() - start,\n {...this.#attrs, method: 'get'},\n this.#threshold,\n );\n return ret as T;\n }\n\n all<T>(...params: unknown[]): T[] {\n const start = performance.now();\n const ret = this.#stmt.all(...params);\n logIfSlow(\n this.#lc.withContext('method', 'all'),\n performance.now() - start,\n {...this.#attrs, method: 'all'},\n this.#threshold,\n );\n return ret as T[];\n }\n\n iterate<T>(...params: unknown[]): IterableIterator<T> {\n return new LoggingIterableIterator(\n this.#lc.withContext('method', 'iterate'),\n this.#attrs,\n this.#stmt.iterate(...params),\n this.#threshold,\n ) as IterableIterator<T>;\n }\n}\n\nclass LoggingIterableIterator<T> implements IterableIterator<T> {\n readonly #lc: LogContext;\n readonly #it: IterableIterator<T>;\n readonly #threshold: number;\n readonly #attrs: Attributes;\n #start: number;\n #sqliteRowTimeSum: number;\n\n constructor(\n lc: LogContext,\n attrs: Attributes,\n it: IterableIterator<T>,\n slowQueryThreshold: number,\n ) {\n this.#lc = lc;\n this.#attrs = attrs;\n this.#it = it;\n this.#start = performance.now();\n this.#threshold = slowQueryThreshold;\n this.#sqliteRowTimeSum = 0;\n }\n\n next(): IteratorResult<T> {\n const start = performance.now();\n const ret = this.#it.next();\n const elapsed = performance.now() - start;\n this.#sqliteRowTimeSum += elapsed;\n if (ret.done) {\n this.#log();\n }\n return ret;\n }\n\n #log() {\n logIfSlow(\n this.#lc.withContext('type', 'total'),\n performance.now() - this.#start,\n {...this.#attrs, type: 'total', method: 'iterate'},\n this.#threshold,\n );\n logIfSlow(\n this.#lc.withContext('type', 'sqlite'),\n this.#sqliteRowTimeSum,\n {...this.#attrs, type: 'sqlite', method: 'iterate'},\n this.#threshold,\n );\n }\n\n [Symbol.iterator](): IterableIterator<T> {\n return this;\n }\n\n return(): IteratorResult<T> {\n this.#log();\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return this.#it.return?.() as any;\n }\n\n throw(e: unknown): IteratorResult<T> {\n this.#log();\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return this.#it.throw?.(e) as any;\n }\n}\n\nfunction logIfSlow(\n lc: LogContext,\n elapsed: number,\n attrs: Attributes,\n threshold: number,\n): void {\n if (elapsed >= threshold) {\n for (const [key, value] of Object.entries(attrs)) {\n lc = lc.withContext(key, value);\n }\n lc.warn?.('Slow SQLite query', elapsed);\n manualSpan(tracer, 'db.slow-query', elapsed, attrs);\n }\n}\n\n/**\n * An error indicating that the Database failed to open. This essentially\n * wraps the TypeError thrown by the better-sqlite3 package with something\n * more specific.\n */\nexport class DatabaseInitError extends Error {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"db.js","names":["#db","#threshold","#lc","#pageSize","#run","#bytes","#stmt","#attrs","#it","#start","#sqliteRowTimeSum","#log"],"sources":["../../../../zqlite/src/db.ts"],"sourcesContent":["import {trace, type Attributes} from '@opentelemetry/api';\nimport type {LogContext} from '@rocicorp/logger';\nimport SQLite3Database, {\n SqliteError,\n type RunResult,\n type Statement as SQLite3Statement,\n} from '@rocicorp/zero-sqlite3';\nimport {manualSpan} from '../../otel/src/span.ts';\nimport {version} from '../../otel/src/version.ts';\n\nconst tracer = trace.getTracer('view-syncer', version);\n\n// https://www.sqlite.org/pragma.html#pragma_auto_vacuum\nconst AUTO_VACUUM_INCREMENTAL = 2;\n\nconst MB = 1024 * 1024;\n\nfunction mb(bytes: number): string {\n return (bytes / MB).toFixed(2);\n}\n\nexport class Database implements Disposable {\n readonly #db: SQLite3Database.Database;\n readonly #threshold: number;\n readonly #lc: LogContext;\n readonly #pageSize: number;\n\n constructor(\n lc: LogContext,\n path: string,\n options?: SQLite3Database.Options,\n slowQueryThreshold = 100,\n ) {\n try {\n this.#lc = lc.withContext('class', 'Database').withContext('path', path);\n this.#db = new SQLite3Database(path, options);\n this.#threshold = slowQueryThreshold;\n\n // Match Postgres LIKE/ILIKE semantics. Postgres LIKE is case-sensitive,\n // but SQLite's LIKE operator is case-insensitive by default; enable\n // case-sensitive LIKE so the bare operator matches Postgres. Case-\n // insensitive ILIKE is handled in query-builder.ts by lower()-ing both\n // operands (using the Unicode-aware lower() that @rocicorp/zero-sqlite3\n // provides via ICU).\n this.pragma('case_sensitive_like = ON');\n\n const [{page_size: pageSize}] = this.pragma<{page_size: number}>(\n 'page_size',\n );\n this.#pageSize = pageSize;\n } catch (cause) {\n throw new DatabaseInitError(String(cause), {cause});\n }\n }\n\n prepare(sql: string): Statement {\n return this.#run(\n 'prepare',\n sql,\n () =>\n new Statement(\n this.#lc.withContext('sql', sql),\n {class: 'Statement', sql},\n this.#db.prepare(sql),\n this.#threshold,\n ),\n );\n }\n\n exec(sql: string): void {\n this.#run('exec', sql, () => this.#db.exec(sql));\n }\n\n pragma<T = unknown>(sql: string): T[] {\n return this.#run<T[]>('pragma', sql, () => this.#db.pragma(sql) as T[]);\n }\n\n #bytes(pages: number) {\n return pages * this.#pageSize;\n }\n\n compact(freeableBytesThreshold: number) {\n const [{freelist_count: freelistCount}] = this.pragma<{\n freelist_count: number;\n }>('freelist_count');\n\n const freeable = this.#bytes(freelistCount);\n if (freeable < freeableBytesThreshold) {\n this.#lc.debug?.(\n `Not compacting ${this.#db.name}: ${mb(freeable)} freeable MB`,\n );\n return;\n }\n const [{auto_vacuum: autoVacuumMode}] = this.pragma<{auto_vacuum: number}>(\n 'auto_vacuum',\n );\n if (autoVacuumMode !== AUTO_VACUUM_INCREMENTAL) {\n this.#lc.warn?.(\n `Cannot compact ${mb(freeable)} MB of ` +\n `${this.#db.name} because AUTO_VACUUM mode is ${autoVacuumMode}.`,\n );\n return;\n }\n const start = Date.now();\n const [{page_count: pageCountBefore}] = this.pragma<{page_count: number}>(\n 'page_count',\n );\n\n this.pragma('incremental_vacuum');\n\n const [{page_count: pageCountAfter}] = this.pragma<{page_count: number}>(\n 'page_count',\n );\n\n this.#lc.info?.(\n `Compacted ${this.#db.name} from ` +\n `${mb(this.#bytes(pageCountBefore))} MB to ` +\n `${mb(this.#bytes(pageCountAfter))} MB ` +\n `(${Date.now() - start} ms)`,\n );\n }\n\n unsafeMode(unsafe: boolean) {\n this.#db.unsafeMode(unsafe);\n }\n\n #run<T>(method: string, sql: string, fn: () => T): T {\n const start = performance.now();\n try {\n return fn();\n } catch (e) {\n if (e instanceof SqliteError) {\n e.message += `: ${sql}`;\n }\n throw e;\n } finally {\n logIfSlow(\n this.#lc.withContext('method', method),\n performance.now() - start,\n {method},\n this.#threshold,\n );\n }\n }\n\n close(): void {\n const start = Date.now();\n if (!this.#db.readonly) {\n try {\n this.#db.pragma('optimize');\n const elapsed = Date.now() - start;\n if (elapsed > 2) {\n this.#lc.debug?.(`PRAGMA optimized (${elapsed} ms)`);\n }\n } catch (e) {\n this.#lc.warn?.('error running PRAGMA optimize', e);\n }\n }\n this.#db.close();\n }\n\n transaction<T>(fn: () => T): T {\n return this.#db.transaction(fn)();\n }\n\n get name() {\n return this.#db.name;\n }\n\n get inTransaction() {\n return this.#db.inTransaction;\n }\n\n [Symbol.dispose](): void {\n this.close();\n }\n}\n\nexport class Statement {\n readonly #stmt: SQLite3Statement;\n readonly #lc: LogContext;\n readonly #threshold: number;\n readonly #attrs: Attributes;\n readonly scanStatus: SQLite3Statement['scanStatusV2'];\n readonly scanStatusReset: SQLite3Statement['scanStatusReset'];\n\n constructor(\n lc: LogContext,\n attrs: Attributes,\n stmt: SQLite3Statement,\n threshold: number,\n ) {\n this.#lc = lc.withContext('class', 'Statement');\n this.#attrs = attrs;\n this.#stmt = stmt;\n this.#threshold = threshold;\n this.scanStatus = this.#stmt.scanStatusV2.bind(this.#stmt);\n this.scanStatusReset = this.#stmt.scanStatusReset.bind(this.#stmt);\n }\n\n safeIntegers(useBigInt: boolean): this {\n this.#stmt.safeIntegers(useBigInt);\n return this;\n }\n\n run(...params: unknown[]): RunResult {\n const start = performance.now();\n const ret = this.#stmt.run(...params);\n logIfSlow(\n this.#lc.withContext('method', 'run'),\n performance.now() - start,\n {...this.#attrs, method: 'run'},\n this.#threshold,\n );\n return ret;\n }\n\n get<T>(...params: unknown[]): T {\n const start = performance.now();\n const ret = this.#stmt.get(...params);\n logIfSlow(\n this.#lc.withContext('method', 'get'),\n performance.now() - start,\n {...this.#attrs, method: 'get'},\n this.#threshold,\n );\n return ret as T;\n }\n\n all<T>(...params: unknown[]): T[] {\n const start = performance.now();\n const ret = this.#stmt.all(...params);\n logIfSlow(\n this.#lc.withContext('method', 'all'),\n performance.now() - start,\n {...this.#attrs, method: 'all'},\n this.#threshold,\n );\n return ret as T[];\n }\n\n iterate<T>(...params: unknown[]): IterableIterator<T> {\n return new LoggingIterableIterator(\n this.#lc.withContext('method', 'iterate'),\n this.#attrs,\n this.#stmt.iterate(...params),\n this.#threshold,\n ) as IterableIterator<T>;\n }\n}\n\nclass LoggingIterableIterator<T> implements IterableIterator<T> {\n readonly #lc: LogContext;\n readonly #it: IterableIterator<T>;\n readonly #threshold: number;\n readonly #attrs: Attributes;\n #start: number;\n #sqliteRowTimeSum: number;\n\n constructor(\n lc: LogContext,\n attrs: Attributes,\n it: IterableIterator<T>,\n slowQueryThreshold: number,\n ) {\n this.#lc = lc;\n this.#attrs = attrs;\n this.#it = it;\n this.#start = performance.now();\n this.#threshold = slowQueryThreshold;\n this.#sqliteRowTimeSum = 0;\n }\n\n next(): IteratorResult<T> {\n const start = performance.now();\n const ret = this.#it.next();\n const elapsed = performance.now() - start;\n this.#sqliteRowTimeSum += elapsed;\n if (ret.done) {\n this.#log();\n }\n return ret;\n }\n\n #log() {\n logIfSlow(\n this.#lc.withContext('type', 'total'),\n performance.now() - this.#start,\n {...this.#attrs, type: 'total', method: 'iterate'},\n this.#threshold,\n );\n logIfSlow(\n this.#lc.withContext('type', 'sqlite'),\n this.#sqliteRowTimeSum,\n {...this.#attrs, type: 'sqlite', method: 'iterate'},\n this.#threshold,\n );\n }\n\n [Symbol.iterator](): IterableIterator<T> {\n return this;\n }\n\n return(): IteratorResult<T> {\n this.#log();\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return this.#it.return?.() as any;\n }\n\n throw(e: unknown): IteratorResult<T> {\n this.#log();\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return this.#it.throw?.(e) as any;\n }\n}\n\nfunction logIfSlow(\n lc: LogContext,\n elapsed: number,\n attrs: Attributes,\n threshold: number,\n): void {\n if (elapsed >= threshold) {\n for (const [key, value] of Object.entries(attrs)) {\n lc = lc.withContext(key, value);\n }\n lc.warn?.('Slow SQLite query', elapsed);\n manualSpan(tracer, 'db.slow-query', elapsed, attrs);\n }\n}\n\n/**\n * An error indicating that the Database failed to open. This essentially\n * wraps the TypeError thrown by the better-sqlite3 package with something\n * more specific.\n */\nexport class DatabaseInitError extends Error {}\n"],"mappings":"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"}