@rocicorp/zero 1.11.0-canary.3 → 1.11.0-canary.30

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 (988) hide show
  1. package/out/analyze-query/src/analyze-cli.js +4 -4
  2. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  3. package/out/analyze-query/src/bin-analyze.js +13 -12
  4. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  5. package/out/analyze-query/src/bin-transform.js +1 -1
  6. package/out/analyze-query/src/bin-transform.js.map +1 -1
  7. package/out/ast-to-zql/src/ast-to-zql.d.ts +8 -1
  8. package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
  9. package/out/ast-to-zql/src/ast-to-zql.js +25 -25
  10. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  11. package/out/otel/src/log-options.d.ts +16 -0
  12. package/out/otel/src/log-options.d.ts.map +1 -1
  13. package/out/otel/src/log-options.js +60 -6
  14. package/out/otel/src/log-options.js.map +1 -1
  15. package/out/replicache/src/bg-interval.d.ts +2 -1
  16. package/out/replicache/src/bg-interval.d.ts.map +1 -1
  17. package/out/replicache/src/bg-interval.js +13 -4
  18. package/out/replicache/src/bg-interval.js.map +1 -1
  19. package/out/replicache/src/btree/node.d.ts.map +1 -1
  20. package/out/replicache/src/btree/node.js +3 -6
  21. package/out/replicache/src/btree/node.js.map +1 -1
  22. package/out/replicache/src/dag/gc.d.ts.map +1 -1
  23. package/out/replicache/src/dag/gc.js +8 -11
  24. package/out/replicache/src/dag/gc.js.map +1 -1
  25. package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
  26. package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
  27. package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
  28. package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
  29. package/out/replicache/src/dag/lazy-store.d.ts +17 -4
  30. package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
  31. package/out/replicache/src/dag/lazy-store.js +35 -9
  32. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  33. package/out/replicache/src/dag/store-impl.d.ts +12 -2
  34. package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
  35. package/out/replicache/src/dag/store-impl.js +29 -9
  36. package/out/replicache/src/dag/store-impl.js.map +1 -1
  37. package/out/replicache/src/db/rebase.d.ts +14 -2
  38. package/out/replicache/src/db/rebase.d.ts.map +1 -1
  39. package/out/replicache/src/db/rebase.js +27 -5
  40. package/out/replicache/src/db/rebase.js.map +1 -1
  41. package/out/replicache/src/get-kv-store-provider.d.ts +1 -1
  42. package/out/replicache/src/get-kv-store-provider.d.ts.map +1 -1
  43. package/out/replicache/src/get-kv-store-provider.js +4 -4
  44. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  45. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
  46. package/out/replicache/src/kv/expo-sqlite/store.js +28 -5
  47. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  48. package/out/replicache/src/kv/idb-store.d.ts +18 -0
  49. package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
  50. package/out/replicache/src/kv/idb-store.js +30 -2
  51. package/out/replicache/src/kv/idb-store.js.map +1 -1
  52. package/out/replicache/src/kv/mem-fallback-store.d.ts +54 -0
  53. package/out/replicache/src/kv/mem-fallback-store.d.ts.map +1 -0
  54. package/out/replicache/src/kv/mem-fallback-store.js +177 -0
  55. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -0
  56. package/out/replicache/src/kv/mem-store.d.ts +1 -0
  57. package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
  58. package/out/replicache/src/kv/mem-store.js +3 -0
  59. package/out/replicache/src/kv/mem-store.js.map +1 -1
  60. package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
  61. package/out/replicache/src/kv/op-sqlite/store.js +4 -4
  62. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  63. package/out/replicache/src/kv/sqlite-store.d.ts +22 -1
  64. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  65. package/out/replicache/src/kv/sqlite-store.js +159 -14
  66. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  67. package/out/replicache/src/kv/store.d.ts +6 -0
  68. package/out/replicache/src/kv/store.d.ts.map +1 -1
  69. package/out/replicache/src/new-client-channel.js.map +1 -1
  70. package/out/replicache/src/persist/client-gc.d.ts +2 -1
  71. package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
  72. package/out/replicache/src/persist/client-gc.js +2 -2
  73. package/out/replicache/src/persist/client-gc.js.map +1 -1
  74. package/out/replicache/src/persist/client-group-gc.d.ts +2 -1
  75. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  76. package/out/replicache/src/persist/client-group-gc.js +2 -2
  77. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  78. package/out/replicache/src/persist/clients.d.ts +2 -2
  79. package/out/replicache/src/persist/collect-idb-databases.d.ts +28 -8
  80. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  81. package/out/replicache/src/persist/collect-idb-databases.js +97 -20
  82. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  83. package/out/replicache/src/persist/heartbeat.d.ts +2 -1
  84. package/out/replicache/src/persist/heartbeat.d.ts.map +1 -1
  85. package/out/replicache/src/persist/heartbeat.js +2 -2
  86. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  87. package/out/replicache/src/persist/idb-databases-store-db-name.js +1 -1
  88. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  89. package/out/replicache/src/persist/persist.d.ts.map +1 -1
  90. package/out/replicache/src/persist/persist.js +18 -8
  91. package/out/replicache/src/persist/persist.js.map +1 -1
  92. package/out/replicache/src/persist/refresh.js +6 -2
  93. package/out/replicache/src/persist/refresh.js.map +1 -1
  94. package/out/replicache/src/replicache-impl.d.ts +85 -3
  95. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  96. package/out/replicache/src/replicache-impl.js +321 -29
  97. package/out/replicache/src/replicache-impl.js.map +1 -1
  98. package/out/replicache/src/replicache-options.d.ts +9 -0
  99. package/out/replicache/src/replicache-options.d.ts.map +1 -1
  100. package/out/replicache/src/storage-failure.d.ts +37 -0
  101. package/out/replicache/src/storage-failure.d.ts.map +1 -0
  102. package/out/replicache/src/storage-failure.js +31 -0
  103. package/out/replicache/src/storage-failure.js.map +1 -0
  104. package/out/shared/src/arrays.d.ts +5 -0
  105. package/out/shared/src/arrays.d.ts.map +1 -1
  106. package/out/shared/src/arrays.js +8 -10
  107. package/out/shared/src/arrays.js.map +1 -1
  108. package/out/shared/src/base64.d.ts +19 -0
  109. package/out/shared/src/base64.d.ts.map +1 -0
  110. package/out/shared/src/base64.js +40 -0
  111. package/out/shared/src/base64.js.map +1 -0
  112. package/out/shared/src/centroid.d.ts +0 -1
  113. package/out/shared/src/centroid.d.ts.map +1 -1
  114. package/out/shared/src/centroid.js +1 -4
  115. package/out/shared/src/centroid.js.map +1 -1
  116. package/out/shared/src/error.d.ts +11 -0
  117. package/out/shared/src/error.d.ts.map +1 -1
  118. package/out/shared/src/error.js +35 -1
  119. package/out/shared/src/error.js.map +1 -1
  120. package/out/shared/src/hash.d.ts.map +1 -1
  121. package/out/shared/src/hash.js +32 -7
  122. package/out/shared/src/hash.js.map +1 -1
  123. package/out/shared/src/iterables.d.ts +2 -0
  124. package/out/shared/src/iterables.d.ts.map +1 -1
  125. package/out/shared/src/iterables.js +18 -1
  126. package/out/shared/src/iterables.js.map +1 -1
  127. package/out/shared/src/map.d.ts +24 -2
  128. package/out/shared/src/map.d.ts.map +1 -1
  129. package/out/shared/src/map.js +18 -4
  130. package/out/shared/src/map.js.map +1 -1
  131. package/out/shared/src/options-types.d.ts +2 -2
  132. package/out/shared/src/options.d.ts.map +1 -1
  133. package/out/shared/src/options.js +10 -7
  134. package/out/shared/src/options.js.map +1 -1
  135. package/out/shared/src/packed-boolean-map.d.ts +7 -0
  136. package/out/shared/src/packed-boolean-map.d.ts.map +1 -0
  137. package/out/shared/src/packed-boolean-map.js +36 -0
  138. package/out/shared/src/packed-boolean-map.js.map +1 -0
  139. package/out/shared/src/random-values.js +12 -1
  140. package/out/shared/src/random-values.js.map +1 -1
  141. package/out/shared/src/ring-buffer.d.ts +10 -0
  142. package/out/shared/src/ring-buffer.d.ts.map +1 -1
  143. package/out/shared/src/ring-buffer.js +26 -1
  144. package/out/shared/src/ring-buffer.js.map +1 -1
  145. package/out/shared/src/tdigest.d.ts +10 -0
  146. package/out/shared/src/tdigest.d.ts.map +1 -1
  147. package/out/shared/src/tdigest.js +147 -63
  148. package/out/shared/src/tdigest.js.map +1 -1
  149. package/out/shared/src/valita.d.ts +13 -0
  150. package/out/shared/src/valita.d.ts.map +1 -1
  151. package/out/shared/src/valita.js +23 -23
  152. package/out/shared/src/valita.js.map +1 -1
  153. package/out/z2s/src/compiler.d.ts.map +1 -1
  154. package/out/z2s/src/compiler.js +10 -6
  155. package/out/z2s/src/compiler.js.map +1 -1
  156. package/out/z2s/src/sql.d.ts.map +1 -1
  157. package/out/z2s/src/sql.js +9 -5
  158. package/out/z2s/src/sql.js.map +1 -1
  159. package/out/zero/package.js +4 -5
  160. package/out/zero/package.js.map +1 -1
  161. package/out/zero/src/zero.js +2 -1
  162. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  163. package/out/zero-cache/src/auth/write-authorizer.js +1 -0
  164. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  165. package/out/zero-cache/src/config/normalize.d.ts +1 -0
  166. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  167. package/out/zero-cache/src/config/normalize.js +46 -4
  168. package/out/zero-cache/src/config/normalize.js.map +1 -1
  169. package/out/zero-cache/src/config/zero-config.d.ts +116 -24
  170. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  171. package/out/zero-cache/src/config/zero-config.js +409 -157
  172. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  173. package/out/zero-cache/src/custom/fetch.d.ts +1 -1
  174. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  175. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  176. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  177. package/out/zero-cache/src/db/lite-tables.js +3 -4
  178. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  179. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  180. package/out/zero-cache/src/db/migration-lite.js +5 -3
  181. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  182. package/out/zero-cache/src/observability/events.js +4 -1
  183. package/out/zero-cache/src/observability/events.js.map +1 -1
  184. package/out/zero-cache/src/observability/log-throttle.d.ts +44 -0
  185. package/out/zero-cache/src/observability/log-throttle.d.ts.map +1 -0
  186. package/out/zero-cache/src/observability/log-throttle.js +76 -0
  187. package/out/zero-cache/src/observability/log-throttle.js.map +1 -0
  188. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  189. package/out/zero-cache/src/observability/metrics.js +2 -7
  190. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  191. package/out/zero-cache/src/scripts/permissions.d.ts +16 -0
  192. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  193. package/out/zero-cache/src/scripts/permissions.js +3 -3
  194. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  195. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  196. package/out/zero-cache/src/server/change-streamer.js +117 -77
  197. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  198. package/out/zero-cache/src/server/inspector-delegate.d.ts +28 -2
  199. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  200. package/out/zero-cache/src/server/inspector-delegate.js +37 -17
  201. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  202. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  203. package/out/zero-cache/src/server/main.js +8 -1
  204. package/out/zero-cache/src/server/main.js.map +1 -1
  205. package/out/zero-cache/src/server/mutator.js +2 -0
  206. package/out/zero-cache/src/server/mutator.js.map +1 -1
  207. package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
  208. package/out/zero-cache/src/server/reaper.js +2 -0
  209. package/out/zero-cache/src/server/reaper.js.map +1 -1
  210. package/out/zero-cache/src/server/replicator.d.ts +3 -0
  211. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  212. package/out/zero-cache/src/server/replicator.js +95 -21
  213. package/out/zero-cache/src/server/replicator.js.map +1 -1
  214. package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
  215. package/out/zero-cache/src/server/runner/zero-dispatcher.js +5 -0
  216. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  217. package/out/zero-cache/src/server/syncer-assigner.d.ts +14 -0
  218. package/out/zero-cache/src/server/syncer-assigner.d.ts.map +1 -0
  219. package/out/zero-cache/src/server/syncer-assigner.js +72 -0
  220. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -0
  221. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  222. package/out/zero-cache/src/server/syncer.js +24 -2
  223. package/out/zero-cache/src/server/syncer.js.map +1 -1
  224. package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
  225. package/out/zero-cache/src/server/worker-dispatcher.js +21 -4
  226. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  227. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  228. package/out/zero-cache/src/services/analyze.js +11 -9
  229. package/out/zero-cache/src/services/analyze.js.map +1 -1
  230. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
  231. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +198 -24
  232. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  233. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +1 -1
  234. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +16 -4
  235. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  236. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts +24 -0
  237. package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +1 -0
  238. package/out/zero-cache/src/services/change-source/common/init-cleanup.js +44 -0
  239. package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -0
  240. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +92 -2
  241. package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -1
  242. package/out/zero-cache/src/services/change-source/common/replica-restore.js +27 -10
  243. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
  244. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +1 -0
  245. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  246. package/out/zero-cache/src/services/change-source/common/replica-schema.js +15 -3
  247. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  248. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +1 -1
  249. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  250. package/out/zero-cache/src/services/change-source/custom/change-source.js +7 -3
  251. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  252. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +9 -0
  253. package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
  254. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +206 -19
  255. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  256. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +55 -0
  257. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
  258. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +305 -0
  259. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
  260. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +31 -18
  261. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  262. package/out/zero-cache/src/services/change-source/pg/change-source.js +130 -157
  263. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  264. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +38 -2
  265. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  266. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +55 -21
  267. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  268. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +31 -0
  269. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  270. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +102 -3
  271. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  272. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +16 -0
  273. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
  274. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
  275. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
  276. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +40 -15
  277. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  278. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +149 -27
  279. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  280. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
  281. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +68 -8
  282. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  283. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  284. package/out/zero-cache/src/services/change-source/pg/schema/init.js +32 -1
  285. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  286. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts +10 -0
  287. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts.map +1 -0
  288. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js +6 -0
  289. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -0
  290. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +50 -27
  291. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  292. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +98 -34
  293. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  294. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +68 -0
  295. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +1 -0
  296. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +141 -0
  297. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -0
  298. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +45 -2
  299. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  300. package/out/zero-cache/src/services/change-source/protocol/current/data.js +10 -1
  301. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  302. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +60 -3
  303. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  304. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +23 -10
  305. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  306. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +17 -7
  307. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  308. package/out/zero-cache/src/services/change-source/protocol/current.js +2 -1
  309. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +72 -0
  310. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +1 -0
  311. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js +162 -0
  312. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -0
  313. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +50 -0
  314. package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +1 -0
  315. package/out/zero-cache/src/services/change-streamer/backfill-state.js +268 -0
  316. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -0
  317. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
  318. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +6 -17
  319. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  320. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  321. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +59 -8
  322. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  323. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +8 -2
  324. package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
  325. package/out/zero-cache/src/services/change-streamer/broadcast.js +24 -4
  326. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  327. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -4
  328. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
  329. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +28 -8
  330. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  331. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts +17 -0
  332. package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -1
  333. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +44 -1
  334. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
  335. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +48 -6
  336. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  337. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +131 -34
  338. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  339. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +22 -0
  340. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  341. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +149 -78
  342. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  343. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +38 -16
  344. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  345. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  346. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +3 -3
  347. package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
  348. package/out/zero-cache/src/services/change-streamer/forwarder.js +36 -5
  349. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  350. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +53 -0
  351. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +1 -0
  352. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +156 -0
  353. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -0
  354. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +58 -1
  355. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  356. package/out/zero-cache/src/services/change-streamer/schema/tables.js +107 -16
  357. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  358. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +92 -0
  359. package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +1 -0
  360. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +42 -0
  361. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -0
  362. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +1 -1
  363. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
  364. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +16 -4
  365. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  366. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +7 -69
  367. package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
  368. package/out/zero-cache/src/services/change-streamer/snapshot.js +21 -53
  369. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  370. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +6 -1
  371. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -1
  372. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +27 -9
  373. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  374. package/out/zero-cache/src/services/change-streamer/storer.d.ts +95 -4
  375. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  376. package/out/zero-cache/src/services/change-streamer/storer.js +293 -83
  377. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  378. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +446 -0
  379. package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +1 -0
  380. package/out/zero-cache/src/services/change-streamer/subscribe.js +76 -0
  381. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -0
  382. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +58 -1
  383. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  384. package/out/zero-cache/src/services/change-streamer/subscriber.js +123 -12
  385. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  386. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +19 -1
  387. package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
  388. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +23 -3
  389. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  390. package/out/zero-cache/src/services/http-service.d.ts +1 -1
  391. package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
  392. package/out/zero-cache/src/services/http-service.js.map +1 -1
  393. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  394. package/out/zero-cache/src/services/life-cycle.js +3 -1
  395. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  396. package/out/zero-cache/src/services/litestream/commands.d.ts +34 -3
  397. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  398. package/out/zero-cache/src/services/litestream/commands.js +121 -35
  399. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  400. package/out/zero-cache/src/services/litestream/config-v5.yml +6 -7
  401. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +51 -24
  402. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  403. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +10 -2
  404. package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -1
  405. package/out/zero-cache/src/services/litestream/litestream-controller.js +3 -2
  406. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  407. package/out/zero-cache/src/services/litestream/restore-progress.d.ts +24 -0
  408. package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +1 -0
  409. package/out/zero-cache/src/services/litestream/restore-progress.js +91 -0
  410. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -0
  411. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts +33 -0
  412. package/out/zero-cache/src/services/litestream/wal-keeper.d.ts.map +1 -0
  413. package/out/zero-cache/src/services/litestream/wal-keeper.js +49 -0
  414. package/out/zero-cache/src/services/litestream/wal-keeper.js.map +1 -0
  415. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +5 -0
  416. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  417. package/out/zero-cache/src/services/mutagen/mutagen.js +7 -1
  418. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  419. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  420. package/out/zero-cache/src/services/mutagen/pusher.js +5 -6
  421. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  422. package/out/zero-cache/src/services/plannerz.d.ts +163 -0
  423. package/out/zero-cache/src/services/plannerz.d.ts.map +1 -0
  424. package/out/zero-cache/src/services/plannerz.js +267 -0
  425. package/out/zero-cache/src/services/plannerz.js.map +1 -0
  426. package/out/zero-cache/src/services/profz.d.ts +30 -0
  427. package/out/zero-cache/src/services/profz.d.ts.map +1 -0
  428. package/out/zero-cache/src/services/profz.js +163 -0
  429. package/out/zero-cache/src/services/profz.js.map +1 -0
  430. package/out/zero-cache/src/services/replicator/change-log-cookies.js +1 -1
  431. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  432. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +5 -4
  433. package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -1
  434. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +20 -22
  435. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  436. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  437. package/out/zero-cache/src/services/replicator/change-processor.js +51 -5
  438. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  439. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +5 -2
  440. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  441. package/out/zero-cache/src/services/replicator/incremental-sync.js +54 -21
  442. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  443. package/out/zero-cache/src/services/replicator/replication-status.d.ts +35 -1
  444. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
  445. package/out/zero-cache/src/services/replicator/replication-status.js +99 -8
  446. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  447. package/out/zero-cache/src/services/replicator/replicator.d.ts +4 -1
  448. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  449. package/out/zero-cache/src/services/replicator/replicator.js +5 -2
  450. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  451. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +16 -1
  452. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  453. package/out/zero-cache/src/services/replicator/reporter/recorder.js +70 -27
  454. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  455. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +23 -2
  456. package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -1
  457. package/out/zero-cache/src/services/replicator/schema/backfilling.js +54 -2
  458. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  459. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +6 -6
  460. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
  461. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +19 -14
  462. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  463. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +11 -3
  464. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
  465. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  466. package/out/zero-cache/src/services/replicator/write-worker.js +5 -1
  467. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  468. package/out/zero-cache/src/services/run-ast.d.ts +12 -0
  469. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  470. package/out/zero-cache/src/services/run-ast.js +42 -22
  471. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  472. package/out/zero-cache/src/services/runner.d.ts +2 -1
  473. package/out/zero-cache/src/services/runner.d.ts.map +1 -1
  474. package/out/zero-cache/src/services/runner.js +10 -2
  475. package/out/zero-cache/src/services/runner.js.map +1 -1
  476. package/out/zero-cache/src/services/statz.d.ts +4 -0
  477. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  478. package/out/zero-cache/src/services/statz.js +22 -5
  479. package/out/zero-cache/src/services/statz.js.map +1 -1
  480. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts +26 -0
  481. package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +1 -0
  482. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js +26 -0
  483. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -0
  484. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +19 -2
  485. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  486. package/out/zero-cache/src/services/view-syncer/client-handler.js +42 -30
  487. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  488. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -1
  489. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
  490. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js +1 -0
  491. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  492. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +27 -2
  493. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  494. package/out/zero-cache/src/services/view-syncer/cvr-store.js +85 -20
  495. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  496. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +76 -11
  497. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  498. package/out/zero-cache/src/services/view-syncer/cvr.js +214 -40
  499. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  500. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +81 -0
  501. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +1 -0
  502. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +128 -0
  503. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -0
  504. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
  505. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
  506. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
  507. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  508. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +33 -0
  509. package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +1 -0
  510. package/out/zero-cache/src/services/view-syncer/hydration-budget.js +62 -0
  511. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -0
  512. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +51 -0
  513. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +1 -0
  514. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +78 -0
  515. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -0
  516. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +10 -1
  517. package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
  518. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +18 -4
  519. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  520. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +80 -6
  521. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  522. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +658 -195
  523. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  524. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +7 -0
  525. package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +1 -0
  526. package/out/zero-cache/src/services/view-syncer/plan-warnings.js +35 -0
  527. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -0
  528. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
  529. package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -6
  530. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  531. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +25 -0
  532. package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +1 -0
  533. package/out/zero-cache/src/services/view-syncer/query-shape.js +28 -0
  534. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -0
  535. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +82 -0
  536. package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +1 -0
  537. package/out/zero-cache/src/services/view-syncer/query-stats.js +214 -0
  538. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
  539. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +2 -107
  540. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  541. package/out/zero-cache/src/services/view-syncer/schema/types.js +5 -20
  542. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  543. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +95 -0
  544. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +1 -0
  545. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +155 -0
  546. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -0
  547. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +96 -14
  548. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  549. package/out/zero-cache/src/services/view-syncer/snapshotter.js +214 -30
  550. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  551. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
  552. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  553. package/out/zero-cache/src/services/view-syncer/view-syncer.js +566 -107
  554. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  555. package/out/zero-cache/src/types/pg-data-type.d.ts +2 -0
  556. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  557. package/out/zero-cache/src/types/pg-data-type.js +6 -1
  558. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  559. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  560. package/out/zero-cache/src/types/pg.js +1 -1
  561. package/out/zero-cache/src/types/pg.js.map +1 -1
  562. package/out/zero-cache/src/types/processes.d.ts +39 -0
  563. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  564. package/out/zero-cache/src/types/processes.js +43 -4
  565. package/out/zero-cache/src/types/processes.js.map +1 -1
  566. package/out/zero-cache/src/types/profiler.d.ts +12 -0
  567. package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
  568. package/out/zero-cache/src/types/profiler.js +46 -1
  569. package/out/zero-cache/src/types/profiler.js.map +1 -1
  570. package/out/zero-cache/src/types/row-key.d.ts +1 -15
  571. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  572. package/out/zero-cache/src/types/row-key.js +6 -8
  573. package/out/zero-cache/src/types/row-key.js.map +1 -1
  574. package/out/zero-cache/src/types/streams.d.ts +49 -7
  575. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  576. package/out/zero-cache/src/types/streams.js +190 -58
  577. package/out/zero-cache/src/types/streams.js.map +1 -1
  578. package/out/zero-cache/src/types/subscription.d.ts +15 -0
  579. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  580. package/out/zero-cache/src/types/subscription.js +123 -31
  581. package/out/zero-cache/src/types/subscription.js.map +1 -1
  582. package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
  583. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  584. package/out/zero-cache/src/types/websocket-handoff.js +18 -9
  585. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  586. package/out/zero-cache/src/types/ws.d.ts.map +1 -1
  587. package/out/zero-cache/src/types/ws.js +1 -16
  588. package/out/zero-cache/src/types/ws.js.map +1 -1
  589. package/out/zero-cache/src/workers/connect-params.d.ts +18 -1
  590. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  591. package/out/zero-cache/src/workers/connect-params.js +25 -1
  592. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  593. package/out/zero-cache/src/workers/connection.d.ts +4 -4
  594. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  595. package/out/zero-cache/src/workers/connection.js +8 -8
  596. package/out/zero-cache/src/workers/connection.js.map +1 -1
  597. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  598. package/out/zero-cache/src/workers/replicator.js +15 -7
  599. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  600. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  601. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +21 -16
  602. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  603. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  604. package/out/zero-cache/src/workers/syncer.js +55 -4
  605. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  606. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  607. package/out/zero-client/src/client/active-clients-manager.js +4 -1
  608. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  609. package/out/zero-client/src/client/connection-manager.d.ts +20 -0
  610. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  611. package/out/zero-client/src/client/connection-manager.js +77 -13
  612. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  613. package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
  614. package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
  615. package/out/zero-client/src/client/connection-status-enum.js +3 -1
  616. package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
  617. package/out/zero-client/src/client/connection.d.ts +6 -0
  618. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  619. package/out/zero-client/src/client/connection.js +2 -1
  620. package/out/zero-client/src/client/connection.js.map +1 -1
  621. package/out/zero-client/src/client/context.d.ts +23 -13
  622. package/out/zero-client/src/client/context.d.ts.map +1 -1
  623. package/out/zero-client/src/client/context.js +94 -26
  624. package/out/zero-client/src/client/context.js.map +1 -1
  625. package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
  626. package/out/zero-client/src/client/crud-impl.js +1 -1
  627. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  628. package/out/zero-client/src/client/custom.d.ts +5 -4
  629. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  630. package/out/zero-client/src/client/custom.js +3 -3
  631. package/out/zero-client/src/client/custom.js.map +1 -1
  632. package/out/zero-client/src/client/inspector/lazy-inspector.js +1 -1
  633. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  634. package/out/zero-client/src/client/ivm-branch.js +20 -3
  635. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  636. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  637. package/out/zero-client/src/client/keys.js +19 -1
  638. package/out/zero-client/src/client/keys.js.map +1 -1
  639. package/out/zero-client/src/client/make-mutate-property.d.ts +1 -1
  640. package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
  641. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  642. package/out/zero-client/src/client/make-replicache-mutators.d.ts.map +1 -1
  643. package/out/zero-client/src/client/make-replicache-mutators.js +1 -1
  644. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  645. package/out/zero-client/src/client/mutation-tracker.d.ts +2 -2
  646. package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
  647. package/out/zero-client/src/client/mutation-tracker.js +3 -7
  648. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  649. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  650. package/out/zero-client/src/client/mutator-proxy.js +9 -4
  651. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  652. package/out/zero-client/src/client/options.d.ts +33 -0
  653. package/out/zero-client/src/client/options.d.ts.map +1 -1
  654. package/out/zero-client/src/client/options.js.map +1 -1
  655. package/out/zero-client/src/client/query-manager.d.ts +9 -0
  656. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  657. package/out/zero-client/src/client/query-manager.js +47 -14
  658. package/out/zero-client/src/client/query-manager.js.map +1 -1
  659. package/out/zero-client/src/client/reload-error-handler.js +2 -2
  660. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  661. package/out/zero-client/src/client/version.js +1 -1
  662. package/out/zero-client/src/client/zero-rep.d.ts +1 -0
  663. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  664. package/out/zero-client/src/client/zero-rep.js +8 -6
  665. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  666. package/out/zero-client/src/client/zero.d.ts +18 -3
  667. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  668. package/out/zero-client/src/client/zero.js +89 -50
  669. package/out/zero-client/src/client/zero.js.map +1 -1
  670. package/out/zero-client/src/mod.d.ts +2 -1
  671. package/out/zero-client/src/mod.d.ts.map +1 -1
  672. package/out/zero-client/src/mod.js +1 -0
  673. package/out/zero-client/src/types/query-result.d.ts +2 -0
  674. package/out/zero-client/src/types/query-result.d.ts.map +1 -1
  675. package/out/zero-events/src/status.d.ts +64 -0
  676. package/out/zero-events/src/status.d.ts.map +1 -1
  677. package/out/zero-protocol/src/analyze-query-result.d.ts +5 -0
  678. package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -1
  679. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  680. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  681. package/out/zero-protocol/src/ast.js +13 -14
  682. package/out/zero-protocol/src/ast.js.map +1 -1
  683. package/out/zero-protocol/src/connect.d.ts +16 -0
  684. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  685. package/out/zero-protocol/src/connect.js +27 -1
  686. package/out/zero-protocol/src/connect.js.map +1 -1
  687. package/out/zero-protocol/src/down.d.ts +31 -31
  688. package/out/zero-protocol/src/feature-flag-enum.d.ts +14 -0
  689. package/out/zero-protocol/src/feature-flag-enum.d.ts.map +1 -0
  690. package/out/zero-protocol/src/feature-flag-enum.js +10 -0
  691. package/out/zero-protocol/src/feature-flag-enum.js.map +1 -0
  692. package/out/zero-protocol/src/feature-flag.d.ts +5 -0
  693. package/out/zero-protocol/src/feature-flag.d.ts.map +1 -0
  694. package/out/zero-protocol/src/inspect-down.d.ts +16 -16
  695. package/out/zero-protocol/src/poke.d.ts +17 -10
  696. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  697. package/out/zero-protocol/src/poke.js +3 -2
  698. package/out/zero-protocol/src/poke.js.map +1 -1
  699. package/out/zero-protocol/src/protocol-version.d.ts +30 -6
  700. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  701. package/out/zero-protocol/src/protocol-version.js +1 -1
  702. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  703. package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
  704. package/out/zero-protocol/src/query-hash.js +2 -5
  705. package/out/zero-protocol/src/query-hash.js.map +1 -1
  706. package/out/zero-react/src/use-query.d.ts +5 -4
  707. package/out/zero-react/src/use-query.d.ts.map +1 -1
  708. package/out/zero-react/src/use-query.js +74 -7
  709. package/out/zero-react/src/use-query.js.map +1 -1
  710. package/out/zero-react/src/zero.js +1 -0
  711. package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
  712. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  713. package/out/zero-server/src/adapters/drizzle.js +12 -7
  714. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  715. package/out/zero-server/src/adapters/kysely.d.ts +2 -1
  716. package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
  717. package/out/zero-server/src/adapters/kysely.js +8 -2
  718. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  719. package/out/zero-server/src/adapters/pg.d.ts +5 -1
  720. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  721. package/out/zero-server/src/adapters/pg.js +28 -7
  722. package/out/zero-server/src/adapters/pg.js.map +1 -1
  723. package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
  724. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  725. package/out/zero-server/src/adapters/postgresjs.js +7 -1
  726. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  727. package/out/zero-server/src/adapters/prisma.d.ts +3 -2
  728. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
  729. package/out/zero-server/src/adapters/prisma.js +8 -2
  730. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  731. package/out/zero-server/src/closable-db-transaction.d.ts +16 -0
  732. package/out/zero-server/src/closable-db-transaction.d.ts.map +1 -0
  733. package/out/zero-server/src/closable-db-transaction.js +31 -0
  734. package/out/zero-server/src/closable-db-transaction.js.map +1 -0
  735. package/out/zero-server/src/custom.d.ts +10 -4
  736. package/out/zero-server/src/custom.d.ts.map +1 -1
  737. package/out/zero-server/src/custom.js +15 -6
  738. package/out/zero-server/src/custom.js.map +1 -1
  739. package/out/zero-server/src/logging.d.ts +2 -2
  740. package/out/zero-server/src/logging.d.ts.map +1 -1
  741. package/out/zero-server/src/logging.js +2 -2
  742. package/out/zero-server/src/logging.js.map +1 -1
  743. package/out/zero-server/src/mod.d.ts +1 -1
  744. package/out/zero-server/src/mod.d.ts.map +1 -1
  745. package/out/zero-server/src/pg-query-executor.d.ts +2 -2
  746. package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
  747. package/out/zero-server/src/pg-query-executor.js +2 -2
  748. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  749. package/out/zero-server/src/process-mutations.d.ts +25 -4
  750. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  751. package/out/zero-server/src/process-mutations.js +103 -52
  752. package/out/zero-server/src/process-mutations.js.map +1 -1
  753. package/out/zero-server/src/push-processor.d.ts +8 -2
  754. package/out/zero-server/src/push-processor.d.ts.map +1 -1
  755. package/out/zero-server/src/push-processor.js +12 -4
  756. package/out/zero-server/src/push-processor.js.map +1 -1
  757. package/out/zero-server/src/schema.d.ts +2 -2
  758. package/out/zero-server/src/schema.d.ts.map +1 -1
  759. package/out/zero-server/src/schema.js +3 -2
  760. package/out/zero-server/src/schema.js.map +1 -1
  761. package/out/zero-server/src/zql-database.d.ts +21 -1
  762. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  763. package/out/zero-server/src/zql-database.js +61 -24
  764. package/out/zero-server/src/zql-database.js.map +1 -1
  765. package/out/zero-solid/src/solid-view.d.ts +17 -0
  766. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  767. package/out/zero-solid/src/solid-view.js +39 -1
  768. package/out/zero-solid/src/solid-view.js.map +1 -1
  769. package/out/zero-solid/src/use-query.js +1 -2
  770. package/out/zero-solid/src/use-query.js.map +1 -1
  771. package/out/zero-solid/src/zero.js +1 -0
  772. package/out/zql/src/builder/builder.d.ts +25 -0
  773. package/out/zql/src/builder/builder.d.ts.map +1 -1
  774. package/out/zql/src/builder/builder.js +69 -19
  775. package/out/zql/src/builder/builder.js.map +1 -1
  776. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +43 -0
  777. package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +1 -0
  778. package/out/zql/src/builder/correlated-predicate-pushdown.js +161 -0
  779. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -0
  780. package/out/zql/src/builder/debug-delegate.d.ts +6 -1
  781. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  782. package/out/zql/src/builder/debug-delegate.js +14 -2
  783. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  784. package/out/zql/src/ivm/array-view.d.ts +29 -0
  785. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  786. package/out/zql/src/ivm/array-view.js +74 -16
  787. package/out/zql/src/ivm/array-view.js.map +1 -1
  788. package/out/zql/src/ivm/cap.d.ts +2 -1
  789. package/out/zql/src/ivm/cap.d.ts.map +1 -1
  790. package/out/zql/src/ivm/cap.js +14 -4
  791. package/out/zql/src/ivm/cap.js.map +1 -1
  792. package/out/zql/src/ivm/data.d.ts.map +1 -1
  793. package/out/zql/src/ivm/data.js +8 -3
  794. package/out/zql/src/ivm/data.js.map +1 -1
  795. package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
  796. package/out/zql/src/ivm/deferred-input.js +3 -2
  797. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  798. package/out/zql/src/ivm/exists.d.ts +3 -1
  799. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  800. package/out/zql/src/ivm/exists.js +4 -1
  801. package/out/zql/src/ivm/exists.js.map +1 -1
  802. package/out/zql/src/ivm/fan-in.d.ts +6 -2
  803. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  804. package/out/zql/src/ivm/fan-in.js +13 -5
  805. package/out/zql/src/ivm/fan-in.js.map +1 -1
  806. package/out/zql/src/ivm/fan-out.d.ts +5 -2
  807. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  808. package/out/zql/src/ivm/fan-out.js +4 -0
  809. package/out/zql/src/ivm/fan-out.js.map +1 -1
  810. package/out/zql/src/ivm/filter-operators.d.ts +8 -6
  811. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  812. package/out/zql/src/ivm/filter-operators.js +19 -8
  813. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  814. package/out/zql/src/ivm/filter.d.ts +5 -2
  815. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  816. package/out/zql/src/ivm/filter.js +10 -4
  817. package/out/zql/src/ivm/filter.js.map +1 -1
  818. package/out/zql/src/ivm/flipped-join.d.ts +9 -4
  819. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  820. package/out/zql/src/ivm/flipped-join.js +97 -46
  821. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  822. package/out/zql/src/ivm/join-index-tap.d.ts +33 -0
  823. package/out/zql/src/ivm/join-index-tap.d.ts.map +1 -0
  824. package/out/zql/src/ivm/join-index-tap.js +70 -0
  825. package/out/zql/src/ivm/join-index-tap.js.map +1 -0
  826. package/out/zql/src/ivm/join-index.d.ts +35 -0
  827. package/out/zql/src/ivm/join-index.d.ts.map +1 -0
  828. package/out/zql/src/ivm/join-index.js +141 -0
  829. package/out/zql/src/ivm/join-index.js.map +1 -0
  830. package/out/zql/src/ivm/join-utils.d.ts +6 -0
  831. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  832. package/out/zql/src/ivm/join-utils.js +22 -1
  833. package/out/zql/src/ivm/join-utils.js.map +1 -1
  834. package/out/zql/src/ivm/join.d.ts +19 -1
  835. package/out/zql/src/ivm/join.d.ts.map +1 -1
  836. package/out/zql/src/ivm/join.js +107 -15
  837. package/out/zql/src/ivm/join.js.map +1 -1
  838. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  839. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  840. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
  841. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  842. package/out/zql/src/ivm/memory-source.d.ts +29 -4
  843. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  844. package/out/zql/src/ivm/memory-source.js +70 -34
  845. package/out/zql/src/ivm/memory-source.js.map +1 -1
  846. package/out/zql/src/ivm/memory-storage.d.ts +1 -0
  847. package/out/zql/src/ivm/memory-storage.d.ts.map +1 -1
  848. package/out/zql/src/ivm/memory-storage.js +1 -0
  849. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  850. package/out/zql/src/ivm/operator.d.ts +45 -10
  851. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  852. package/out/zql/src/ivm/operator.js +9 -4
  853. package/out/zql/src/ivm/operator.js.map +1 -1
  854. package/out/zql/src/ivm/push-accumulated.d.ts +6 -1
  855. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  856. package/out/zql/src/ivm/push-accumulated.js +47 -2
  857. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  858. package/out/zql/src/ivm/skip.d.ts +2 -1
  859. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  860. package/out/zql/src/ivm/skip.js +3 -0
  861. package/out/zql/src/ivm/skip.js.map +1 -1
  862. package/out/zql/src/ivm/take-gate.d.ts +57 -0
  863. package/out/zql/src/ivm/take-gate.d.ts.map +1 -0
  864. package/out/zql/src/ivm/take-gate.js +106 -0
  865. package/out/zql/src/ivm/take-gate.js.map +1 -0
  866. package/out/zql/src/ivm/take.d.ts +8 -2
  867. package/out/zql/src/ivm/take.d.ts.map +1 -1
  868. package/out/zql/src/ivm/take.js +139 -103
  869. package/out/zql/src/ivm/take.js.map +1 -1
  870. package/out/zql/src/ivm/union-fan-in.d.ts +3 -0
  871. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  872. package/out/zql/src/ivm/union-fan-in.js +63 -10
  873. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  874. package/out/zql/src/ivm/union-fan-out.d.ts +2 -1
  875. package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
  876. package/out/zql/src/ivm/union-fan-out.js +5 -0
  877. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  878. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  879. package/out/zql/src/ivm/view-apply-change.js +9 -4
  880. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  881. package/out/zql/src/ivm/view.d.ts +15 -0
  882. package/out/zql/src/ivm/view.d.ts.map +1 -1
  883. package/out/zql/src/mutate/custom.d.ts +53 -1
  884. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  885. package/out/zql/src/mutate/custom.js.map +1 -1
  886. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  887. package/out/zql/src/mutate/mutator-registry.js +3 -3
  888. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  889. package/out/zql/src/mutate/mutator.d.ts +2 -2
  890. package/out/zql/src/mutate/mutator.d.ts.map +1 -1
  891. package/out/zql/src/mutate/mutator.js.map +1 -1
  892. package/out/zql/src/planner/planner-builder.d.ts +23 -3
  893. package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
  894. package/out/zql/src/planner/planner-builder.js +34 -17
  895. package/out/zql/src/planner/planner-builder.js.map +1 -1
  896. package/out/zql/src/planner/planner-connection.d.ts +58 -2
  897. package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
  898. package/out/zql/src/planner/planner-connection.js +103 -11
  899. package/out/zql/src/planner/planner-connection.js.map +1 -1
  900. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  901. package/out/zql/src/planner/planner-debug.js +3 -8
  902. package/out/zql/src/planner/planner-debug.js.map +1 -1
  903. package/out/zql/src/planner/planner-graph.d.ts +10 -0
  904. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  905. package/out/zql/src/planner/planner-graph.js +14 -0
  906. package/out/zql/src/planner/planner-graph.js.map +1 -1
  907. package/out/zql/src/planner/planner-source.d.ts +2 -2
  908. package/out/zql/src/planner/planner-source.d.ts.map +1 -1
  909. package/out/zql/src/planner/planner-source.js +2 -2
  910. package/out/zql/src/planner/planner-source.js.map +1 -1
  911. package/out/zql/src/planner/planner-warnings.d.ts +83 -0
  912. package/out/zql/src/planner/planner-warnings.d.ts.map +1 -0
  913. package/out/zql/src/planner/planner-warnings.js +78 -0
  914. package/out/zql/src/planner/planner-warnings.js.map +1 -0
  915. package/out/zql/src/query/measure-push-operator.d.ts +9 -2
  916. package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
  917. package/out/zql/src/query/measure-push-operator.js +52 -5
  918. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  919. package/out/zql/src/query/query-delegate-base.d.ts +4 -2
  920. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  921. package/out/zql/src/query/query-delegate-base.js +66 -33
  922. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  923. package/out/zql/src/query/query-delegate.d.ts +33 -6
  924. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  925. package/out/zql/src/query/query-impl.d.ts +1 -0
  926. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  927. package/out/zql/src/query/query-impl.js +6 -23
  928. package/out/zql/src/query/query-impl.js.map +1 -1
  929. package/out/zql/src/query/query-transitions.d.ts.map +1 -1
  930. package/out/zql/src/query/query-transitions.js +2 -5
  931. package/out/zql/src/query/query-transitions.js.map +1 -1
  932. package/out/zql/src/query/query.d.ts +22 -5
  933. package/out/zql/src/query/query.d.ts.map +1 -1
  934. package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
  935. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  936. package/out/zql/src/query/runnable-query-impl.js +2 -10
  937. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  938. package/out/zql/src/query/typed-view.d.ts +1 -1
  939. package/out/zql/src/query/typed-view.d.ts.map +1 -1
  940. package/out/zqlite/src/database-storage.d.ts.map +1 -1
  941. package/out/zqlite/src/database-storage.js +9 -1
  942. package/out/zqlite/src/database-storage.js.map +1 -1
  943. package/out/zqlite/src/db.d.ts +9 -1
  944. package/out/zqlite/src/db.d.ts.map +1 -1
  945. package/out/zqlite/src/db.js +62 -30
  946. package/out/zqlite/src/db.js.map +1 -1
  947. package/out/zqlite/src/index-usage.d.ts +19 -0
  948. package/out/zqlite/src/index-usage.d.ts.map +1 -0
  949. package/out/zqlite/src/index-usage.js +49 -0
  950. package/out/zqlite/src/index-usage.js.map +1 -0
  951. package/out/zqlite/src/pending-delta.d.ts +110 -0
  952. package/out/zqlite/src/pending-delta.d.ts.map +1 -0
  953. package/out/zqlite/src/pending-delta.js +278 -0
  954. package/out/zqlite/src/pending-delta.js.map +1 -0
  955. package/out/zqlite/src/query-builder.d.ts +17 -1
  956. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  957. package/out/zqlite/src/query-builder.js +111 -20
  958. package/out/zqlite/src/query-builder.js.map +1 -1
  959. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  960. package/out/zqlite/src/query-delegate.js +10 -7
  961. package/out/zqlite/src/query-delegate.js.map +1 -1
  962. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +3 -1
  963. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  964. package/out/zqlite/src/resolve-scalar-subqueries.js +1 -0
  965. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  966. package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
  967. package/out/zqlite/src/sqlite-cost-model.js +52 -1
  968. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  969. package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
  970. package/out/zqlite/src/sqlite-stat-fanout.js +5 -31
  971. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  972. package/out/zqlite/src/sqlite-stat4-sample.d.ts +37 -0
  973. package/out/zqlite/src/sqlite-stat4-sample.d.ts.map +1 -0
  974. package/out/zqlite/src/sqlite-stat4-sample.js +61 -0
  975. package/out/zqlite/src/sqlite-stat4-sample.js.map +1 -0
  976. package/out/zqlite/src/table-source.d.ts +87 -2
  977. package/out/zqlite/src/table-source.d.ts.map +1 -1
  978. package/out/zqlite/src/table-source.js +276 -42
  979. package/out/zqlite/src/table-source.js.map +1 -1
  980. package/package.json +4 -5
  981. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +0 -25
  982. package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +0 -1
  983. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +0 -83
  984. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
  985. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +0 -29
  986. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +0 -1
  987. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +0 -154
  988. package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.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 {\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 } {\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\nfunction astID(ast: AST): number {\n let id = astIDs.get(ast);\n if (id === undefined) {\n id = ++nextASTID;\n astIDs.set(ast, id);\n }\n return id;\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 let byOp = whereKeys.get(column);\n if (byOp === undefined) {\n byOp = new Map();\n whereKeys.set(column, byOp);\n }\n let key = byOp.get(op);\n if (key === undefined) {\n key = `where:${column}:${op}`;\n byOp.set(op, key);\n }\n return key;\n}\n\nconst relatedKeys = new Map<string, string>();\n\nfunction relatedKey(relationship: string): string {\n let key = relatedKeys.get(relationship);\n if (key === undefined) {\n key = `related:${relationship}`;\n relatedKeys.set(relationship, key);\n }\n return key;\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","#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 +1 @@
1
- {"version":3,"file":"query-transitions.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AAEH;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAiBlD,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,QAAQ,KAAK,CAAC;AAK3B,uCAAuC;AACvC,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM;;IAiBvC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAExC;IAED;;;;;;;;;OASG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAExC;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAgDvE;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAkCtE;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CA4B/B;CA+CF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM;;IAIrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAU/B;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAY/B;CACF"}
1
+ {"version":3,"file":"query-transitions.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAG9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AAEH;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAiBlD,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,QAAQ,KAAK,CAAC;AAK3B,uCAAuC;AACvC,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM;;IAiBvC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAExC;IAED;;;;;;;;;OASG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAExC;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAgDvE;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CA8BtE;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CA4B/B;CA+CF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM;;IAIrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAU/B;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAY/B;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { deepEqual } from "../../../shared/src/json.js";
2
+ import { getOrInsertComputed, newMap } from "../../../shared/src/map.js";
2
3
  /** How large the weak map must get before its first sweep. */
3
4
  var SWEEP_INITIAL = 64;
4
5
  /** The transitions out of one node. */
@@ -62,11 +63,7 @@ var Transitions = class {
62
63
  return;
63
64
  }
64
65
  const rest = this.#rest ??= /* @__PURE__ */ new Map();
65
- let byValue = rest.get(key);
66
- if (byValue === void 0) {
67
- byValue = /* @__PURE__ */ new Map();
68
- rest.set(key, byValue);
69
- }
66
+ const byValue = getOrInsertComputed(rest, key, newMap);
70
67
  const entry = {
71
68
  delta,
72
69
  ref: new WeakRef(node)
@@ -1 +1 @@
1
- {"version":3,"file":"query-transitions.js","names":["#bounded","#firstKey","#firstValue","#firstDelta","#first","#rest","#restSize","#maybeSweep","#sweepAt","#byHash"],"sources":["../../../../../zql/src/query/query-transitions.ts"],"sourcesContent":["import {deepEqual, type ReadonlyJSONValue} from '../../../shared/src/json.ts';\n\n/**\n * A transition tree for interning immutable builder objects, modelled on V8's\n * hidden-class transitions.\n *\n * Each node keeps a map from a *transition* (an operation plus its arguments) to\n * the node that operation produces. Applying the same operation to the same node\n * twice therefore yields the same object both times.\n *\n * ## Why not hash?\n *\n * Hashing the resulting AST would work but is far too expensive to do on every\n * builder call. Instead a transition is identified by three things, in\n * decreasing order of how cheap they are to compare:\n *\n * 1. `key` — a short string naming the operation. Callers are expected to hand\n * in a *stable* string rather than build one per call; see below.\n * 2. `value` — the operation's varying argument, when it is a primitive, used\n * directly as a `Map` key.\n * 3. `delta` — anything left over, compared with {@linkcode deepEqual}.\n *\n * Splitting 1 from 2 is what makes this fast. Folding the value into the key\n * instead means building a fresh string on every call, and a fresh string has to\n * be hashed from scratch before a `Map` can look it up: measured at ~148ns,\n * against ~10ns to look up the caller's own string, whose hash V8 has already\n * cached on the string object. That difference is larger than everything else a\n * transition does.\n *\n * Comparing only the delta is sound because the parent node is already canonical:\n * two children of the same parent are equal exactly when the operations that\n * produced them are equal. We never deep-compare a whole AST.\n *\n * ## Liveness\n *\n * Children point back at their parents strongly (see `QueryImpl`), so holding a\n * query holds its whole ancestor spine and re-deriving it from the root gives\n * the same object back. The other direction has to be weak, or an interned root\n * — which lives as long as its schema — would retain every query ever derived\n * from it.\n *\n * Weak is expensive, though: `new WeakRef` costs on the order of a hundred\n * nanoseconds, more than everything else a transition does put together, and it\n * adds GC work later. So the *first* transition out of a node is held strongly\n * instead, in fields on this object, with no `WeakRef` at all.\n *\n * That is safe because strong first-children form a path, not a tree: each node\n * pins at most one child, which pins at most one of its own. The retained set\n * per root is bounded by the depth of a builder chain — a handful of queries —\n * rather than by how many distinct queries an app builds. Everything past the\n * first child is weak, so the unbounded cases (a search box typing into\n * `where:title:=:s<text>`, a row id per list item) stay collectible.\n *\n * It is also where the wins are: a chain like `q.where(…).orderBy(…).limit(…)`\n * gives every node exactly one child, so building it allocates no `WeakRef`s and\n * looks up through a field compare rather than a hash lookup.\n *\n * What a collected child leaves behind is a cleared `WeakRef` and its map key. A\n * lookup drops those as it walks, which covers every key that is asked for\n * again. A key that is *never* asked for again is handled by the sweep.\n *\n * ## Best effort\n *\n * Interning is a cache, not a guarantee: a missed lookup only costs an extra\n * object. See {@linkcode MAX_SCAN} for the one case where we deliberately give\n * up.\n *\n * ## Identity vs. hash\n *\n * Identity implies an equal query hash, but the tree alone does not give the\n * converse. `normalizeAST` sorts `related` and `and`/`or` conditions, so\n * `q.where(a).where(b)` and `q.where(b).where(a)` hash the same while being\n * distinct paths, and so distinct nodes. {@linkcode HashIndex} is the second\n * level that folds those together once they have been hashed. Callers that\n * need the normalizing behavior for a query that may not have been must keep\n * using the hash.\n */\n\n/**\n * The delta identifying a transition, or `undefined` when the key already\n * determines the result on its own.\n */\nexport type Delta = ReadonlyJSONValue | undefined;\n\ntype Entry<T extends object> = {\n readonly delta: Delta;\n readonly ref: WeakRef<T>;\n};\n\n/**\n * A bucket holds a bare entry in the common single-entry case and is promoted to\n * a `Set` only on collision, so the usual transition allocates no container.\n *\n * A `Set` rather than an array: deleting during iteration is well defined, so a\n * lookup prunes collected entries and stops at its match in a single pass, and\n * removing an entry is O(1) rather than a scan.\n */\ntype Bucket<T extends object> = Entry<T> | Set<Entry<T>>;\n\n/** The varying argument of a transition, when it is one. */\nexport type TransitionValue = string | number | boolean | null | undefined;\n\n/**\n * The longest `deepEqual` scan we are willing to do on a lookup.\n *\n * This is a *latency* bound, not a memory bound — memory is already handled,\n * since entries are weak and are pruned both by the sweep and by any lookup that\n * walks past them, so a bucket only ever holds children that are still alive.\n *\n * Note what happens at the limit: we stop *storing*, we do not evict. Evicting\n * would de-intern objects that are still in use, and on a sequential sweep of a\n * live set larger than the limit it drives the hit rate to zero — each lookup\n * throws out the entry the next one needs. Refusing to store instead leaves\n * every already-shared sibling shared and degrades the surplus to the old\n * behavior of a fresh instance per call.\n *\n * Buckets should rarely get near this. Keys carry the discriminating value\n * wherever it is cheap to, and a key that carries it is *exact*, so it costs no\n * comparison at all: every simple comparison goes that way, and so does a\n * one-hop `exists`, via its sub-query's identity. What is left sharing a bucket\n * is two-hop `exists`, the `and`/`or` trees an expression factory builds, and\n * relationships whose callback varies.\n */\nexport const MAX_SCAN = 64;\n\n/** How large the weak map must get before its first sweep. */\nconst SWEEP_INITIAL = 64;\n\n/** The transitions out of one node. */\nexport class Transitions<T extends object> {\n // The first transition, held strongly and in place. See \"Liveness\" above.\n #firstKey: string | undefined;\n #firstValue: TransitionValue;\n #firstDelta: Delta;\n #first: T | undefined;\n\n // Transitions whose key space is finite and comes from the schema rather than\n // from user data, held strongly. See `storeBounded`.\n #bounded: Map<string, T> | undefined;\n\n // Everything else, weakly. Allocated only if there is a second. Nested so the\n // value stays a `Map` key of its own rather than part of the string.\n #rest: Map<string, Map<TransitionValue, Bucket<T>>> | undefined;\n #sweepAt = SWEEP_INITIAL;\n #restSize = 0;\n\n lookupBounded(key: string): T | undefined {\n return this.#bounded?.get(key);\n }\n\n /**\n * Records a transition whose key space is finite and schema-derived — the base\n * sub-query handed to a `related`/`exists` callback, keyed by relationship\n * name.\n *\n * These are held strongly. Retention is bounded by the number of relationships\n * on the table, so it cannot grow with what an app queries for, and in exchange\n * a relationship traversal allocates no `WeakRef`. Anything keyed by a *value*\n * — a row id, a search string, a limit — must not come through here.\n */\n storeBounded(key: string, value: T): void {\n (this.#bounded ??= new Map()).set(key, value);\n }\n\n lookup(key: string, value: TransitionValue, delta: Delta): T | undefined {\n if (\n this.#firstKey === key &&\n this.#firstValue === value &&\n deepEqual(this.#firstDelta, delta)\n ) {\n return this.#first;\n }\n const byValue = this.#rest?.get(key);\n if (byValue === undefined) {\n return undefined;\n }\n const bucket = byValue.get(value);\n if (bucket === undefined) {\n return undefined;\n }\n\n if (!(bucket instanceof Set)) {\n const found = bucket.ref.deref();\n if (found === undefined) {\n byValue.delete(value);\n this.#restSize--;\n return undefined;\n }\n // deepEqual short-circuits on reference equality, which is the fast path\n // we rely on for deltas built out of already-interned sub-queries.\n return deepEqual(bucket.delta, delta) ? found : undefined;\n }\n\n // One pass: drop what has been collected, stop at the match. Deleting from a\n // Set while iterating it is well defined — the iterator simply skips what is\n // gone — so this stays O(n) with no compaction step, and returns early on a\n // hit rather than walking the whole bucket first.\n for (const entry of bucket) {\n const found = entry.ref.deref();\n if (found === undefined) {\n bucket.delete(entry);\n this.#restSize--;\n continue;\n }\n if (deepEqual(entry.delta, delta)) {\n return found;\n }\n }\n if (bucket.size === 0) {\n byValue.delete(value);\n }\n return undefined;\n }\n\n store(key: string, value: TransitionValue, delta: Delta, node: T): void {\n if (this.#firstKey === undefined) {\n this.#firstKey = key;\n this.#firstValue = value;\n this.#firstDelta = delta;\n this.#first = node;\n return;\n }\n\n const rest = (this.#rest ??= new Map());\n let byValue = rest.get(key);\n if (byValue === undefined) {\n byValue = new Map();\n rest.set(key, byValue);\n }\n\n const entry: Entry<T> = {delta, ref: new WeakRef(node)};\n const bucket = byValue.get(value);\n\n if (bucket === undefined) {\n byValue.set(value, entry);\n } else if (!(bucket instanceof Set)) {\n byValue.set(value, new Set([bucket, entry]));\n } else {\n if (bucket.size >= MAX_SCAN) {\n // Leave the bucket alone; see MAX_SCAN. `node` is simply not shared.\n // A store only follows a failed lookup, which has just pruned, so this\n // is measured against entries that are actually still alive.\n return;\n }\n bucket.add(entry);\n }\n this.#restSize++;\n this.#maybeSweep(rest);\n }\n\n /**\n * Re-points the transition that produced `from` at `to`, so the next lookup\n * along that path yields `to` instead. This is how {@linkcode HashIndex}\n * converges two paths on one node: `from` keeps its identity, since it has\n * already been handed out, and its path is redirected for the rebuilds that\n * follow.\n *\n * Scans rather than taking a key. This runs once per redirected path, so a\n * walk here is cheaper than the fields every node would need to carry to\n * name its own transition.\n */\n replace(from: T, to: T): boolean {\n if (this.#first === from) {\n this.#first = to;\n return true;\n }\n const rest = this.#rest;\n if (rest === undefined) {\n return false;\n }\n for (const byValue of rest.values()) {\n for (const [value, bucket] of byValue) {\n if (!(bucket instanceof Set)) {\n if (bucket.ref.deref() === from) {\n byValue.set(value, {delta: bucket.delta, ref: new WeakRef(to)});\n return true;\n }\n continue;\n }\n for (const entry of bucket) {\n if (entry.ref.deref() === from) {\n bucket.delete(entry);\n bucket.add({delta: entry.delta, ref: new WeakRef(to)});\n return true;\n }\n }\n }\n }\n return false;\n }\n\n /**\n * Drops entries for collected values, if the map has grown enough to be worth\n * walking.\n *\n * A lookup already prunes whatever it walks past, which covers every key that\n * is asked for again. This is for the key that is not: a miss on a fresh key\n * returns without touching any existing entry, so nothing would ever notice\n * that those had died. Doubling the threshold off whatever survives keeps this\n * amortized O(1) per insert whether or not there was anything to reclaim, and\n * it is self-limiting — only a node that keeps taking inserts can keep\n * accumulating, and taking inserts is what triggers the sweep.\n */\n #maybeSweep(rest: Map<string, Map<TransitionValue, Bucket<T>>>): void {\n if (this.#restSize < this.#sweepAt) {\n return;\n }\n let live = 0;\n for (const [key, byValue] of rest) {\n for (const [value, bucket] of byValue) {\n if (!(bucket instanceof Set)) {\n if (bucket.ref.deref() === undefined) {\n byValue.delete(value);\n } else {\n live++;\n }\n continue;\n }\n for (const entry of bucket) {\n if (entry.ref.deref() === undefined) {\n bucket.delete(entry);\n } else {\n live++;\n }\n }\n if (bucket.size === 0) {\n byValue.delete(value);\n }\n }\n if (byValue.size === 0) {\n rest.delete(key);\n }\n }\n this.#restSize = live;\n this.#sweepAt = Math.max(SWEEP_INITIAL, live * 2);\n }\n}\n\n/**\n * The second level of interning: nodes keyed by *content* rather than by the\n * path that built them.\n *\n * The transition tree cannot see that `q.where(a).where(b)` and\n * `q.where(b).where(a)` are the same query. `normalizeAST` sorts conditions\n * and `related` entries, so the two build byte-identical ASTs, but they are\n * different paths and so different nodes. This index closes that gap, keyed by\n * the query's hash.\n *\n * It is consulted when a query is *hashed*, not when it is built. Hashing on\n * every tree miss would make a cold chain pay for a hash per node, where the\n * uninterned code paid for one at the end, if at all -- and server-side queries\n * are built cold, once, per request. The consumers that key by hash already\n * hash the queries they care about, so doing the work there costs one map\n * lookup on top of a hash that was being computed anyway, and nothing at all\n * for a query nobody hashes.\n *\n * On a hit the query being hashed keeps its identity, since it has already\n * been handed out. Its *transition* is re-pointed at the existing node instead\n * (see {@linkcode Transitions.replace}), so the next rebuild along that path\n * yields the shared instance. As with the tree this is a cache: the rebuild\n * after a redirect is what converges, not the call that found the duplicate.\n *\n * One index per root, which is what scopes it. Two roots never share an index,\n * so queries against different schemas or different delegates -- neither of\n * which the hash covers -- can never be conflated. Entries are weak: a cleared\n * one is dropped by the lookup that finds it, or by a sweep once the map has\n * doubled since the last one.\n */\nexport class HashIndex<T extends object> {\n readonly #byHash = new Map<string, WeakRef<T>>();\n #sweepAt = SWEEP_INITIAL;\n\n get(hash: string): T | undefined {\n const ref = this.#byHash.get(hash);\n if (ref === undefined) {\n return undefined;\n }\n const node = ref.deref();\n if (node === undefined) {\n this.#byHash.delete(hash);\n }\n return node;\n }\n\n set(hash: string, node: T): void {\n const byHash = this.#byHash;\n byHash.set(hash, new WeakRef(node));\n if (byHash.size < this.#sweepAt) {\n return;\n }\n for (const [h, ref] of byHash) {\n if (ref.deref() === undefined) {\n byHash.delete(h);\n }\n }\n this.#sweepAt = Math.max(SWEEP_INITIAL, byHash.size * 2);\n }\n}\n"],"mappings":";;AA8HA,IAAM,gBAAgB;;AAGtB,IAAa,cAAb,MAA2C;CAEzC;CACA;CACA;CACA;CAIA;CAIA;CACA,WAAW;CACX,YAAY;CAEZ,cAAc,KAA4B;EACxC,OAAO,KAAKA,UAAU,IAAI,GAAG;CAC/B;;;;;;;;;;;CAYA,aAAa,KAAa,OAAgB;EACxC,CAAC,KAAKA,6BAAa,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;CAC9C;CAEA,OAAO,KAAa,OAAwB,OAA6B;EACvE,IACE,KAAKC,cAAc,OACnB,KAAKC,gBAAgB,SACrB,UAAU,KAAKC,aAAa,KAAK,GAEjC,OAAO,KAAKC;EAEd,MAAM,UAAU,KAAKC,OAAO,IAAI,GAAG;EACnC,IAAI,YAAY,KAAA,GACd;EAEF,MAAM,SAAS,QAAQ,IAAI,KAAK;EAChC,IAAI,WAAW,KAAA,GACb;EAGF,IAAI,EAAE,kBAAkB,MAAM;GAC5B,MAAM,QAAQ,OAAO,IAAI,MAAM;GAC/B,IAAI,UAAU,KAAA,GAAW;IACvB,QAAQ,OAAO,KAAK;IACpB,KAAKC;IACL;GACF;GAGA,OAAO,UAAU,OAAO,OAAO,KAAK,IAAI,QAAQ,KAAA;EAClD;EAMA,KAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,QAAQ,MAAM,IAAI,MAAM;GAC9B,IAAI,UAAU,KAAA,GAAW;IACvB,OAAO,OAAO,KAAK;IACnB,KAAKA;IACL;GACF;GACA,IAAI,UAAU,MAAM,OAAO,KAAK,GAC9B,OAAO;EAEX;EACA,IAAI,OAAO,SAAS,GAClB,QAAQ,OAAO,KAAK;CAGxB;CAEA,MAAM,KAAa,OAAwB,OAAc,MAAe;EACtE,IAAI,KAAKL,cAAc,KAAA,GAAW;GAChC,KAAKA,YAAY;GACjB,KAAKC,cAAc;GACnB,KAAKC,cAAc;GACnB,KAAKC,SAAS;GACd;EACF;EAEA,MAAM,OAAQ,KAAKC,0BAAU,IAAI,IAAI;EACrC,IAAI,UAAU,KAAK,IAAI,GAAG;EAC1B,IAAI,YAAY,KAAA,GAAW;GACzB,0BAAU,IAAI,IAAI;GAClB,KAAK,IAAI,KAAK,OAAO;EACvB;EAEA,MAAM,QAAkB;GAAC;GAAO,KAAK,IAAI,QAAQ,IAAI;EAAC;EACtD,MAAM,SAAS,QAAQ,IAAI,KAAK;EAEhC,IAAI,WAAW,KAAA,GACb,QAAQ,IAAI,OAAO,KAAK;OACnB,IAAI,EAAE,kBAAkB,MAC7B,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;OACtC;GACL,IAAI,OAAO,QAAA,IAIT;GAEF,OAAO,IAAI,KAAK;EAClB;EACA,KAAKC;EACL,KAAKC,YAAY,IAAI;CACvB;;;;;;;;;;;;CAaA,QAAQ,MAAS,IAAgB;EAC/B,IAAI,KAAKH,WAAW,MAAM;GACxB,KAAKA,SAAS;GACd,OAAO;EACT;EACA,MAAM,OAAO,KAAKC;EAClB,IAAI,SAAS,KAAA,GACX,OAAO;EAET,KAAK,MAAM,WAAW,KAAK,OAAO,GAChC,KAAK,MAAM,CAAC,OAAO,WAAW,SAAS;GACrC,IAAI,EAAE,kBAAkB,MAAM;IAC5B,IAAI,OAAO,IAAI,MAAM,MAAM,MAAM;KAC/B,QAAQ,IAAI,OAAO;MAAC,OAAO,OAAO;MAAO,KAAK,IAAI,QAAQ,EAAE;KAAC,CAAC;KAC9D,OAAO;IACT;IACA;GACF;GACA,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,IAAI,MAAM,MAAM,MAAM;IAC9B,OAAO,OAAO,KAAK;IACnB,OAAO,IAAI;KAAC,OAAO,MAAM;KAAO,KAAK,IAAI,QAAQ,EAAE;IAAC,CAAC;IACrD,OAAO;GACT;EAEJ;EAEF,OAAO;CACT;;;;;;;;;;;;;CAcA,YAAY,MAA0D;EACpE,IAAI,KAAKC,YAAY,KAAKE,UACxB;EAEF,IAAI,OAAO;EACX,KAAK,MAAM,CAAC,KAAK,YAAY,MAAM;GACjC,KAAK,MAAM,CAAC,OAAO,WAAW,SAAS;IACrC,IAAI,EAAE,kBAAkB,MAAM;KAC5B,IAAI,OAAO,IAAI,MAAM,MAAM,KAAA,GACzB,QAAQ,OAAO,KAAK;UAEpB;KAEF;IACF;IACA,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,IAAI,MAAM,MAAM,KAAA,GACxB,OAAO,OAAO,KAAK;SAEnB;IAGJ,IAAI,OAAO,SAAS,GAClB,QAAQ,OAAO,KAAK;GAExB;GACA,IAAI,QAAQ,SAAS,GACnB,KAAK,OAAO,GAAG;EAEnB;EACA,KAAKF,YAAY;EACjB,KAAKE,WAAW,KAAK,IAAI,eAAe,OAAO,CAAC;CAClD;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAa,YAAb,MAAyC;CACvC,0BAAmB,IAAI,IAAwB;CAC/C,WAAW;CAEX,IAAI,MAA6B;EAC/B,MAAM,MAAM,KAAKC,QAAQ,IAAI,IAAI;EACjC,IAAI,QAAQ,KAAA,GACV;EAEF,MAAM,OAAO,IAAI,MAAM;EACvB,IAAI,SAAS,KAAA,GACX,KAAKA,QAAQ,OAAO,IAAI;EAE1B,OAAO;CACT;CAEA,IAAI,MAAc,MAAe;EAC/B,MAAM,SAAS,KAAKA;EACpB,OAAO,IAAI,MAAM,IAAI,QAAQ,IAAI,CAAC;EAClC,IAAI,OAAO,OAAO,KAAKD,UACrB;EAEF,KAAK,MAAM,CAAC,GAAG,QAAQ,QACrB,IAAI,IAAI,MAAM,MAAM,KAAA,GAClB,OAAO,OAAO,CAAC;EAGnB,KAAKA,WAAW,KAAK,IAAI,eAAe,OAAO,OAAO,CAAC;CACzD;AACF"}
1
+ {"version":3,"file":"query-transitions.js","names":["#bounded","#firstKey","#firstValue","#firstDelta","#first","#rest","#restSize","#maybeSweep","#sweepAt","#byHash"],"sources":["../../../../../zql/src/query/query-transitions.ts"],"sourcesContent":["import {deepEqual, type ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport {getOrInsertComputed, newMap} from '../../../shared/src/map.ts';\n\n/**\n * A transition tree for interning immutable builder objects, modelled on V8's\n * hidden-class transitions.\n *\n * Each node keeps a map from a *transition* (an operation plus its arguments) to\n * the node that operation produces. Applying the same operation to the same node\n * twice therefore yields the same object both times.\n *\n * ## Why not hash?\n *\n * Hashing the resulting AST would work but is far too expensive to do on every\n * builder call. Instead a transition is identified by three things, in\n * decreasing order of how cheap they are to compare:\n *\n * 1. `key` — a short string naming the operation. Callers are expected to hand\n * in a *stable* string rather than build one per call; see below.\n * 2. `value` — the operation's varying argument, when it is a primitive, used\n * directly as a `Map` key.\n * 3. `delta` — anything left over, compared with {@linkcode deepEqual}.\n *\n * Splitting 1 from 2 is what makes this fast. Folding the value into the key\n * instead means building a fresh string on every call, and a fresh string has to\n * be hashed from scratch before a `Map` can look it up: measured at ~148ns,\n * against ~10ns to look up the caller's own string, whose hash V8 has already\n * cached on the string object. That difference is larger than everything else a\n * transition does.\n *\n * Comparing only the delta is sound because the parent node is already canonical:\n * two children of the same parent are equal exactly when the operations that\n * produced them are equal. We never deep-compare a whole AST.\n *\n * ## Liveness\n *\n * Children point back at their parents strongly (see `QueryImpl`), so holding a\n * query holds its whole ancestor spine and re-deriving it from the root gives\n * the same object back. The other direction has to be weak, or an interned root\n * — which lives as long as its schema — would retain every query ever derived\n * from it.\n *\n * Weak is expensive, though: `new WeakRef` costs on the order of a hundred\n * nanoseconds, more than everything else a transition does put together, and it\n * adds GC work later. So the *first* transition out of a node is held strongly\n * instead, in fields on this object, with no `WeakRef` at all.\n *\n * That is safe because strong first-children form a path, not a tree: each node\n * pins at most one child, which pins at most one of its own. The retained set\n * per root is bounded by the depth of a builder chain — a handful of queries —\n * rather than by how many distinct queries an app builds. Everything past the\n * first child is weak, so the unbounded cases (a search box typing into\n * `where:title:=:s<text>`, a row id per list item) stay collectible.\n *\n * It is also where the wins are: a chain like `q.where(…).orderBy(…).limit(…)`\n * gives every node exactly one child, so building it allocates no `WeakRef`s and\n * looks up through a field compare rather than a hash lookup.\n *\n * What a collected child leaves behind is a cleared `WeakRef` and its map key. A\n * lookup drops those as it walks, which covers every key that is asked for\n * again. A key that is *never* asked for again is handled by the sweep.\n *\n * ## Best effort\n *\n * Interning is a cache, not a guarantee: a missed lookup only costs an extra\n * object. See {@linkcode MAX_SCAN} for the one case where we deliberately give\n * up.\n *\n * ## Identity vs. hash\n *\n * Identity implies an equal query hash, but the tree alone does not give the\n * converse. `normalizeAST` sorts `related` and `and`/`or` conditions, so\n * `q.where(a).where(b)` and `q.where(b).where(a)` hash the same while being\n * distinct paths, and so distinct nodes. {@linkcode HashIndex} is the second\n * level that folds those together once they have been hashed. Callers that\n * need the normalizing behavior for a query that may not have been must keep\n * using the hash.\n */\n\n/**\n * The delta identifying a transition, or `undefined` when the key already\n * determines the result on its own.\n */\nexport type Delta = ReadonlyJSONValue | undefined;\n\ntype Entry<T extends object> = {\n readonly delta: Delta;\n readonly ref: WeakRef<T>;\n};\n\n/**\n * A bucket holds a bare entry in the common single-entry case and is promoted to\n * a `Set` only on collision, so the usual transition allocates no container.\n *\n * A `Set` rather than an array: deleting during iteration is well defined, so a\n * lookup prunes collected entries and stops at its match in a single pass, and\n * removing an entry is O(1) rather than a scan.\n */\ntype Bucket<T extends object> = Entry<T> | Set<Entry<T>>;\n\n/** The varying argument of a transition, when it is one. */\nexport type TransitionValue = string | number | boolean | null | undefined;\n\n/**\n * The longest `deepEqual` scan we are willing to do on a lookup.\n *\n * This is a *latency* bound, not a memory bound — memory is already handled,\n * since entries are weak and are pruned both by the sweep and by any lookup that\n * walks past them, so a bucket only ever holds children that are still alive.\n *\n * Note what happens at the limit: we stop *storing*, we do not evict. Evicting\n * would de-intern objects that are still in use, and on a sequential sweep of a\n * live set larger than the limit it drives the hit rate to zero — each lookup\n * throws out the entry the next one needs. Refusing to store instead leaves\n * every already-shared sibling shared and degrades the surplus to the old\n * behavior of a fresh instance per call.\n *\n * Buckets should rarely get near this. Keys carry the discriminating value\n * wherever it is cheap to, and a key that carries it is *exact*, so it costs no\n * comparison at all: every simple comparison goes that way, and so does a\n * one-hop `exists`, via its sub-query's identity. What is left sharing a bucket\n * is two-hop `exists`, the `and`/`or` trees an expression factory builds, and\n * relationships whose callback varies.\n */\nexport const MAX_SCAN = 64;\n\n/** How large the weak map must get before its first sweep. */\nconst SWEEP_INITIAL = 64;\n\n/** The transitions out of one node. */\nexport class Transitions<T extends object> {\n // The first transition, held strongly and in place. See \"Liveness\" above.\n #firstKey: string | undefined;\n #firstValue: TransitionValue;\n #firstDelta: Delta;\n #first: T | undefined;\n\n // Transitions whose key space is finite and comes from the schema rather than\n // from user data, held strongly. See `storeBounded`.\n #bounded: Map<string, T> | undefined;\n\n // Everything else, weakly. Allocated only if there is a second. Nested so the\n // value stays a `Map` key of its own rather than part of the string.\n #rest: Map<string, Map<TransitionValue, Bucket<T>>> | undefined;\n #sweepAt = SWEEP_INITIAL;\n #restSize = 0;\n\n lookupBounded(key: string): T | undefined {\n return this.#bounded?.get(key);\n }\n\n /**\n * Records a transition whose key space is finite and schema-derived — the base\n * sub-query handed to a `related`/`exists` callback, keyed by relationship\n * name.\n *\n * These are held strongly. Retention is bounded by the number of relationships\n * on the table, so it cannot grow with what an app queries for, and in exchange\n * a relationship traversal allocates no `WeakRef`. Anything keyed by a *value*\n * — a row id, a search string, a limit — must not come through here.\n */\n storeBounded(key: string, value: T): void {\n (this.#bounded ??= new Map()).set(key, value);\n }\n\n lookup(key: string, value: TransitionValue, delta: Delta): T | undefined {\n if (\n this.#firstKey === key &&\n this.#firstValue === value &&\n deepEqual(this.#firstDelta, delta)\n ) {\n return this.#first;\n }\n const byValue = this.#rest?.get(key);\n if (byValue === undefined) {\n return undefined;\n }\n const bucket = byValue.get(value);\n if (bucket === undefined) {\n return undefined;\n }\n\n if (!(bucket instanceof Set)) {\n const found = bucket.ref.deref();\n if (found === undefined) {\n byValue.delete(value);\n this.#restSize--;\n return undefined;\n }\n // deepEqual short-circuits on reference equality, which is the fast path\n // we rely on for deltas built out of already-interned sub-queries.\n return deepEqual(bucket.delta, delta) ? found : undefined;\n }\n\n // One pass: drop what has been collected, stop at the match. Deleting from a\n // Set while iterating it is well defined — the iterator simply skips what is\n // gone — so this stays O(n) with no compaction step, and returns early on a\n // hit rather than walking the whole bucket first.\n for (const entry of bucket) {\n const found = entry.ref.deref();\n if (found === undefined) {\n bucket.delete(entry);\n this.#restSize--;\n continue;\n }\n if (deepEqual(entry.delta, delta)) {\n return found;\n }\n }\n if (bucket.size === 0) {\n byValue.delete(value);\n }\n return undefined;\n }\n\n store(key: string, value: TransitionValue, delta: Delta, node: T): void {\n if (this.#firstKey === undefined) {\n this.#firstKey = key;\n this.#firstValue = value;\n this.#firstDelta = delta;\n this.#first = node;\n return;\n }\n\n const rest = (this.#rest ??= new Map());\n const byValue = getOrInsertComputed(rest, key, newMap);\n\n const entry: Entry<T> = {delta, ref: new WeakRef(node)};\n const bucket = byValue.get(value);\n\n if (bucket === undefined) {\n byValue.set(value, entry);\n } else if (!(bucket instanceof Set)) {\n byValue.set(value, new Set([bucket, entry]));\n } else {\n if (bucket.size >= MAX_SCAN) {\n // Leave the bucket alone; see MAX_SCAN. `node` is simply not shared.\n // A store only follows a failed lookup, which has just pruned, so this\n // is measured against entries that are actually still alive.\n return;\n }\n bucket.add(entry);\n }\n this.#restSize++;\n this.#maybeSweep(rest);\n }\n\n /**\n * Re-points the transition that produced `from` at `to`, so the next lookup\n * along that path yields `to` instead. This is how {@linkcode HashIndex}\n * converges two paths on one node: `from` keeps its identity, since it has\n * already been handed out, and its path is redirected for the rebuilds that\n * follow.\n *\n * Scans rather than taking a key. This runs once per redirected path, so a\n * walk here is cheaper than the fields every node would need to carry to\n * name its own transition.\n */\n replace(from: T, to: T): boolean {\n if (this.#first === from) {\n this.#first = to;\n return true;\n }\n const rest = this.#rest;\n if (rest === undefined) {\n return false;\n }\n for (const byValue of rest.values()) {\n for (const [value, bucket] of byValue) {\n if (!(bucket instanceof Set)) {\n if (bucket.ref.deref() === from) {\n byValue.set(value, {delta: bucket.delta, ref: new WeakRef(to)});\n return true;\n }\n continue;\n }\n for (const entry of bucket) {\n if (entry.ref.deref() === from) {\n bucket.delete(entry);\n bucket.add({delta: entry.delta, ref: new WeakRef(to)});\n return true;\n }\n }\n }\n }\n return false;\n }\n\n /**\n * Drops entries for collected values, if the map has grown enough to be worth\n * walking.\n *\n * A lookup already prunes whatever it walks past, which covers every key that\n * is asked for again. This is for the key that is not: a miss on a fresh key\n * returns without touching any existing entry, so nothing would ever notice\n * that those had died. Doubling the threshold off whatever survives keeps this\n * amortized O(1) per insert whether or not there was anything to reclaim, and\n * it is self-limiting — only a node that keeps taking inserts can keep\n * accumulating, and taking inserts is what triggers the sweep.\n */\n #maybeSweep(rest: Map<string, Map<TransitionValue, Bucket<T>>>): void {\n if (this.#restSize < this.#sweepAt) {\n return;\n }\n let live = 0;\n for (const [key, byValue] of rest) {\n for (const [value, bucket] of byValue) {\n if (!(bucket instanceof Set)) {\n if (bucket.ref.deref() === undefined) {\n byValue.delete(value);\n } else {\n live++;\n }\n continue;\n }\n for (const entry of bucket) {\n if (entry.ref.deref() === undefined) {\n bucket.delete(entry);\n } else {\n live++;\n }\n }\n if (bucket.size === 0) {\n byValue.delete(value);\n }\n }\n if (byValue.size === 0) {\n rest.delete(key);\n }\n }\n this.#restSize = live;\n this.#sweepAt = Math.max(SWEEP_INITIAL, live * 2);\n }\n}\n\n/**\n * The second level of interning: nodes keyed by *content* rather than by the\n * path that built them.\n *\n * The transition tree cannot see that `q.where(a).where(b)` and\n * `q.where(b).where(a)` are the same query. `normalizeAST` sorts conditions\n * and `related` entries, so the two build byte-identical ASTs, but they are\n * different paths and so different nodes. This index closes that gap, keyed by\n * the query's hash.\n *\n * It is consulted when a query is *hashed*, not when it is built. Hashing on\n * every tree miss would make a cold chain pay for a hash per node, where the\n * uninterned code paid for one at the end, if at all -- and server-side queries\n * are built cold, once, per request. The consumers that key by hash already\n * hash the queries they care about, so doing the work there costs one map\n * lookup on top of a hash that was being computed anyway, and nothing at all\n * for a query nobody hashes.\n *\n * On a hit the query being hashed keeps its identity, since it has already\n * been handed out. Its *transition* is re-pointed at the existing node instead\n * (see {@linkcode Transitions.replace}), so the next rebuild along that path\n * yields the shared instance. As with the tree this is a cache: the rebuild\n * after a redirect is what converges, not the call that found the duplicate.\n *\n * One index per root, which is what scopes it. Two roots never share an index,\n * so queries against different schemas or different delegates -- neither of\n * which the hash covers -- can never be conflated. Entries are weak: a cleared\n * one is dropped by the lookup that finds it, or by a sweep once the map has\n * doubled since the last one.\n */\nexport class HashIndex<T extends object> {\n readonly #byHash = new Map<string, WeakRef<T>>();\n #sweepAt = SWEEP_INITIAL;\n\n get(hash: string): T | undefined {\n const ref = this.#byHash.get(hash);\n if (ref === undefined) {\n return undefined;\n }\n const node = ref.deref();\n if (node === undefined) {\n this.#byHash.delete(hash);\n }\n return node;\n }\n\n set(hash: string, node: T): void {\n const byHash = this.#byHash;\n byHash.set(hash, new WeakRef(node));\n if (byHash.size < this.#sweepAt) {\n return;\n }\n for (const [h, ref] of byHash) {\n if (ref.deref() === undefined) {\n byHash.delete(h);\n }\n }\n this.#sweepAt = Math.max(SWEEP_INITIAL, byHash.size * 2);\n }\n}\n"],"mappings":"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"}
@@ -66,7 +66,7 @@ type CoversSomeKey<TKeys extends readonly unknown[], TPinned extends string> = T
66
66
  * `{scalar: true}` overload: `unknown` (a no-op) when the subquery pins a
67
67
  * unique key, and otherwise an object the returned query does not have, so
68
68
  * that overload stops matching and the call falls through to the general one —
69
- * where `scalar` may only be `false`.
69
+ * where `scalar` may only be `false`, and where the error is reported.
70
70
  *
71
71
  * The requirement rides on the callback's return type rather than on the
72
72
  * options parameter because TypeScript fixes `TSubPinned` to its default
@@ -75,9 +75,15 @@ type CoversSomeKey<TKeys extends readonly unknown[], TPinned extends string> = T
75
75
  * known, so the requirement is only enforceable there.
76
76
  */
77
77
  type ScalarRequirement<TTable extends string, TSchema extends ZeroSchema, TPinned extends string> = CoversSomeKey<UniqueKeysOf<TTable, TSchema>, TPinned> extends true ? unknown : {
78
- readonly [scalarNeedsUniqueKey]: 'To use {scalar: true}, the subquery must constrain every column of the primary key — or of a key declared with .unique() — to a literal with `=`. Otherwise the server ignores the hint and runs a plain EXISTS.';
78
+ readonly [scalarNeedsUniqueKey]: ScalarNeedsUniqueKey;
79
79
  };
80
80
  declare const scalarNeedsUniqueKey: unique symbol;
81
+ /**
82
+ * Why a `{scalar: true}` was rejected. tsc reports a call that matches no
83
+ * overload against the *last* overload only, so the message has to be in the
84
+ * type of the general `whereExists` overload's `scalar` option.
85
+ */
86
+ type ScalarNeedsUniqueKey = 'To use {scalar: true}, the subquery must constrain every column of the primary key — or of a key declared with .unique() — to a literal with `=`. Otherwise the server ignores the hint and runs a plain EXISTS.';
81
87
  /**
82
88
  * The columns an honored `{scalar: true}` gate pins on the *parent* query.
83
89
  *
@@ -188,7 +194,9 @@ export interface Query<TTable extends keyof TSchema['tables'] & string, TSchema
188
194
  whereExists<TRelationship extends AvailableRelationships<TTable, TSchema>, TSubPinned extends string = never>(relationship: TRelationship, cb: (q: Query<DestTableName<TTable, TSchema, TRelationship>, TSchema>) => Query<string, TSchema, any, TSubPinned> & ScalarRequirement<DestTableName<TTable, TSchema, TRelationship>, TSchema, TSubPinned>, options: ExistsOptions<boolean> & {
189
195
  scalar: true;
190
196
  }): Query<TTable, TSchema, TReturn, TPinned | ScalarPins<TTable, TSchema, TRelationship>>;
191
- whereExists<TRelationship extends AvailableRelationships<TTable, TSchema>>(relationship: TRelationship, cb: (q: Query<DestTableName<TTable, TSchema, TRelationship>, TSchema>) => Query<string, TSchema, any>, options?: ExistsOptions<false>): Query<TTable, TSchema, TReturn, TPinned>;
197
+ whereExists<TRelationship extends AvailableRelationships<TTable, TSchema>>(relationship: TRelationship, cb: (q: Query<DestTableName<TTable, TSchema, TRelationship>, TSchema>) => Query<string, TSchema, any>, options?: ExistsOptions<false | (true & {
198
+ readonly [scalarNeedsUniqueKey]: ScalarNeedsUniqueKey;
199
+ })>): Query<TTable, TSchema, TReturn, TPinned>;
192
200
  start(row: Partial<PullRow<TTable, TSchema>>, opts?: {
193
201
  inclusive: boolean;
194
202
  }): Query<TTable, TSchema, TReturn, TPinned>;
@@ -205,6 +213,7 @@ export interface Query<TTable extends keyof TSchema['tables'] & string, TSchema
205
213
  preload(options?: PreloadOptions): {
206
214
  cleanup: () => void;
207
215
  complete: Promise<void>;
216
+ cached: Promise<void>;
208
217
  };
209
218
  /**
210
219
  * @deprecated Use {@linkcode MaterializeOptions} with {@linkcode zero.materialize} instead.
@@ -235,7 +244,15 @@ export type HumanReadableRecursive<T> = undefined extends T ? ExpandRecursive<T>
235
244
  * The kind of results we want to wait for when using {@linkcode run} on {@linkcode Query}.
236
245
  *
237
246
  * `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.
247
+ * snapshot of the data at the time the query was run. It never waits: while the client is
248
+ * still starting up (its local data is being loaded and the queries registered so far are
249
+ * being hydrated) that snapshot is empty, even when data from a previous session is stored
250
+ * locally. Use `cached` or `complete` when the call has to wait for data.
251
+ *
252
+ * `cached` means we want a result the server has confirmed, but one confirmed by a previous
253
+ * connection is fine: it resolves as soon as the result is `cached` or `complete`. Use it
254
+ * on the launch path when the client may be offline and the store holds last session's
255
+ * complete result for this query. If nothing is cached it waits like `complete`.
239
256
  *
240
257
  * `complete` means we want to ensure that we have the latest result from the server. The
241
258
  * result is a complete and up-to-date view of the data. In some cases this means that we
@@ -248,7 +265,7 @@ export type HumanReadableRecursive<T> = undefined extends T ? ExpandRecursive<T>
248
265
  * time to keep the rows associated with this query after the promise has resolved.
249
266
  */
250
267
  export type RunOptions = {
251
- type: 'unknown' | 'complete';
268
+ type: 'unknown' | 'cached' | 'complete';
252
269
  ttl?: TTL | undefined;
253
270
  };
254
271
  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":"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"}
@@ -15,6 +15,7 @@ export declare class RunnableQueryImpl<TTable extends keyof TSchema['tables'] &
15
15
  preload(options?: PreloadOptions): {
16
16
  cleanup: () => void;
17
17
  complete: Promise<void>;
18
+ cached: Promise<void>;
18
19
  };
19
20
  materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;
20
21
  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":"AAAA,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,CA2BxB;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;;IAI1C,YACE,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,EAuBzB;IAEQ,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAQlE;IAEQ,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG;QAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,CAEA;IAEQ,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,WAAW,CAAC,CAAC,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EACjD,GAAG,CAAC,EAAE,GAAG,GACR,CAAC,CAAC;CAsBN"}
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;;IAI1C,YACE,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,EAuBzB;IAEQ,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAQlE;IAEQ,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,CAEA;IAEQ,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,WAAW,CAAC,CAAC,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EACjD,GAAG,CAAC,EAAE,GAAG,GACR,CAAC,CAAC;CAsBN"}
@@ -1,3 +1,4 @@
1
+ import { getOrInsertComputed, newMap, newWeakMap } from "../../../shared/src/map.js";
1
2
  import { tableAST } from "../../../zero-protocol/src/ast.js";
2
3
  import { defaultFormat } from "../../../zero-types/src/format.js";
3
4
  import { QueryImpl } from "./query-impl.js";
@@ -9,16 +10,7 @@ import { QueryImpl } from "./query-impl.js";
9
10
  */
10
11
  var rootsByDelegate = /* @__PURE__ */ new WeakMap();
11
12
  function newRunnableQuery(delegate, schema, table) {
12
- let bySchema = rootsByDelegate.get(delegate);
13
- if (!bySchema) {
14
- bySchema = /* @__PURE__ */ new WeakMap();
15
- rootsByDelegate.set(delegate, bySchema);
16
- }
17
- let roots = bySchema.get(schema);
18
- if (!roots) {
19
- roots = /* @__PURE__ */ new Map();
20
- bySchema.set(schema, roots);
21
- }
13
+ const roots = getOrInsertComputed(getOrInsertComputed(rootsByDelegate, delegate, newWeakMap), schema, newMap);
22
14
  const existing = roots.get(table)?.deref();
23
15
  if (existing) return existing;
24
16
  const created = new RunnableQueryImpl(delegate, schema, table, tableAST(table), defaultFormat, void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"runnable-query-impl.js","names":["#delegate"],"sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"sourcesContent":["import {\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 let bySchema = rootsByDelegate.get(delegate);\n if (!bySchema) {\n bySchema = new WeakMap();\n rootsByDelegate.set(delegate, bySchema);\n }\n let roots = bySchema.get(schema);\n if (!roots) {\n roots = new Map();\n bySchema.set(schema, roots);\n }\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 } {\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":";;;;;;;;;AA2BA,IAAM,kCAAkB,IAAI,QAI1B;AAEF,SAAgB,iBAId,UACA,QACA,OACwB;CACxB,IAAI,WAAW,gBAAgB,IAAI,QAAQ;CAC3C,IAAI,CAAC,UAAU;EACb,2BAAW,IAAI,QAAQ;EACvB,gBAAgB,IAAI,UAAU,QAAQ;CACxC;CACA,IAAI,QAAQ,SAAS,IAAI,MAAM;CAC/B,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,SAAS,IAAI,QAAQ,KAAK;CAC5B;CAEA,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,SAGf;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 {\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,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' | 'complete' | 'error';
4
+ export type ResultType = 'unknown' | 'cached' | '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,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"}
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 +1 @@
1
- {"version":3,"file":"database-storage.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/database-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,aAAa,IAAI,OAAO,CAAC;IAEzB,gDAAgD;IAChD,OAAO,IAAI,IAAI,CAAC;CACjB;AAaD,eAAO,MAAM,oBAAoB,wJAQ9B,CAAC;AAOJ,qBAAa,eAAe;;IAC1B,MAAM,CAAC,MAAM,CACX,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,EACZ,OAAO;;;KAAiB,GACvB,eAAe,CAiBjB;IAOD,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO;;;KAAiB,EA8BjD;IAED,KAAK,SAGJ;IA0DD,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAsBzD;CACF"}
1
+ {"version":3,"file":"database-storage.d.ts","sourceRoot":"","sources":["../../../../zqlite/src/database-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,aAAa,IAAI,OAAO,CAAC;IAEzB,gDAAgD;IAChD,OAAO,IAAI,IAAI,CAAC;CACjB;AAcD,eAAO,MAAM,oBAAoB,wJAQ9B,CAAC;AAOJ,qBAAa,eAAe;;IAC1B,MAAM,CAAC,MAAM,CACX,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,EACZ,OAAO;;;KAAiB,GACvB,eAAe,CAiBjB;IAOD,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO;;;KAAiB,EAiCjD;IAED,KAAK,SAGJ;IA+DD,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAuBzD;CACF"}