@rocicorp/zero 1.11.0-canary.2 → 1.11.0-canary.21
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.
- package/out/analyze-query/src/bin-analyze.js +9 -8
- package/out/analyze-query/src/bin-analyze.js.map +1 -1
- package/out/ast-to-zql/src/ast-to-zql.d.ts +8 -1
- package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
- package/out/ast-to-zql/src/ast-to-zql.js +25 -25
- package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
- package/out/otel/src/log-options.d.ts +16 -0
- package/out/otel/src/log-options.d.ts.map +1 -1
- package/out/otel/src/log-options.js +54 -1
- package/out/otel/src/log-options.js.map +1 -1
- package/out/replicache/src/bg-interval.d.ts +2 -1
- package/out/replicache/src/bg-interval.d.ts.map +1 -1
- package/out/replicache/src/bg-interval.js +13 -4
- package/out/replicache/src/bg-interval.js.map +1 -1
- package/out/replicache/src/btree/node.d.ts.map +1 -1
- package/out/replicache/src/btree/node.js +3 -6
- package/out/replicache/src/btree/node.js.map +1 -1
- package/out/replicache/src/dag/gc.d.ts.map +1 -1
- package/out/replicache/src/dag/gc.js +8 -11
- package/out/replicache/src/dag/gc.js.map +1 -1
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
- package/out/replicache/src/dag/lazy-store.d.ts +17 -4
- package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
- package/out/replicache/src/dag/lazy-store.js +35 -9
- package/out/replicache/src/dag/lazy-store.js.map +1 -1
- package/out/replicache/src/dag/store-impl.d.ts +12 -2
- package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
- package/out/replicache/src/dag/store-impl.js +29 -9
- package/out/replicache/src/dag/store-impl.js.map +1 -1
- package/out/replicache/src/db/rebase.d.ts +14 -2
- package/out/replicache/src/db/rebase.d.ts.map +1 -1
- package/out/replicache/src/db/rebase.js +27 -5
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/get-kv-store-provider.d.ts +1 -1
- package/out/replicache/src/get-kv-store-provider.d.ts.map +1 -1
- package/out/replicache/src/get-kv-store-provider.js +4 -4
- package/out/replicache/src/get-kv-store-provider.js.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js +28 -5
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/idb-store.d.ts +18 -0
- package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
- package/out/replicache/src/kv/idb-store.js +30 -2
- package/out/replicache/src/kv/idb-store.js.map +1 -1
- package/out/replicache/src/kv/mem-fallback-store.d.ts +54 -0
- package/out/replicache/src/kv/mem-fallback-store.d.ts.map +1 -0
- package/out/replicache/src/kv/mem-fallback-store.js +177 -0
- package/out/replicache/src/kv/mem-fallback-store.js.map +1 -0
- package/out/replicache/src/kv/mem-store.d.ts +1 -0
- package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
- package/out/replicache/src/kv/mem-store.js +3 -0
- package/out/replicache/src/kv/mem-store.js.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.js +4 -4
- package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts +22 -1
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +159 -14
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/kv/store.d.ts +6 -0
- package/out/replicache/src/kv/store.d.ts.map +1 -1
- package/out/replicache/src/new-client-channel.js.map +1 -1
- package/out/replicache/src/persist/client-gc.d.ts +2 -1
- package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
- package/out/replicache/src/persist/client-gc.js +2 -2
- package/out/replicache/src/persist/client-gc.js.map +1 -1
- package/out/replicache/src/persist/client-group-gc.d.ts +2 -1
- package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
- package/out/replicache/src/persist/client-group-gc.js +2 -2
- package/out/replicache/src/persist/client-group-gc.js.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.d.ts +28 -8
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js +97 -20
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/heartbeat.d.ts +2 -1
- package/out/replicache/src/persist/heartbeat.d.ts.map +1 -1
- package/out/replicache/src/persist/heartbeat.js +2 -2
- package/out/replicache/src/persist/heartbeat.js.map +1 -1
- package/out/replicache/src/persist/idb-databases-store-db-name.js +1 -1
- package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
- package/out/replicache/src/persist/persist.d.ts.map +1 -1
- package/out/replicache/src/persist/persist.js +18 -8
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js +6 -2
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts +85 -3
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js +321 -29
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/replicache-options.d.ts +9 -0
- package/out/replicache/src/replicache-options.d.ts.map +1 -1
- package/out/replicache/src/storage-failure.d.ts +37 -0
- package/out/replicache/src/storage-failure.d.ts.map +1 -0
- package/out/replicache/src/storage-failure.js +31 -0
- package/out/replicache/src/storage-failure.js.map +1 -0
- package/out/shared/src/arrays.d.ts +5 -0
- package/out/shared/src/arrays.d.ts.map +1 -1
- package/out/shared/src/arrays.js +8 -10
- package/out/shared/src/arrays.js.map +1 -1
- package/out/shared/src/error.d.ts +11 -0
- package/out/shared/src/error.d.ts.map +1 -1
- package/out/shared/src/error.js +35 -1
- package/out/shared/src/error.js.map +1 -1
- package/out/shared/src/iterables.d.ts +2 -0
- package/out/shared/src/iterables.d.ts.map +1 -1
- package/out/shared/src/iterables.js +18 -1
- package/out/shared/src/iterables.js.map +1 -1
- package/out/shared/src/map.d.ts +24 -2
- package/out/shared/src/map.d.ts.map +1 -1
- package/out/shared/src/map.js +18 -4
- package/out/shared/src/map.js.map +1 -1
- package/out/shared/src/random-values.js +12 -1
- package/out/shared/src/random-values.js.map +1 -1
- package/out/shared/src/ring-buffer.d.ts +10 -0
- package/out/shared/src/ring-buffer.d.ts.map +1 -1
- package/out/shared/src/ring-buffer.js +26 -1
- package/out/shared/src/ring-buffer.js.map +1 -1
- package/out/z2s/src/compiler.js +1 -1
- package/out/z2s/src/sql.d.ts.map +1 -1
- package/out/z2s/src/sql.js +2 -2
- package/out/z2s/src/sql.js.map +1 -1
- package/out/zero/package.js +3 -4
- package/out/zero/package.js.map +1 -1
- package/out/zero/src/zero.js +2 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +1 -0
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +26 -2
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +102 -6
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +254 -57
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js +3 -4
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/observability/events.js +4 -1
- package/out/zero-cache/src/observability/events.js.map +1 -1
- package/out/zero-cache/src/observability/log-throttle.d.ts +44 -0
- package/out/zero-cache/src/observability/log-throttle.d.ts.map +1 -0
- package/out/zero-cache/src/observability/log-throttle.js +76 -0
- package/out/zero-cache/src/observability/log-throttle.js.map +1 -0
- package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
- package/out/zero-cache/src/observability/metrics.js +2 -7
- package/out/zero-cache/src/observability/metrics.js.map +1 -1
- package/out/zero-cache/src/scripts/permissions.d.ts +16 -0
- package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +27 -10
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.d.ts +28 -2
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +37 -17
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +8 -1
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/mutator.js +2 -0
- package/out/zero-cache/src/server/mutator.js.map +1 -1
- package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
- package/out/zero-cache/src/server/reaper.js +2 -0
- package/out/zero-cache/src/server/reaper.js.map +1 -1
- package/out/zero-cache/src/server/replicator.d.ts +3 -0
- package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/server/replicator.js +79 -15
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/zero-dispatcher.d.ts.map +1 -1
- package/out/zero-cache/src/server/runner/zero-dispatcher.js +5 -0
- package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
- package/out/zero-cache/src/server/syncer-assigner.d.ts +14 -0
- package/out/zero-cache/src/server/syncer-assigner.d.ts.map +1 -0
- package/out/zero-cache/src/server/syncer-assigner.js +72 -0
- package/out/zero-cache/src/server/syncer-assigner.js.map +1 -0
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +24 -2
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.d.ts.map +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.js +21 -4
- package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +11 -9
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js +198 -24
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js +15 -3
- package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts +1 -0
- package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js +15 -3
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts +9 -0
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +204 -18
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +25 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js +202 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +14 -16
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +64 -143
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +37 -2
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +53 -21
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +16 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +21 -15
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +86 -23
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +68 -8
- package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +32 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts +10 -0
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js +6 -0
- package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +50 -27
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +100 -34
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts +68 -0
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +141 -0
- package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -0
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +43 -0
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.js +10 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +57 -0
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +20 -6
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.js +17 -7
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current.js +2 -1
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts +66 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js +154 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts +50 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.js +268 -0
- package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js +2 -0
- package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js +58 -7
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts +8 -2
- package/out/zero-cache/src/services/change-streamer/broadcast.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js +24 -4
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +19 -4
- package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-codec.js +28 -8
- package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +48 -6
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +130 -34
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +11 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +118 -68
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +37 -15
- package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts +3 -3
- package/out/zero-cache/src/services/change-streamer/forwarder.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js +36 -5
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts +51 -0
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +132 -0
- package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +19 -8
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts +92 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-message.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-message.js +42 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js +16 -4
- package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot.d.ts +7 -69
- package/out/zero-cache/src/services/change-streamer/snapshot.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot.js +21 -53
- package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts +6 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +27 -9
- package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +2 -2
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +9 -6
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscribe.d.ts +446 -0
- package/out/zero-cache/src/services/change-streamer/subscribe.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-streamer/subscribe.js +76 -0
- package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -0
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +33 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js +76 -0
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +17 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js +19 -3
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +5 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +35 -5
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +1 -1
- package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
- package/out/zero-cache/src/services/life-cycle.js +3 -1
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts +15 -3
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +24 -7
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config-v5.yml +11 -4
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +51 -24
- package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts +10 -2
- package/out/zero-cache/src/services/litestream/litestream-controller.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/litestream-controller.js +3 -2
- package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
- package/out/zero-cache/src/services/litestream/restore-progress.d.ts +24 -0
- package/out/zero-cache/src/services/litestream/restore-progress.d.ts.map +1 -0
- package/out/zero-cache/src/services/litestream/restore-progress.js +91 -0
- package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -0
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts +5 -0
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +7 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js +5 -6
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
- package/out/zero-cache/src/services/plannerz.d.ts +163 -0
- package/out/zero-cache/src/services/plannerz.d.ts.map +1 -0
- package/out/zero-cache/src/services/plannerz.js +267 -0
- package/out/zero-cache/src/services/plannerz.js.map +1 -0
- package/out/zero-cache/src/services/profz.d.ts +30 -0
- package/out/zero-cache/src/services/profz.d.ts.map +1 -0
- package/out/zero-cache/src/services/profz.js +145 -0
- package/out/zero-cache/src/services/profz.js.map +1 -0
- package/out/zero-cache/src/services/replicator/change-log-cookies.js +1 -1
- package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts +5 -4
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +20 -22
- package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +49 -5
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +3 -2
- package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js +50 -20
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.d.ts +35 -1
- package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js +96 -6
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +2 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +2 -2
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts +23 -2
- package/out/zero-cache/src/services/replicator/schema/backfilling.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/backfilling.js +54 -2
- package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts +6 -6
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +19 -14
- package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +11 -3
- package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker.js +5 -1
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts +12 -0
- package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +26 -14
- package/out/zero-cache/src/services/run-ast.js.map +1 -1
- package/out/zero-cache/src/services/runner.d.ts +2 -1
- package/out/zero-cache/src/services/runner.d.ts.map +1 -1
- package/out/zero-cache/src/services/runner.js +10 -2
- package/out/zero-cache/src/services/runner.js.map +1 -1
- package/out/zero-cache/src/services/statz.d.ts +4 -0
- package/out/zero-cache/src/services/statz.d.ts.map +1 -1
- package/out/zero-cache/src/services/statz.js +22 -5
- package/out/zero-cache/src/services/statz.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +19 -2
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +42 -30
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +19 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +34 -11
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +51 -2
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +142 -6
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts +81 -0
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +128 -0
- package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts +33 -0
- package/out/zero-cache/src/services/view-syncer/hydration-budget.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/hydration-budget.js +62 -0
- package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts +51 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +78 -0
- package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js +3 -3
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +50 -2
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +466 -62
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts +7 -0
- package/out/zero-cache/src/services/view-syncer/plan-warnings.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/plan-warnings.js +35 -0
- package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-covering.js +2 -6
- package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-shape.d.ts +25 -0
- package/out/zero-cache/src/services/view-syncer/query-shape.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-shape.js +28 -0
- package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.d.ts +77 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.js +206 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts +95 -0
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +155 -0
- package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +78 -4
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +158 -28
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +11 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +587 -103
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/processes.d.ts +39 -0
- package/out/zero-cache/src/types/processes.d.ts.map +1 -1
- package/out/zero-cache/src/types/processes.js +43 -4
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/profiler.d.ts +12 -0
- package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
- package/out/zero-cache/src/types/profiler.js +46 -1
- package/out/zero-cache/src/types/profiler.js.map +1 -1
- package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
- package/out/zero-cache/src/types/row-key.js +5 -5
- package/out/zero-cache/src/types/row-key.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts +49 -7
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js +190 -58
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/subscription.d.ts +15 -0
- package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
- package/out/zero-cache/src/types/subscription.js +123 -31
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
- package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
- package/out/zero-cache/src/types/websocket-handoff.js +18 -9
- package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
- package/out/zero-cache/src/types/ws.d.ts.map +1 -1
- package/out/zero-cache/src/types/ws.js +1 -16
- package/out/zero-cache/src/types/ws.js.map +1 -1
- package/out/zero-cache/src/workers/connect-params.d.ts +1 -0
- package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connect-params.js.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js +21 -16
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer.js +55 -4
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/active-clients-manager.js +4 -1
- package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts +20 -0
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +77 -13
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
- package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.js +3 -1
- package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
- package/out/zero-client/src/client/connection.d.ts +6 -0
- package/out/zero-client/src/client/connection.d.ts.map +1 -1
- package/out/zero-client/src/client/connection.js +2 -1
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +22 -12
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +92 -25
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/custom.js +2 -2
- package/out/zero-client/src/client/custom.js.map +1 -1
- package/out/zero-client/src/client/error.js +1 -1
- package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js +20 -3
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.js +5 -2
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +33 -0
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +44 -11
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero-rep.d.ts +1 -0
- package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-rep.js +8 -6
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +18 -3
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +84 -47
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/mod.d.ts +1 -0
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-client/src/mod.js +1 -0
- package/out/zero-client/src/types/query-result.d.ts +2 -0
- package/out/zero-client/src/types/query-result.d.ts.map +1 -1
- package/out/zero-events/src/status.d.ts +58 -0
- package/out/zero-events/src/status.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.js +13 -14
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +29 -29
- package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
- package/out/zero-protocol/src/query-hash.js +2 -5
- package/out/zero-protocol/src/query-hash.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts +5 -4
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js +62 -4
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/zero.js +1 -0
- package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
- package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
- package/out/zero-server/src/adapters/drizzle.js +12 -7
- package/out/zero-server/src/adapters/drizzle.js.map +1 -1
- package/out/zero-server/src/adapters/kysely.d.ts +2 -1
- package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
- package/out/zero-server/src/adapters/kysely.js +8 -2
- package/out/zero-server/src/adapters/kysely.js.map +1 -1
- package/out/zero-server/src/adapters/pg.d.ts +1 -0
- package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
- package/out/zero-server/src/adapters/pg.js +8 -2
- package/out/zero-server/src/adapters/pg.js.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
- package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.js +7 -1
- package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
- package/out/zero-server/src/adapters/prisma.d.ts +3 -2
- package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
- package/out/zero-server/src/adapters/prisma.js +8 -2
- package/out/zero-server/src/adapters/prisma.js.map +1 -1
- package/out/zero-server/src/custom.d.ts +5 -1
- package/out/zero-server/src/custom.d.ts.map +1 -1
- package/out/zero-server/src/custom.js +6 -3
- package/out/zero-server/src/custom.js.map +1 -1
- package/out/zero-server/src/logging.d.ts +2 -2
- package/out/zero-server/src/logging.d.ts.map +1 -1
- package/out/zero-server/src/logging.js +2 -2
- package/out/zero-server/src/logging.js.map +1 -1
- package/out/zero-server/src/mod.d.ts +1 -1
- package/out/zero-server/src/mod.d.ts.map +1 -1
- package/out/zero-server/src/pg-query-executor.d.ts +2 -2
- package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
- package/out/zero-server/src/pg-query-executor.js +2 -2
- package/out/zero-server/src/pg-query-executor.js.map +1 -1
- package/out/zero-server/src/process-mutations.d.ts +12 -3
- package/out/zero-server/src/process-mutations.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.js +13 -8
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/push-processor.d.ts +8 -2
- package/out/zero-server/src/push-processor.d.ts.map +1 -1
- package/out/zero-server/src/push-processor.js +12 -4
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/schema.d.ts +2 -2
- package/out/zero-server/src/schema.d.ts.map +1 -1
- package/out/zero-server/src/schema.js +2 -2
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-server/src/zql-database.d.ts +21 -1
- package/out/zero-server/src/zql-database.d.ts.map +1 -1
- package/out/zero-server/src/zql-database.js +33 -2
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-solid/src/solid-view.d.ts +17 -0
- package/out/zero-solid/src/solid-view.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.js +39 -1
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zero-solid/src/use-query.js +1 -2
- package/out/zero-solid/src/use-query.js.map +1 -1
- package/out/zero-solid/src/zero.js +1 -0
- package/out/zql/src/builder/builder.d.ts +25 -0
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +69 -19
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/builder/correlated-predicate-pushdown.d.ts +43 -0
- package/out/zql/src/builder/correlated-predicate-pushdown.d.ts.map +1 -0
- package/out/zql/src/builder/correlated-predicate-pushdown.js +161 -0
- package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -0
- package/out/zql/src/builder/debug-delegate.d.ts +6 -1
- package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
- package/out/zql/src/builder/debug-delegate.js +14 -2
- package/out/zql/src/builder/debug-delegate.js.map +1 -1
- package/out/zql/src/ivm/array-view.d.ts +29 -0
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +58 -9
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/cap.d.ts +2 -1
- package/out/zql/src/ivm/cap.d.ts.map +1 -1
- package/out/zql/src/ivm/cap.js +14 -4
- package/out/zql/src/ivm/cap.js.map +1 -1
- package/out/zql/src/ivm/connection-index.d.ts +68 -0
- package/out/zql/src/ivm/connection-index.d.ts.map +1 -0
- package/out/zql/src/ivm/connection-index.js +149 -0
- package/out/zql/src/ivm/connection-index.js.map +1 -0
- package/out/zql/src/ivm/data.d.ts.map +1 -1
- package/out/zql/src/ivm/data.js +8 -3
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
- package/out/zql/src/ivm/deferred-input.js +3 -2
- package/out/zql/src/ivm/deferred-input.js.map +1 -1
- package/out/zql/src/ivm/exists.d.ts +3 -1
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +4 -1
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.d.ts +6 -2
- package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-in.js +13 -5
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.d.ts +5 -2
- package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-out.js +4 -0
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.d.ts +8 -6
- package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-operators.js +19 -8
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter.d.ts +5 -2
- package/out/zql/src/ivm/filter.d.ts.map +1 -1
- package/out/zql/src/ivm/filter.js +10 -4
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts +9 -4
- package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +97 -46
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/join-index-tap.d.ts +33 -0
- package/out/zql/src/ivm/join-index-tap.d.ts.map +1 -0
- package/out/zql/src/ivm/join-index-tap.js +70 -0
- package/out/zql/src/ivm/join-index-tap.js.map +1 -0
- package/out/zql/src/ivm/join-index.d.ts +35 -0
- package/out/zql/src/ivm/join-index.d.ts.map +1 -0
- package/out/zql/src/ivm/join-index.js +141 -0
- package/out/zql/src/ivm/join-index.js.map +1 -0
- package/out/zql/src/ivm/join-utils.d.ts +6 -0
- package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
- package/out/zql/src/ivm/join-utils.js +22 -1
- package/out/zql/src/ivm/join-utils.js.map +1 -1
- package/out/zql/src/ivm/join.d.ts +19 -1
- package/out/zql/src/ivm/join.d.ts.map +1 -1
- package/out/zql/src/ivm/join.js +107 -15
- package/out/zql/src/ivm/join.js.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +28 -3
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +69 -33
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/memory-storage.d.ts +1 -0
- package/out/zql/src/ivm/memory-storage.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-storage.js +1 -0
- package/out/zql/src/ivm/memory-storage.js.map +1 -1
- package/out/zql/src/ivm/operator.d.ts +45 -10
- package/out/zql/src/ivm/operator.d.ts.map +1 -1
- package/out/zql/src/ivm/operator.js +9 -4
- package/out/zql/src/ivm/operator.js.map +1 -1
- package/out/zql/src/ivm/push-accumulated.d.ts +6 -1
- package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
- package/out/zql/src/ivm/push-accumulated.js +47 -2
- package/out/zql/src/ivm/push-accumulated.js.map +1 -1
- package/out/zql/src/ivm/skip.d.ts +2 -1
- package/out/zql/src/ivm/skip.d.ts.map +1 -1
- package/out/zql/src/ivm/skip.js +3 -0
- package/out/zql/src/ivm/skip.js.map +1 -1
- package/out/zql/src/ivm/take-gate.d.ts +57 -0
- package/out/zql/src/ivm/take-gate.d.ts.map +1 -0
- package/out/zql/src/ivm/take-gate.js +106 -0
- package/out/zql/src/ivm/take-gate.js.map +1 -0
- package/out/zql/src/ivm/take.d.ts +8 -2
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +139 -103
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts +3 -0
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +63 -10
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/union-fan-out.d.ts +2 -1
- package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-out.js +5 -0
- package/out/zql/src/ivm/union-fan-out.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +9 -4
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/ivm/view.d.ts +15 -0
- package/out/zql/src/ivm/view.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.d.ts +24 -1
- package/out/zql/src/mutate/custom.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.js.map +1 -1
- package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator-registry.js +2 -2
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/planner/planner-builder.d.ts +23 -3
- package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
- package/out/zql/src/planner/planner-builder.js +34 -17
- package/out/zql/src/planner/planner-builder.js.map +1 -1
- package/out/zql/src/planner/planner-connection.d.ts +58 -2
- package/out/zql/src/planner/planner-connection.d.ts.map +1 -1
- package/out/zql/src/planner/planner-connection.js +103 -11
- package/out/zql/src/planner/planner-connection.js.map +1 -1
- package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
- package/out/zql/src/planner/planner-debug.js +3 -8
- package/out/zql/src/planner/planner-debug.js.map +1 -1
- package/out/zql/src/planner/planner-graph.d.ts +10 -0
- package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
- package/out/zql/src/planner/planner-graph.js +14 -0
- package/out/zql/src/planner/planner-graph.js.map +1 -1
- package/out/zql/src/planner/planner-source.d.ts +2 -2
- package/out/zql/src/planner/planner-source.d.ts.map +1 -1
- package/out/zql/src/planner/planner-source.js +2 -2
- package/out/zql/src/planner/planner-source.js.map +1 -1
- package/out/zql/src/planner/planner-warnings.d.ts +83 -0
- package/out/zql/src/planner/planner-warnings.d.ts.map +1 -0
- package/out/zql/src/planner/planner-warnings.js +78 -0
- package/out/zql/src/planner/planner-warnings.js.map +1 -0
- package/out/zql/src/query/measure-push-operator.d.ts +2 -1
- package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
- package/out/zql/src/query/measure-push-operator.js +33 -4
- package/out/zql/src/query/measure-push-operator.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts +4 -2
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +66 -33
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +33 -6
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +1 -0
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +6 -23
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query-transitions.d.ts.map +1 -1
- package/out/zql/src/query/query-transitions.js +2 -5
- package/out/zql/src/query/query-transitions.js.map +1 -1
- package/out/zql/src/query/query.d.ts +11 -2
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
- package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.js +2 -10
- package/out/zql/src/query/runnable-query-impl.js.map +1 -1
- package/out/zql/src/query/typed-view.d.ts +1 -1
- package/out/zql/src/query/typed-view.d.ts.map +1 -1
- package/out/zqlite/src/database-storage.d.ts.map +1 -1
- package/out/zqlite/src/database-storage.js +9 -1
- package/out/zqlite/src/database-storage.js.map +1 -1
- package/out/zqlite/src/db.d.ts +9 -1
- package/out/zqlite/src/db.d.ts.map +1 -1
- package/out/zqlite/src/db.js +31 -27
- package/out/zqlite/src/db.js.map +1 -1
- package/out/zqlite/src/pending-delta.d.ts +110 -0
- package/out/zqlite/src/pending-delta.d.ts.map +1 -0
- package/out/zqlite/src/pending-delta.js +278 -0
- package/out/zqlite/src/pending-delta.js.map +1 -0
- package/out/zqlite/src/query-builder.d.ts +17 -1
- package/out/zqlite/src/query-builder.d.ts.map +1 -1
- package/out/zqlite/src/query-builder.js +111 -20
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/query-delegate.d.ts.map +1 -1
- package/out/zqlite/src/query-delegate.js +10 -7
- package/out/zqlite/src/query-delegate.js.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.js +52 -1
- package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.d.ts.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.js +5 -31
- package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
- package/out/zqlite/src/sqlite-stat4-sample.d.ts +37 -0
- package/out/zqlite/src/sqlite-stat4-sample.d.ts.map +1 -0
- package/out/zqlite/src/sqlite-stat4-sample.js +61 -0
- package/out/zqlite/src/sqlite-stat4-sample.js.map +1 -0
- package/out/zqlite/src/table-source.d.ts +82 -2
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +261 -38
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +3 -4
- package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +0 -25
- package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +0 -1
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js +0 -83
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assert, unreachable } from "../../../../shared/src/asserts.js";
|
|
2
2
|
import { deepEqual } from "../../../../shared/src/json.js";
|
|
3
|
+
import { getOrInsertComputed } from "../../../../shared/src/map.js";
|
|
3
4
|
import { must } from "../../../../shared/src/must.js";
|
|
4
5
|
import { skipYields } from "../../../../zql/src/ivm/skip-yields.js";
|
|
5
6
|
import { throwOutput } from "../../../../zql/src/ivm/operator.js";
|
|
@@ -14,13 +15,18 @@ import { resolveSimpleScalarSubqueries } from "../../../../zqlite/src/resolve-sc
|
|
|
14
15
|
import { randInt } from "../../../../shared/src/rand.js";
|
|
15
16
|
import { createSQLiteCostModel } from "../../../../zqlite/src/sqlite-cost-model.js";
|
|
16
17
|
import { reloadPermissionsIfChanged } from "../../auth/load-permissions.js";
|
|
18
|
+
import { LogThrottle } from "../../observability/log-throttle.js";
|
|
17
19
|
import { getOrCreateCounter, getOrCreateLatencyHistogram } from "../../observability/metrics.js";
|
|
18
20
|
import "../../types/row-key.js";
|
|
19
21
|
import { getSubscriptionState } from "../replicator/schema/replication-state.js";
|
|
20
22
|
import { checkClientSchema } from "./client-schema.js";
|
|
23
|
+
import { planWarningMessage } from "./plan-warnings.js";
|
|
24
|
+
import { queryShape } from "./query-shape.js";
|
|
21
25
|
import { rowIDSignatureUnit } from "./row-set-signature.js";
|
|
22
26
|
import { ResetPipelinesSignal } from "./snapshotter.js";
|
|
23
27
|
//#region ../zero-cache/src/services/view-syncer/pipeline-driver.ts
|
|
28
|
+
/** The most queries a log of an advancement timeout lists. */
|
|
29
|
+
var ADVANCE_TIMEOUT_LOG_MAX_QUERIES = 3;
|
|
24
30
|
/**
|
|
25
31
|
* No matter how fast hydration is, advancement is given at least this long to
|
|
26
32
|
* complete before doing a pipeline reset.
|
|
@@ -33,6 +39,8 @@ var MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS = 5;
|
|
|
33
39
|
var MIN_PROJECTED_ADVANCEMENT_CHANGES = 16;
|
|
34
40
|
var PROJECTED_ADVANCEMENT_RESET_MULTIPLIER = 1.5;
|
|
35
41
|
var LATE_ADVANCEMENT_FINISH_PROGRESS = .8;
|
|
42
|
+
var planWarningLogThrottle = new LogThrottle({ windowMs: 60 * 6e4 });
|
|
43
|
+
var slowAdvanceLogThrottle = new LogThrottle({ windowMs: 5 * 6e4 });
|
|
36
44
|
function randomID() {
|
|
37
45
|
return randInt(1, Number.MAX_SAFE_INTEGER).toString(36);
|
|
38
46
|
}
|
|
@@ -48,7 +56,7 @@ function minProjectedAdvancementSampleChanges(numChanges) {
|
|
|
48
56
|
}
|
|
49
57
|
function shouldResetProjectedAdvancement(elapsedMs, projectedTotalTimeMs, processedChanges, numChanges, totalHydrationTimeMs) {
|
|
50
58
|
if (projectedTotalTimeMs === void 0 || numChanges < MIN_PROJECTED_ADVANCEMENT_CHANGES || processedChanges < minProjectedAdvancementSampleChanges(numChanges) || elapsedMs < MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS) return false;
|
|
51
|
-
return projectedTotalTimeMs > advancementResetTimeLimitMs(totalHydrationTimeMs) * PROJECTED_ADVANCEMENT_RESET_MULTIPLIER;
|
|
59
|
+
return projectedTotalTimeMs - elapsedMs > advancementResetTimeLimitMs(totalHydrationTimeMs) * PROJECTED_ADVANCEMENT_RESET_MULTIPLIER;
|
|
52
60
|
}
|
|
53
61
|
function shouldFinishLateAdvancement(processedChanges, numChanges) {
|
|
54
62
|
return numChanges > 0 && processedChanges / numChanges >= LATE_ADVANCEMENT_FINISH_PROGRESS;
|
|
@@ -77,9 +85,11 @@ var PipelineDriver = class {
|
|
|
77
85
|
#shardID;
|
|
78
86
|
#logConfig;
|
|
79
87
|
#config;
|
|
88
|
+
#deferredWrites;
|
|
80
89
|
#tableSpecs = /* @__PURE__ */ new Map();
|
|
81
90
|
#allTableNames = /* @__PURE__ */ new Set();
|
|
82
91
|
#costModels;
|
|
92
|
+
#planWarningThresholds;
|
|
83
93
|
#yieldThresholdMs;
|
|
84
94
|
#streamer = null;
|
|
85
95
|
#hydrateContext = null;
|
|
@@ -89,17 +99,34 @@ var PipelineDriver = class {
|
|
|
89
99
|
#permissions = null;
|
|
90
100
|
#advanceTime = getOrCreateLatencyHistogram("sync", "ivm.advance-time", "Time to advance all queries for a given client group in response to a single change.");
|
|
91
101
|
#conflictRowsDeleted = getOrCreateCounter("sync", "ivm.conflict-rows-deleted", "Number of rows deleted because they conflicted with added row");
|
|
102
|
+
#deferredWritesFallbacks = getOrCreateCounter("sync", "ivm.deferred-writes-fallbacks", "Number of advancements written through to the replica snapshot because their changes did not fit in the deferred IVM writes budget, from the start or partway (because of the bytes held, a change that needed more rows than were left, or more rows held than reserved)");
|
|
92
103
|
#inspectorDelegate;
|
|
93
|
-
|
|
104
|
+
#queryStats;
|
|
105
|
+
/**
|
|
106
|
+
* Passes the pipelines' metrics on to the inspector, and accounts the time
|
|
107
|
+
* spent pushing to each query to the advancement in progress.
|
|
108
|
+
*/
|
|
109
|
+
#metricsDelegate = { addMetric: (metric, value, ...args) => {
|
|
110
|
+
this.#inspectorDelegate.addMetric(metric, value, ...args);
|
|
111
|
+
if (metric === "query-update-server") this.#recordAdvancePush(args[0], value);
|
|
112
|
+
} };
|
|
113
|
+
constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config, deferredWrites, queryStats) {
|
|
94
114
|
this.#lc = lc.withContext("clientGroupID", clientGroupID);
|
|
95
115
|
this.#snapshotter = snapshotter;
|
|
96
116
|
this.#storage = storage;
|
|
97
117
|
this.#shardID = shardID;
|
|
98
118
|
this.#logConfig = logConfig;
|
|
99
119
|
this.#config = config;
|
|
120
|
+
this.#deferredWrites = deferredWrites;
|
|
100
121
|
this.#inspectorDelegate = inspectorDelegate;
|
|
101
122
|
this.#costModels = enablePlanner ? /* @__PURE__ */ new WeakMap() : void 0;
|
|
123
|
+
const planWarningThresholds = {
|
|
124
|
+
rows: logConfig.planWarningRowThreshold,
|
|
125
|
+
cost: logConfig.planWarningCostThreshold
|
|
126
|
+
};
|
|
127
|
+
this.#planWarningThresholds = planWarningThresholds.rows > 0 || planWarningThresholds.cost > 0 ? planWarningThresholds : void 0;
|
|
102
128
|
this.#yieldThresholdMs = yieldThresholdMs;
|
|
129
|
+
this.#queryStats = queryStats;
|
|
103
130
|
}
|
|
104
131
|
/**
|
|
105
132
|
* Initializes the PipelineDriver to the current head of the database.
|
|
@@ -173,10 +200,23 @@ var PipelineDriver = class {
|
|
|
173
200
|
}
|
|
174
201
|
return this.#permissions;
|
|
175
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Advances the snapshot to the head of the database without diffing the
|
|
205
|
+
* change log, in preparation for hydrating queries at head.
|
|
206
|
+
*
|
|
207
|
+
* Throws a {@link ResetPipelinesSignal} if the change log records a
|
|
208
|
+
* schema change since the previous snapshot. The table specs (and any
|
|
209
|
+
* TableSources built from them) were computed at or before that snapshot
|
|
210
|
+
* and are stale with respect to the new head, so the caller must
|
|
211
|
+
* {@link reset()} before hydrating. ({@link advance()} detects this when
|
|
212
|
+
* the diff encounters the RESET op; this path skips the diff and so must
|
|
213
|
+
* check explicitly.)
|
|
214
|
+
*/
|
|
176
215
|
advanceWithoutDiff() {
|
|
177
|
-
const {
|
|
178
|
-
|
|
179
|
-
|
|
216
|
+
const { prev, curr } = this.#snapshotter.advanceWithoutDiff();
|
|
217
|
+
if (curr.schemaChangedSince(prev.version)) throw new ResetPipelinesSignal(`schema changed between ${prev.version} and ${curr.version}`, "schema-change");
|
|
218
|
+
for (const table of this.#tables.values()) table.setDB(curr.db.db);
|
|
219
|
+
return curr.version;
|
|
180
220
|
}
|
|
181
221
|
#ensureCostModelExistsIfEnabled(db) {
|
|
182
222
|
let existing = this.#costModels?.get(db);
|
|
@@ -196,6 +236,7 @@ var PipelineDriver = class {
|
|
|
196
236
|
this.#pipelines.delete(queryID);
|
|
197
237
|
this.#destroyPipeline(queryID, pipeline, "destroy");
|
|
198
238
|
}
|
|
239
|
+
this.#tables.clear();
|
|
199
240
|
this.#rowSetSignatures.clear();
|
|
200
241
|
this.#storage.destroy();
|
|
201
242
|
this.#snapshotter.destroy();
|
|
@@ -204,18 +245,76 @@ var PipelineDriver = class {
|
|
|
204
245
|
queries() {
|
|
205
246
|
return this.#pipelines;
|
|
206
247
|
}
|
|
248
|
+
/**
|
|
249
|
+
* Stats from the hydration of the pipeline for `queryID`, or `undefined` if
|
|
250
|
+
* the query has no pipeline.
|
|
251
|
+
*/
|
|
252
|
+
hydrationStats(queryID) {
|
|
253
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
254
|
+
return pipeline ? {
|
|
255
|
+
rowCount: pipeline.hydrationRowCount,
|
|
256
|
+
rowsRead: pipeline.hydrationRowsRead,
|
|
257
|
+
planWarnings: pipeline.planWarnings,
|
|
258
|
+
shape: pipeline.shape
|
|
259
|
+
} : void 0;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Logs what the planner warned about the plan it chose for `query`, at
|
|
263
|
+
* most once per query shape per {@link PLAN_WARNING_LOG_WINDOW_MS}.
|
|
264
|
+
*/
|
|
265
|
+
#logPlanWarnings(shape, { queryHash, transformationHash, queryName }, warnings) {
|
|
266
|
+
if (!this.#lc.warn) return;
|
|
267
|
+
const suppressed = planWarningLogThrottle.admit(`${queryName ?? ""}:${shape.hash}`);
|
|
268
|
+
if (suppressed === void 0) return;
|
|
269
|
+
const messages = warnings.map(planWarningMessage);
|
|
270
|
+
this.#lc.warn(`Query plan warning${queryName === void 0 ? "" : ` for ${queryName}`}: ` + messages.join(" "), {
|
|
271
|
+
zeroEvent: "query-plan-warning",
|
|
272
|
+
queryHash,
|
|
273
|
+
transformationHash,
|
|
274
|
+
...queryName !== void 0 && { queryName },
|
|
275
|
+
queryShape: shape.hash,
|
|
276
|
+
warnings,
|
|
277
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed },
|
|
278
|
+
zql: shape.zql
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
#totalRowsRead() {
|
|
282
|
+
let total = 0;
|
|
283
|
+
for (const table of this.#tables.values()) total += table.rowsRead;
|
|
284
|
+
return total;
|
|
285
|
+
}
|
|
207
286
|
totalHydrationTimeMs() {
|
|
208
287
|
let total = 0;
|
|
209
288
|
for (const pipeline of this.#pipelines.values()) total += pipeline.hydrationTimeMs;
|
|
210
289
|
return total;
|
|
211
290
|
}
|
|
212
|
-
|
|
291
|
+
/**
|
|
292
|
+
* The rows the sources hold in memory for the advancement in progress.
|
|
293
|
+
* The advancement's reservation from the {@link DeferredWritesBudget}
|
|
294
|
+
* bounds this.
|
|
295
|
+
*/
|
|
296
|
+
get pendingRows() {
|
|
297
|
+
let total = 0;
|
|
298
|
+
for (const source of this.#tables.values()) total += source.pendingRows;
|
|
299
|
+
return total;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* The estimated bytes of {@link pendingRows}, which are added to the
|
|
303
|
+
* {@link DeferredWritesBudget}'s held bytes as the advancement goes.
|
|
304
|
+
*/
|
|
305
|
+
get pendingBytes() {
|
|
306
|
+
let total = 0;
|
|
307
|
+
for (const source of this.#tables.values()) total += source.pendingBytes;
|
|
308
|
+
return total;
|
|
309
|
+
}
|
|
310
|
+
#logQueryPipelineLifecycle({ zeroEvent, pipelineRunID, queryHash, transformationHash, queryName, hydrationReason, stopReason, hydrationTimeMs, hydrationRowCount, hydrationRowsRead, pipelineLifetimeMs }) {
|
|
213
311
|
let lc = this.#lc.withContext("zeroEvent", zeroEvent).withContext("pipelineRunID", pipelineRunID).withContext("queryHash", queryHash).withContext("transformationHash", transformationHash);
|
|
214
312
|
if (queryName !== void 0) lc = lc.withContext("queryName", queryName);
|
|
215
313
|
if (hydrationReason !== void 0) lc = lc.withContext("hydrationReason", hydrationReason);
|
|
216
314
|
if (stopReason !== void 0) lc = lc.withContext("stopReason", stopReason);
|
|
217
315
|
if (hydrationTimeMs !== void 0) lc = lc.withContext("hydrationTimeMs", hydrationTimeMs);
|
|
218
316
|
if (hydrationRowCount !== void 0) lc = lc.withContext("hydrationRowCount", hydrationRowCount);
|
|
317
|
+
if (hydrationRowsRead !== void 0) lc = lc.withContext("hydrationRowsRead", hydrationRowsRead);
|
|
219
318
|
if (pipelineLifetimeMs !== void 0) lc = lc.withContext("pipelineLifetimeMs", pipelineLifetimeMs);
|
|
220
319
|
lc.info?.("query pipeline lifecycle");
|
|
221
320
|
}
|
|
@@ -232,11 +331,15 @@ var PipelineDriver = class {
|
|
|
232
331
|
this.#lc.warn?.(`Ignoring {scalar: true} on the "${table}" subquery of query ${queryID}: it does not constrain every column of any unique key ${keys.length > 0 ? `[${keys}]` : "(none on this table)"} to a literal with "=", so it is not provably limited to one row. The gate runs as a plain EXISTS.`);
|
|
233
332
|
}
|
|
234
333
|
}
|
|
334
|
+
#disableCorrelatedPredicatePushdown() {
|
|
335
|
+
return this.#config?.enableCorrelatedPredicatePushdown === false;
|
|
336
|
+
}
|
|
235
337
|
#resolveScalarSubqueries(ast) {
|
|
236
338
|
const companionRows = [];
|
|
237
339
|
const companionInputs = [];
|
|
238
340
|
const executor = (subqueryAST, childField) => {
|
|
239
341
|
const input = buildPipeline(subqueryAST, {
|
|
342
|
+
disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
|
|
240
343
|
getSource: (name) => this.#getSource(name),
|
|
241
344
|
createStorage: () => this.#createStorage(),
|
|
242
345
|
decorateSourceInput: (input) => input,
|
|
@@ -244,20 +347,25 @@ var PipelineDriver = class {
|
|
|
244
347
|
addEdge() {},
|
|
245
348
|
decorateFilterInput: (input) => input
|
|
246
349
|
}, "scalar-subquery");
|
|
350
|
+
companionInputs.push(input);
|
|
247
351
|
let node;
|
|
248
352
|
for (const n of skipYields(input.fetch({}))) node ??= n;
|
|
249
|
-
if (!node)
|
|
250
|
-
companionInputs.push(input);
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
353
|
+
if (!node) return;
|
|
253
354
|
companionRows.push({
|
|
254
355
|
table: subqueryAST.table,
|
|
255
356
|
row: node.row
|
|
256
357
|
});
|
|
257
|
-
companionInputs.push(input);
|
|
258
358
|
return node.row[childField] ?? null;
|
|
259
359
|
};
|
|
260
|
-
|
|
360
|
+
let resolved;
|
|
361
|
+
let companions;
|
|
362
|
+
let ignoredScalarHints;
|
|
363
|
+
try {
|
|
364
|
+
({ast: resolved, companions, ignoredScalarHints} = resolveSimpleScalarSubqueries(ast, this.#tableSpecs, executor));
|
|
365
|
+
} catch (e) {
|
|
366
|
+
for (const input of companionInputs) input.destroy();
|
|
367
|
+
throw e;
|
|
368
|
+
}
|
|
261
369
|
return {
|
|
262
370
|
ast: resolved,
|
|
263
371
|
companionRows,
|
|
@@ -288,6 +396,7 @@ var PipelineDriver = class {
|
|
|
288
396
|
assert(this.initialized(), "Pipeline driver must be initialized before adding queries");
|
|
289
397
|
this.removeQuery(queryID, "replace-query");
|
|
290
398
|
const pipelineRunID = randomID();
|
|
399
|
+
const shape = queryShape(query);
|
|
291
400
|
this.#logQueryPipelineLifecycle({
|
|
292
401
|
zeroEvent: "query-pipeline-hydrate-start",
|
|
293
402
|
pipelineRunID,
|
|
@@ -296,33 +405,47 @@ var PipelineDriver = class {
|
|
|
296
405
|
queryName,
|
|
297
406
|
hydrationReason
|
|
298
407
|
});
|
|
299
|
-
const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug() : void 0;
|
|
408
|
+
const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug(true) : void 0;
|
|
300
409
|
const costModel = this.#ensureCostModelExistsIfEnabled(this.#snapshotter.current().db.db);
|
|
301
410
|
assert(this.#advanceContext === null, "Cannot hydrate while advance is in progress");
|
|
302
411
|
this.#hydrateContext = { timer };
|
|
412
|
+
const rowsReadAtStart = this.#totalRowsRead();
|
|
303
413
|
let hydrationFinished = false;
|
|
304
414
|
let hydrationFailed = false;
|
|
305
415
|
let hydrationRowCount = 0;
|
|
416
|
+
let planWarnings = [];
|
|
417
|
+
const planWarningThresholds = this.#planWarningThresholds;
|
|
418
|
+
let builtInputs = [];
|
|
306
419
|
try {
|
|
307
420
|
const { ast: resolvedQuery, companionRows, companions: companionMeta, companionInputs, ignoredScalarHints } = this.#resolveScalarSubqueries(query);
|
|
421
|
+
builtInputs = [...companionInputs];
|
|
308
422
|
this.#warnIgnoredScalarHints(queryID, ignoredScalarHints);
|
|
309
423
|
const input = buildPipeline(resolvedQuery, {
|
|
310
424
|
debug: debugDelegate,
|
|
311
425
|
enableNotExists: true,
|
|
426
|
+
disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
|
|
427
|
+
enablePlannerAwarePushdown: this.#config?.enablePlannerAwarePushdown !== false,
|
|
312
428
|
getSource: (name) => this.#getSource(name),
|
|
313
429
|
createStorage: () => this.#createStorage(),
|
|
314
|
-
decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#
|
|
430
|
+
decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#metricsDelegate, "query-update-server"),
|
|
315
431
|
decorateInput: (input) => input,
|
|
316
432
|
addEdge() {},
|
|
317
|
-
decorateFilterInput: (input) => input
|
|
433
|
+
decorateFilterInput: (input) => input,
|
|
434
|
+
planWarnings: planWarningThresholds && {
|
|
435
|
+
thresholds: planWarningThresholds,
|
|
436
|
+
report: (warnings) => {
|
|
437
|
+
planWarnings = warnings;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
318
440
|
}, queryID, costModel);
|
|
441
|
+
builtInputs.push(input);
|
|
442
|
+
if (planWarnings.length > 0) this.#logPlanWarnings(shape, {
|
|
443
|
+
queryHash: queryID,
|
|
444
|
+
transformationHash,
|
|
445
|
+
queryName
|
|
446
|
+
}, planWarnings);
|
|
319
447
|
const schema = input.getSchema();
|
|
320
|
-
input.setOutput({ push: (change) =>
|
|
321
|
-
const streamer = this.#streamer;
|
|
322
|
-
assert(streamer, "must #startAccumulating() before pushing changes");
|
|
323
|
-
streamer.accumulate(queryID, schema, [change]);
|
|
324
|
-
return [];
|
|
325
|
-
} });
|
|
448
|
+
input.setOutput({ push: (change) => this.#streamPushed(queryID, schema, change) });
|
|
326
449
|
for (const change of hydrateInternal(input, queryID, must(this.#primaryKeys), this.#tableSpecs)) {
|
|
327
450
|
if (change !== "yield") hydrationRowCount++;
|
|
328
451
|
yield change;
|
|
@@ -339,6 +462,7 @@ var PipelineDriver = class {
|
|
|
339
462
|
};
|
|
340
463
|
}
|
|
341
464
|
const hydrationTimeMs = timer.totalElapsed();
|
|
465
|
+
const hydrationRowsRead = this.#totalRowsRead() - rowsReadAtStart;
|
|
342
466
|
if (runtimeDebugFlags.trackRowCountsVended) {
|
|
343
467
|
if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) {
|
|
344
468
|
let totalRowsConsidered = 0;
|
|
@@ -371,10 +495,7 @@ var PipelineDriver = class {
|
|
|
371
495
|
case 3: return [];
|
|
372
496
|
}
|
|
373
497
|
if (!scalarValuesEqual(newValue, resolvedValue)) throw new ResetPipelinesSignal(`Scalar subquery value changed for ${meta.ast.table}: ${String(resolvedValue)} -> ${String(newValue)}`, "scalar-subquery");
|
|
374
|
-
|
|
375
|
-
assert(streamer, "must #startAccumulating() before pushing changes");
|
|
376
|
-
streamer.accumulate(queryID, companionSchema, [change]);
|
|
377
|
-
return [];
|
|
498
|
+
return this.#streamPushed(queryID, companionSchema, change);
|
|
378
499
|
} });
|
|
379
500
|
liveCompanions.push({
|
|
380
501
|
input: companionInput,
|
|
@@ -387,15 +508,29 @@ var PipelineDriver = class {
|
|
|
387
508
|
input,
|
|
388
509
|
hydrationTimeMs,
|
|
389
510
|
hydrationRowCount,
|
|
511
|
+
hydrationRowsRead,
|
|
512
|
+
planWarnings,
|
|
390
513
|
hydrationReason,
|
|
391
514
|
pipelineRunID,
|
|
392
515
|
pipelineReadyAtMs,
|
|
393
516
|
transformedAst: resolvedQuery,
|
|
517
|
+
originalAst: query,
|
|
518
|
+
shape,
|
|
394
519
|
transformationHash,
|
|
395
520
|
...queryName !== void 0 && { queryName },
|
|
396
521
|
companions: liveCompanions
|
|
397
522
|
});
|
|
398
523
|
hydrationFinished = true;
|
|
524
|
+
this.#queryStats?.recordHydration({
|
|
525
|
+
queryName,
|
|
526
|
+
shape
|
|
527
|
+
}, {
|
|
528
|
+
outcome: "finished",
|
|
529
|
+
timeMs: hydrationTimeMs,
|
|
530
|
+
rowCount: hydrationRowCount,
|
|
531
|
+
rowsRead: hydrationRowsRead,
|
|
532
|
+
planWarnings
|
|
533
|
+
});
|
|
399
534
|
this.#logQueryPipelineLifecycle({
|
|
400
535
|
zeroEvent: "query-pipeline-hydrate-finish",
|
|
401
536
|
pipelineRunID,
|
|
@@ -404,10 +539,18 @@ var PipelineDriver = class {
|
|
|
404
539
|
queryName,
|
|
405
540
|
hydrationReason,
|
|
406
541
|
hydrationTimeMs,
|
|
407
|
-
hydrationRowCount
|
|
542
|
+
hydrationRowCount,
|
|
543
|
+
hydrationRowsRead
|
|
408
544
|
});
|
|
409
545
|
} catch (e) {
|
|
410
546
|
hydrationFailed = true;
|
|
547
|
+
this.#queryStats?.recordHydration({
|
|
548
|
+
queryName,
|
|
549
|
+
shape
|
|
550
|
+
}, {
|
|
551
|
+
outcome: "failed",
|
|
552
|
+
timeMs: timer.totalElapsed()
|
|
553
|
+
});
|
|
411
554
|
this.#logQueryPipelineLifecycle({
|
|
412
555
|
zeroEvent: "query-pipeline-hydrate-failed",
|
|
413
556
|
pipelineRunID,
|
|
@@ -425,16 +568,29 @@ var PipelineDriver = class {
|
|
|
425
568
|
}, "query hydration failed", e);
|
|
426
569
|
throw e;
|
|
427
570
|
} finally {
|
|
428
|
-
if (!hydrationFinished && !hydrationFailed)
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
571
|
+
if (!hydrationFinished && !hydrationFailed) {
|
|
572
|
+
this.#queryStats?.recordHydration({
|
|
573
|
+
queryName,
|
|
574
|
+
shape
|
|
575
|
+
}, {
|
|
576
|
+
outcome: "aborted",
|
|
577
|
+
timeMs: timer.totalElapsed()
|
|
578
|
+
});
|
|
579
|
+
this.#logQueryPipelineLifecycle({
|
|
580
|
+
zeroEvent: "query-pipeline-hydrate-aborted",
|
|
581
|
+
pipelineRunID,
|
|
582
|
+
queryHash: queryID,
|
|
583
|
+
transformationHash,
|
|
584
|
+
queryName,
|
|
585
|
+
hydrationReason,
|
|
586
|
+
hydrationTimeMs: timer.totalElapsed(),
|
|
587
|
+
hydrationRowCount
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
if (!hydrationFinished) {
|
|
591
|
+
for (const input of builtInputs) input.destroy();
|
|
592
|
+
this.#rowSetSignatures.delete(queryID);
|
|
593
|
+
}
|
|
438
594
|
this.#hydrateContext = null;
|
|
439
595
|
}
|
|
440
596
|
}
|
|
@@ -516,7 +672,7 @@ var PipelineDriver = class {
|
|
|
516
672
|
*/
|
|
517
673
|
advance(timer) {
|
|
518
674
|
assert(this.initialized(), "Pipeline driver must be initialized before advancing");
|
|
519
|
-
const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames);
|
|
675
|
+
const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames, this.#tables, "divergent");
|
|
520
676
|
const { prev, curr, changes } = diff;
|
|
521
677
|
this.#lc.debug?.(`advance ${prev.version} => ${curr.version}: ${changes} changes`);
|
|
522
678
|
return {
|
|
@@ -528,26 +684,38 @@ var PipelineDriver = class {
|
|
|
528
684
|
*#advance(diff, timer, numChanges) {
|
|
529
685
|
assert(this.#hydrateContext === null, "Cannot advance while hydration is in progress");
|
|
530
686
|
const totalHydrationTimeMs = this.totalHydrationTimeMs();
|
|
531
|
-
|
|
687
|
+
const advanceContext = {
|
|
532
688
|
timer,
|
|
533
689
|
totalHydrationTimeMs,
|
|
534
690
|
numChanges,
|
|
691
|
+
reservedRows: void 0,
|
|
692
|
+
heldBytes: 0,
|
|
535
693
|
currentChangeStartMs: void 0,
|
|
536
|
-
pos: 0
|
|
694
|
+
pos: 0,
|
|
695
|
+
currentTable: void 0,
|
|
696
|
+
queryStats: /* @__PURE__ */ new Map()
|
|
537
697
|
};
|
|
538
|
-
this.#
|
|
698
|
+
this.#advanceContext = advanceContext;
|
|
699
|
+
let timedOut = false;
|
|
539
700
|
try {
|
|
540
|
-
|
|
701
|
+
advanceContext.reservedRows = this.#reserveDeferredWrites(numChanges);
|
|
702
|
+
const deferWrites = advanceContext.reservedRows !== void 0;
|
|
703
|
+
if (deferWrites) diff.setPrevWrites("none");
|
|
704
|
+
for (const table of this.#tables.values()) table.setDeferWrites(deferWrites);
|
|
705
|
+
this.#lc.debug?.(`starting pipeline advancement of ${numChanges} changes with an advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms (${deferWrites ? "deferred" : "write-through"}).`);
|
|
706
|
+
for (const { table, prevValues: probedPrevValues, nextValue, rowKey } of diff) {
|
|
541
707
|
if (this.#shouldAdvanceYieldMaybeAbortAdvance()) yield "yield";
|
|
542
708
|
const start = timer.totalElapsed();
|
|
543
|
-
const advanceContext = must(this.#advanceContext);
|
|
544
709
|
advanceContext.currentChangeStartMs = start;
|
|
545
|
-
|
|
710
|
+
advanceContext.currentTable = table;
|
|
711
|
+
let holds = "fits";
|
|
546
712
|
try {
|
|
547
713
|
try {
|
|
548
714
|
const tableSource = this.#tables.get(table);
|
|
549
715
|
if (!tableSource) continue;
|
|
550
716
|
const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
|
|
717
|
+
if (nextValue !== null && !this.#reserveSecondRow(advanceContext, rowKey, primaryKey)) holds = "rows";
|
|
718
|
+
const prevValues = tableSource.reconcilePendingConflicts(probedPrevValues, nextValue, rowKey, this.#tableSpecs.get(table)?.tableSpec.uniqueKeys ?? []);
|
|
551
719
|
let editOldRow = void 0;
|
|
552
720
|
for (const prevValue of prevValues) if (nextValue && deepEqual(getRowKey(primaryKey, prevValue), getRowKey(primaryKey, nextValue))) editOldRow = prevValue;
|
|
553
721
|
else {
|
|
@@ -560,34 +728,198 @@ var PipelineDriver = class {
|
|
|
560
728
|
advanceContext.pos++;
|
|
561
729
|
}
|
|
562
730
|
this.#shouldAdvanceYieldMaybeAbortAdvance(false);
|
|
731
|
+
if (holds === "fits") holds = this.#holdPendingRows(advanceContext);
|
|
563
732
|
} finally {
|
|
564
733
|
advanceContext.currentChangeStartMs = void 0;
|
|
565
734
|
}
|
|
566
735
|
const elapsed = timer.totalElapsed() - start;
|
|
567
|
-
this.#advanceTime.recordMs(elapsed, {
|
|
568
|
-
|
|
569
|
-
type
|
|
570
|
-
});
|
|
736
|
+
this.#advanceTime.recordMs(elapsed, { table });
|
|
737
|
+
if (holds !== "fits") yield* this.#writeThrough(advanceContext, diff, holds);
|
|
571
738
|
}
|
|
572
739
|
const { curr } = diff;
|
|
573
740
|
for (const table of this.#tables.values()) table.setDB(curr.db.db);
|
|
574
741
|
this.#ensureCostModelExistsIfEnabled(curr.db.db);
|
|
575
742
|
this.#lc.debug?.(`Advanced to ${curr.version}`);
|
|
743
|
+
this.#logSlowAdvances(advanceContext);
|
|
744
|
+
} catch (e) {
|
|
745
|
+
if (e instanceof ResetPipelinesSignal && e.reason === "advancement-timeout") {
|
|
746
|
+
timedOut = true;
|
|
747
|
+
this.#logAdvanceTimeout(advanceContext, e);
|
|
748
|
+
}
|
|
749
|
+
throw e;
|
|
576
750
|
} finally {
|
|
751
|
+
if (advanceContext.reservedRows !== void 0) for (const table of this.#tables.values()) table.discardPendingChanges();
|
|
752
|
+
this.#releaseDeferredWrites(advanceContext);
|
|
577
753
|
this.#advanceContext = null;
|
|
754
|
+
this.#recordAdvanceStats(advanceContext, timedOut);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
/** Accounts the time each query took in an advancement to its shape. */
|
|
758
|
+
#recordAdvanceStats({ queryStats }, timedOut) {
|
|
759
|
+
if (this.#queryStats === void 0) return;
|
|
760
|
+
for (const [queryID, { timeMs, changes }] of queryStats) {
|
|
761
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
762
|
+
if (pipeline !== void 0) this.#queryStats.recordAdvance(pipeline, {
|
|
763
|
+
timeMs,
|
|
764
|
+
changes,
|
|
765
|
+
timedOut
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* Decides how the sources apply an advancement's changes: in memory if
|
|
771
|
+
* they fit in the worker's {@link DeferredWritesBudget}, and otherwise
|
|
772
|
+
* written through to the `prev` snapshot. Returns the number of rows
|
|
773
|
+
* reserved if they are held in memory.
|
|
774
|
+
*/
|
|
775
|
+
#reserveDeferredWrites(numChanges) {
|
|
776
|
+
const budget = this.#deferredWrites;
|
|
777
|
+
if (!budget) return;
|
|
778
|
+
if (budget.tryReserve(numChanges)) return numChanges;
|
|
779
|
+
this.#deferredWritesFallbacks.add(1, { stage: "start" });
|
|
780
|
+
this.#lc.debug?.(`writing through ${numChanges} changes: ${budget.reservedRows} rows of the deferred writes budget are reserved`);
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* If the change log identifies the rows of a table by a key other than its
|
|
784
|
+
* primary key here, an entry that sets a row can change its primary key,
|
|
785
|
+
* which is two rows to a source: the old and the new. (An entry that removes
|
|
786
|
+
* a row removes the one row its key identifies.) Reserves the second row for
|
|
787
|
+
* such an entry, if the advancement holds its changes in memory, and
|
|
788
|
+
* returns whether it fit.
|
|
789
|
+
*/
|
|
790
|
+
#reserveSecondRow(advanceContext, rowKey, primaryKey) {
|
|
791
|
+
if (advanceContext.reservedRows === void 0 || isKeyedBy(rowKey, primaryKey)) return true;
|
|
792
|
+
if (!must(this.#deferredWrites).tryReserveMore(1)) return false;
|
|
793
|
+
advanceContext.reservedRows++;
|
|
794
|
+
return true;
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Writes the changes that an advancement holds in memory through to the
|
|
798
|
+
* `prev` snapshot, and the rest of its changes after them, when they no
|
|
799
|
+
* longer fit (see {@link HeldRows}). The advancement then continues as if
|
|
800
|
+
* it had written through from the start.
|
|
801
|
+
*/
|
|
802
|
+
*#writeThrough(advanceContext, diff, reason) {
|
|
803
|
+
const budget = must(this.#deferredWrites);
|
|
804
|
+
this.#deferredWritesFallbacks.add(1, {
|
|
805
|
+
stage: "partway",
|
|
806
|
+
reason
|
|
807
|
+
});
|
|
808
|
+
this.#lc.debug?.(`writing through (${reason}) at ${advanceContext.pos} of ${advanceContext.numChanges} changes, holding ${advanceContext.heldBytes} of the ${budget.heldBytes} estimated bytes held on this worker (budget: ${budget.maxBytes})`);
|
|
809
|
+
diff.setPrevWrites("divergent");
|
|
810
|
+
for (const source of this.#tables.values()) yield* source.writePendingChanges();
|
|
811
|
+
this.#releaseDeferredWrites(advanceContext);
|
|
812
|
+
}
|
|
813
|
+
#releaseDeferredWrites(advanceContext) {
|
|
814
|
+
const { reservedRows, heldBytes } = advanceContext;
|
|
815
|
+
if (reservedRows !== void 0) {
|
|
816
|
+
must(this.#deferredWrites).release(reservedRows, heldBytes);
|
|
817
|
+
advanceContext.reservedRows = void 0;
|
|
818
|
+
advanceContext.heldBytes = 0;
|
|
578
819
|
}
|
|
579
820
|
}
|
|
821
|
+
#recordAdvancePush(queryID, timeMs) {
|
|
822
|
+
const advance = this.#advanceContext;
|
|
823
|
+
if (advance === null) return;
|
|
824
|
+
const stats = getOrInsertComputed(advance.queryStats, queryID, () => ({
|
|
825
|
+
timeMs: 0,
|
|
826
|
+
changes: 0,
|
|
827
|
+
lastPos: -1,
|
|
828
|
+
timeMsByTable: /* @__PURE__ */ new Map()
|
|
829
|
+
}));
|
|
830
|
+
stats.timeMs += timeMs;
|
|
831
|
+
if (stats.lastPos !== advance.pos) {
|
|
832
|
+
stats.lastPos = advance.pos;
|
|
833
|
+
stats.changes++;
|
|
834
|
+
}
|
|
835
|
+
const table = advance.currentTable;
|
|
836
|
+
if (table !== void 0) stats.timeMsByTable.set(table, (stats.timeMsByTable.get(table) ?? 0) + timeMs);
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* The identity of the query of the pipeline for `queryID` and its
|
|
840
|
+
* {@link queryShape}, for logging.
|
|
841
|
+
*/
|
|
842
|
+
#queryForLog(queryID) {
|
|
843
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
844
|
+
if (pipeline === void 0) return;
|
|
845
|
+
const { transformationHash, queryName, shape } = pipeline;
|
|
846
|
+
return {
|
|
847
|
+
queryName,
|
|
848
|
+
shape,
|
|
849
|
+
fields: {
|
|
850
|
+
queryHash: queryID,
|
|
851
|
+
transformationHash,
|
|
852
|
+
...queryName !== void 0 && { queryName },
|
|
853
|
+
queryShape: shape.hash
|
|
854
|
+
}
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
/**
|
|
858
|
+
* Logs each query whose pushes took longer than the slow advance
|
|
859
|
+
* threshold, at most once per query shape per
|
|
860
|
+
* {@link SLOW_ADVANCE_LOG_WINDOW_MS}.
|
|
861
|
+
*/
|
|
862
|
+
#logSlowAdvances({ queryStats, numChanges }) {
|
|
863
|
+
if (!this.#lc.warn) return;
|
|
864
|
+
for (const [queryID, stats] of queryStats) {
|
|
865
|
+
if (stats.timeMs <= this.#logConfig.slowAdvanceThreshold) continue;
|
|
866
|
+
const query = this.#queryForLog(queryID);
|
|
867
|
+
if (query === void 0) continue;
|
|
868
|
+
const suppressed = slowAdvanceLogThrottle.admit(`${query.queryName ?? ""}:${query.shape.hash}`);
|
|
869
|
+
if (suppressed === void 0) continue;
|
|
870
|
+
this.#lc.warn(`Slow query advancement${query.queryName === void 0 ? "" : ` for ${query.queryName}`}: ${Math.round(stats.timeMs)} ms for ${stats.changes} of ${numChanges} changes`, {
|
|
871
|
+
zeroEvent: "query-slow-advance",
|
|
872
|
+
...query.fields,
|
|
873
|
+
advanceTimeMs: stats.timeMs,
|
|
874
|
+
changes: stats.changes,
|
|
875
|
+
advancementChanges: numChanges,
|
|
876
|
+
timeMsByTable: Object.fromEntries(stats.timeMsByTable),
|
|
877
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed },
|
|
878
|
+
zql: query.shape.zql
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
/**
|
|
883
|
+
* Logs the queries that took the most time in an advancement that timed
|
|
884
|
+
* out, since the reset that follows would otherwise not say what was slow.
|
|
885
|
+
* Throttled per query shape of the slowest query.
|
|
886
|
+
*/
|
|
887
|
+
#logAdvanceTimeout({ queryStats, numChanges }, reset) {
|
|
888
|
+
if (!this.#lc.warn) return;
|
|
889
|
+
const slowest = [...queryStats].toSorted(([, a], [, b]) => b.timeMs - a.timeMs).slice(0, ADVANCE_TIMEOUT_LOG_MAX_QUERIES).flatMap(([queryID, stats]) => {
|
|
890
|
+
const query = this.#queryForLog(queryID);
|
|
891
|
+
return query ? [{
|
|
892
|
+
query,
|
|
893
|
+
stats
|
|
894
|
+
}] : [];
|
|
895
|
+
});
|
|
896
|
+
if (slowest.length === 0) return;
|
|
897
|
+
const suppressed = slowAdvanceLogThrottle.admit(`timeout:${slowest[0].query.queryName ?? ""}:${slowest[0].query.shape.hash}`);
|
|
898
|
+
if (suppressed === void 0) return;
|
|
899
|
+
const summary = slowest.map(({ query, stats }) => `${query.queryName ?? query.fields.queryHash} (${Math.round(stats.timeMs)} ms)`).join(", ");
|
|
900
|
+
this.#lc.warn(`Advancement of ${numChanges} changes timed out. The queries that took the most time: ${summary}`, {
|
|
901
|
+
zeroEvent: "query-advance-timeout",
|
|
902
|
+
reason: reset.message,
|
|
903
|
+
advancementChanges: numChanges,
|
|
904
|
+
queries: slowest.map(({ query, stats }) => ({
|
|
905
|
+
...query.fields,
|
|
906
|
+
advanceTimeMs: stats.timeMs,
|
|
907
|
+
changes: stats.changes,
|
|
908
|
+
zql: query.shape.zql
|
|
909
|
+
})),
|
|
910
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed }
|
|
911
|
+
});
|
|
912
|
+
}
|
|
580
913
|
/** Implements `BuilderDelegate.getSource()` */
|
|
581
914
|
#getSource(tableName) {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
return source;
|
|
915
|
+
return getOrInsertComputed(this.#tables, tableName, (tableName) => {
|
|
916
|
+
const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
|
|
917
|
+
const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
|
|
918
|
+
const { db } = this.#snapshotter.current();
|
|
919
|
+
const source = new TableSource(this.#lc, this.#logConfig, db.db, tableName, tableSpec.zqlSpec, primaryKey, () => this.#shouldYield(), { skipUnobservableChanges: true });
|
|
920
|
+
this.#lc.debug?.(`created TableSource for ${tableName}`);
|
|
921
|
+
return source;
|
|
922
|
+
});
|
|
591
923
|
}
|
|
592
924
|
#shouldYield() {
|
|
593
925
|
if (this.#hydrateContext) return this.#hydrateContext.timer.elapsedLap() > this.#yieldThresholdMs();
|
|
@@ -608,9 +940,31 @@ var PipelineDriver = class {
|
|
|
608
940
|
const projectedTotalTimeMs = projectedAdvancementTimeMs(elapsed, pos, numChanges);
|
|
609
941
|
const shouldFinish = shouldFinishLateAdvancement(pos, numChanges);
|
|
610
942
|
if (!shouldFinish && shouldResetProjectedAdvancement(elapsed, projectedTotalTimeMs, pos, numChanges, totalHydrationTimeMs)) this.#throwProjectedAdvancementReset(pos, numChanges, elapsed, projectedTotalTimeMs, totalHydrationTimeMs);
|
|
611
|
-
if (!shouldFinish && elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS &&
|
|
943
|
+
if (!shouldFinish && elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS && elapsed > totalHydrationTimeMs / 2 && (projectedTotalTimeMs === void 0 || projectedTotalTimeMs - elapsed > totalHydrationTimeMs)) throw new ResetPipelinesSignal(`Advancement exceeded timeout at ${pos} of ${numChanges} changes after ${elapsed} ms. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout");
|
|
612
944
|
return checkYield && advanceTimer.elapsedLap() > this.#yieldThresholdMs();
|
|
613
945
|
}
|
|
946
|
+
/**
|
|
947
|
+
* The rows an advancement holds in memory are bounded by its reservation,
|
|
948
|
+
* but their width is not known in advance. So the bytes they are estimated
|
|
949
|
+
* to hold are added to those held by the other advancements on this worker.
|
|
950
|
+
* Says whether that takes them past the budget, or if the rows are not
|
|
951
|
+
* bounded by the reservation after all.
|
|
952
|
+
*/
|
|
953
|
+
#holdPendingRows(advanceContext) {
|
|
954
|
+
const { reservedRows, heldBytes, pos, numChanges } = advanceContext;
|
|
955
|
+
if (reservedRows === void 0) return "fits";
|
|
956
|
+
const budget = must(this.#deferredWrites);
|
|
957
|
+
const rows = this.pendingRows;
|
|
958
|
+
const bytes = this.pendingBytes;
|
|
959
|
+
advanceContext.heldBytes = bytes;
|
|
960
|
+
const bytesFit = budget.holdBytes(bytes - heldBytes);
|
|
961
|
+
if (rows > reservedRows) {
|
|
962
|
+
budget.recordRowOverrun();
|
|
963
|
+
this.#lc.error?.(`Advancement holds ${rows} rows at ${pos} of ${numChanges} changes, more than the ${reservedRows} it reserved. Writing through the rest.`);
|
|
964
|
+
return "row-overrun";
|
|
965
|
+
}
|
|
966
|
+
return bytesFit ? "fits" : "bytes";
|
|
967
|
+
}
|
|
614
968
|
#throwSlowCurrentChangeReset(pos, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs) {
|
|
615
969
|
throw new ResetPipelinesSignal(`Advancement exceeded timeout processing current change at ${pos} of ${numChanges} changes after ${currentChangeElapsedMs} ms (${elapsed} ms total). Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout");
|
|
616
970
|
}
|
|
@@ -634,6 +988,26 @@ var PipelineDriver = class {
|
|
|
634
988
|
if (this.#streamer !== null) this.#stopAccumulating();
|
|
635
989
|
}
|
|
636
990
|
}
|
|
991
|
+
/**
|
|
992
|
+
* Converts a change pushed out of a query pipeline into row changes during
|
|
993
|
+
* the push. The relationships of a pushed node are lazy, and operators such
|
|
994
|
+
* as Join compute them from the state of the push in progress: while a child
|
|
995
|
+
* change is pushed to each matching parent in turn, parents not yet pushed
|
|
996
|
+
* must not see it. Read after the push has moved on to the next parent, or
|
|
997
|
+
* after it has finished, a node's relationships show the later state, and
|
|
998
|
+
* rows that are also pushed separately are counted twice.
|
|
999
|
+
*/
|
|
1000
|
+
*#streamPushed(queryID, schema, change) {
|
|
1001
|
+
const streamer = this.#streamer;
|
|
1002
|
+
assert(streamer, "must #startAccumulating() before pushing changes");
|
|
1003
|
+
for (const rowChange of streamer.streamChange(queryID, schema, change)) {
|
|
1004
|
+
if (rowChange === "yield") {
|
|
1005
|
+
yield rowChange;
|
|
1006
|
+
continue;
|
|
1007
|
+
}
|
|
1008
|
+
must(this.#streamer).add(rowChange);
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
637
1011
|
#startAccumulating() {
|
|
638
1012
|
assert(this.#streamer === null, "Streamer already started");
|
|
639
1013
|
this.#streamer = new Streamer(must(this.#primaryKeys), this.#tableSpecs, (queryID, error) => this.#logQueryFailure(queryID, "query pipeline failed", error));
|
|
@@ -664,6 +1038,14 @@ var Streamer = class {
|
|
|
664
1038
|
this.#logQueryFailure = logQueryFailure;
|
|
665
1039
|
}
|
|
666
1040
|
#changes = [];
|
|
1041
|
+
/** Row changes that were already produced by {@link streamChange}. */
|
|
1042
|
+
#rowChanges = [];
|
|
1043
|
+
add(rowChange) {
|
|
1044
|
+
this.#rowChanges.push(rowChange);
|
|
1045
|
+
}
|
|
1046
|
+
streamChange(queryID, schema, change) {
|
|
1047
|
+
return this.#streamChanges(queryID, schema, [change]);
|
|
1048
|
+
}
|
|
667
1049
|
accumulate(queryID, schema, changes) {
|
|
668
1050
|
this.#changes.push([
|
|
669
1051
|
queryID,
|
|
@@ -673,6 +1055,7 @@ var Streamer = class {
|
|
|
673
1055
|
return this;
|
|
674
1056
|
}
|
|
675
1057
|
*stream() {
|
|
1058
|
+
yield* this.#rowChanges;
|
|
676
1059
|
for (const [queryID, schema, changes] of this.#changes) try {
|
|
677
1060
|
yield* this.#streamChanges(queryID, schema, changes);
|
|
678
1061
|
} catch (e) {
|
|
@@ -782,6 +1165,18 @@ var QueryFailureLoggingOperator = class {
|
|
|
782
1165
|
throw e;
|
|
783
1166
|
}
|
|
784
1167
|
}
|
|
1168
|
+
*reconcile(_pusher) {
|
|
1169
|
+
if (this.#output.reconcile) try {
|
|
1170
|
+
yield* this.#output.reconcile(this);
|
|
1171
|
+
} catch (e) {
|
|
1172
|
+
logQueryFailure(this.#lc, {
|
|
1173
|
+
queryHash: this.#queryHash,
|
|
1174
|
+
transformationHash: this.#transformationHash,
|
|
1175
|
+
queryName: this.#queryName
|
|
1176
|
+
}, "query pipeline failed during reconcile", e);
|
|
1177
|
+
throw e;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
785
1180
|
};
|
|
786
1181
|
function logQueryFailure(lc, queryInfo, message, error) {
|
|
787
1182
|
if (error instanceof ResetPipelinesSignal) return;
|
|
@@ -808,18 +1203,27 @@ function* toAdds(nodes) {
|
|
|
808
1203
|
function getRowKey(cols, row) {
|
|
809
1204
|
return Object.fromEntries(cols.map((col) => [col, must(row[col])]));
|
|
810
1205
|
}
|
|
1206
|
+
/** Whether `rowKey` has exactly the columns of `primaryKey`. */
|
|
1207
|
+
function isKeyedBy(rowKey, primaryKey) {
|
|
1208
|
+
let cols = 0;
|
|
1209
|
+
for (const col in rowKey) {
|
|
1210
|
+
if (!primaryKey.includes(col)) return false;
|
|
1211
|
+
cols++;
|
|
1212
|
+
}
|
|
1213
|
+
return cols === primaryKey.length;
|
|
1214
|
+
}
|
|
811
1215
|
/**
|
|
812
1216
|
* Core hydration logic used by {@link PipelineDriver#addQuery}, extracted to a
|
|
813
1217
|
* function for reuse by the analyze-query RPC path so that analysis hydrates
|
|
814
1218
|
* queries the same way the view-syncer does in production.
|
|
815
1219
|
*/
|
|
816
|
-
function
|
|
1220
|
+
function hydrate(input, hash, clientSchema, tableSpecs) {
|
|
817
1221
|
const res = input.fetch({});
|
|
818
|
-
|
|
1222
|
+
return new Streamer(buildPrimaryKeys(clientSchema), tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
|
|
819
1223
|
}
|
|
820
|
-
function
|
|
1224
|
+
function hydrateInternal(input, hash, primaryKeys, tableSpecs) {
|
|
821
1225
|
const res = input.fetch({});
|
|
822
|
-
|
|
1226
|
+
return new Streamer(primaryKeys, tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
|
|
823
1227
|
}
|
|
824
1228
|
function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map()) {
|
|
825
1229
|
for (const [tableName, { primaryKey }] of Object.entries(clientSchema.tables)) primaryKeys.set(tableName, primaryKey);
|
|
@@ -828,7 +1232,7 @@ function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map())
|
|
|
828
1232
|
function mustGetPrimaryKey(primaryKeys, table) {
|
|
829
1233
|
const pKeys = must(primaryKeys, "primaryKey map must be non-null");
|
|
830
1234
|
const rv = pKeys.get(table);
|
|
831
|
-
assert(rv, () => `table '${table}' is not one of: ${[...pKeys.keys()].sort()}. Check the spelling and ensure that the table has a primary key.`);
|
|
1235
|
+
assert(rv, () => `table '${table}' is not one of: ${JSON.stringify([...pKeys.keys()].sort())}. Check the spelling and ensure that the table has a primary key.`);
|
|
832
1236
|
return rv;
|
|
833
1237
|
}
|
|
834
1238
|
/**
|