@rocicorp/zero 1.11.0-canary.2 → 1.11.0-canary.20
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 +471 -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 +83 -46
- 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 +83 -2
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +264 -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,30 @@ 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.#pruneUnusedTables();
|
|
593
|
+
this.#rowSetSignatures.delete(queryID);
|
|
594
|
+
}
|
|
438
595
|
this.#hydrateContext = null;
|
|
439
596
|
}
|
|
440
597
|
}
|
|
@@ -447,9 +604,13 @@ var PipelineDriver = class {
|
|
|
447
604
|
if (pipeline) {
|
|
448
605
|
this.#pipelines.delete(queryID);
|
|
449
606
|
this.#destroyPipeline(queryID, pipeline, stopReason);
|
|
607
|
+
this.#pruneUnusedTables();
|
|
450
608
|
}
|
|
451
609
|
this.#rowSetSignatures.delete(queryID);
|
|
452
610
|
}
|
|
611
|
+
#pruneUnusedTables() {
|
|
612
|
+
for (const [table, source] of this.#tables.entries()) if (!source.hasConnections()) this.#tables.delete(table);
|
|
613
|
+
}
|
|
453
614
|
#destroyPipeline(queryID, pipeline, stopReason) {
|
|
454
615
|
this.#logQueryPipelineLifecycle({
|
|
455
616
|
zeroEvent: "query-pipeline-stop",
|
|
@@ -516,7 +677,7 @@ var PipelineDriver = class {
|
|
|
516
677
|
*/
|
|
517
678
|
advance(timer) {
|
|
518
679
|
assert(this.initialized(), "Pipeline driver must be initialized before advancing");
|
|
519
|
-
const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames);
|
|
680
|
+
const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames, this.#tables, "divergent");
|
|
520
681
|
const { prev, curr, changes } = diff;
|
|
521
682
|
this.#lc.debug?.(`advance ${prev.version} => ${curr.version}: ${changes} changes`);
|
|
522
683
|
return {
|
|
@@ -528,26 +689,38 @@ var PipelineDriver = class {
|
|
|
528
689
|
*#advance(diff, timer, numChanges) {
|
|
529
690
|
assert(this.#hydrateContext === null, "Cannot advance while hydration is in progress");
|
|
530
691
|
const totalHydrationTimeMs = this.totalHydrationTimeMs();
|
|
531
|
-
|
|
692
|
+
const advanceContext = {
|
|
532
693
|
timer,
|
|
533
694
|
totalHydrationTimeMs,
|
|
534
695
|
numChanges,
|
|
696
|
+
reservedRows: void 0,
|
|
697
|
+
heldBytes: 0,
|
|
535
698
|
currentChangeStartMs: void 0,
|
|
536
|
-
pos: 0
|
|
699
|
+
pos: 0,
|
|
700
|
+
currentTable: void 0,
|
|
701
|
+
queryStats: /* @__PURE__ */ new Map()
|
|
537
702
|
};
|
|
538
|
-
this.#
|
|
703
|
+
this.#advanceContext = advanceContext;
|
|
704
|
+
let timedOut = false;
|
|
539
705
|
try {
|
|
540
|
-
|
|
706
|
+
advanceContext.reservedRows = this.#reserveDeferredWrites(numChanges);
|
|
707
|
+
const deferWrites = advanceContext.reservedRows !== void 0;
|
|
708
|
+
if (deferWrites) diff.setPrevWrites("none");
|
|
709
|
+
for (const table of this.#tables.values()) table.setDeferWrites(deferWrites);
|
|
710
|
+
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"}).`);
|
|
711
|
+
for (const { table, prevValues: probedPrevValues, nextValue, rowKey } of diff) {
|
|
541
712
|
if (this.#shouldAdvanceYieldMaybeAbortAdvance()) yield "yield";
|
|
542
713
|
const start = timer.totalElapsed();
|
|
543
|
-
const advanceContext = must(this.#advanceContext);
|
|
544
714
|
advanceContext.currentChangeStartMs = start;
|
|
545
|
-
|
|
715
|
+
advanceContext.currentTable = table;
|
|
716
|
+
let holds = "fits";
|
|
546
717
|
try {
|
|
547
718
|
try {
|
|
548
719
|
const tableSource = this.#tables.get(table);
|
|
549
720
|
if (!tableSource) continue;
|
|
550
721
|
const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
|
|
722
|
+
if (nextValue !== null && !this.#reserveSecondRow(advanceContext, rowKey, primaryKey)) holds = "rows";
|
|
723
|
+
const prevValues = tableSource.reconcilePendingConflicts(probedPrevValues, nextValue, rowKey, this.#tableSpecs.get(table)?.tableSpec.uniqueKeys ?? []);
|
|
551
724
|
let editOldRow = void 0;
|
|
552
725
|
for (const prevValue of prevValues) if (nextValue && deepEqual(getRowKey(primaryKey, prevValue), getRowKey(primaryKey, nextValue))) editOldRow = prevValue;
|
|
553
726
|
else {
|
|
@@ -560,34 +733,198 @@ var PipelineDriver = class {
|
|
|
560
733
|
advanceContext.pos++;
|
|
561
734
|
}
|
|
562
735
|
this.#shouldAdvanceYieldMaybeAbortAdvance(false);
|
|
736
|
+
if (holds === "fits") holds = this.#holdPendingRows(advanceContext);
|
|
563
737
|
} finally {
|
|
564
738
|
advanceContext.currentChangeStartMs = void 0;
|
|
565
739
|
}
|
|
566
740
|
const elapsed = timer.totalElapsed() - start;
|
|
567
|
-
this.#advanceTime.recordMs(elapsed, {
|
|
568
|
-
|
|
569
|
-
type
|
|
570
|
-
});
|
|
741
|
+
this.#advanceTime.recordMs(elapsed, { table });
|
|
742
|
+
if (holds !== "fits") yield* this.#writeThrough(advanceContext, diff, holds);
|
|
571
743
|
}
|
|
572
744
|
const { curr } = diff;
|
|
573
745
|
for (const table of this.#tables.values()) table.setDB(curr.db.db);
|
|
574
746
|
this.#ensureCostModelExistsIfEnabled(curr.db.db);
|
|
575
747
|
this.#lc.debug?.(`Advanced to ${curr.version}`);
|
|
748
|
+
this.#logSlowAdvances(advanceContext);
|
|
749
|
+
} catch (e) {
|
|
750
|
+
if (e instanceof ResetPipelinesSignal && e.reason === "advancement-timeout") {
|
|
751
|
+
timedOut = true;
|
|
752
|
+
this.#logAdvanceTimeout(advanceContext, e);
|
|
753
|
+
}
|
|
754
|
+
throw e;
|
|
576
755
|
} finally {
|
|
756
|
+
if (advanceContext.reservedRows !== void 0) for (const table of this.#tables.values()) table.discardPendingChanges();
|
|
757
|
+
this.#releaseDeferredWrites(advanceContext);
|
|
577
758
|
this.#advanceContext = null;
|
|
759
|
+
this.#recordAdvanceStats(advanceContext, timedOut);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
/** Accounts the time each query took in an advancement to its shape. */
|
|
763
|
+
#recordAdvanceStats({ queryStats }, timedOut) {
|
|
764
|
+
if (this.#queryStats === void 0) return;
|
|
765
|
+
for (const [queryID, { timeMs, changes }] of queryStats) {
|
|
766
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
767
|
+
if (pipeline !== void 0) this.#queryStats.recordAdvance(pipeline, {
|
|
768
|
+
timeMs,
|
|
769
|
+
changes,
|
|
770
|
+
timedOut
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Decides how the sources apply an advancement's changes: in memory if
|
|
776
|
+
* they fit in the worker's {@link DeferredWritesBudget}, and otherwise
|
|
777
|
+
* written through to the `prev` snapshot. Returns the number of rows
|
|
778
|
+
* reserved if they are held in memory.
|
|
779
|
+
*/
|
|
780
|
+
#reserveDeferredWrites(numChanges) {
|
|
781
|
+
const budget = this.#deferredWrites;
|
|
782
|
+
if (!budget) return;
|
|
783
|
+
if (budget.tryReserve(numChanges)) return numChanges;
|
|
784
|
+
this.#deferredWritesFallbacks.add(1, { stage: "start" });
|
|
785
|
+
this.#lc.debug?.(`writing through ${numChanges} changes: ${budget.reservedRows} rows of the deferred writes budget are reserved`);
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* If the change log identifies the rows of a table by a key other than its
|
|
789
|
+
* primary key here, an entry that sets a row can change its primary key,
|
|
790
|
+
* which is two rows to a source: the old and the new. (An entry that removes
|
|
791
|
+
* a row removes the one row its key identifies.) Reserves the second row for
|
|
792
|
+
* such an entry, if the advancement holds its changes in memory, and
|
|
793
|
+
* returns whether it fit.
|
|
794
|
+
*/
|
|
795
|
+
#reserveSecondRow(advanceContext, rowKey, primaryKey) {
|
|
796
|
+
if (advanceContext.reservedRows === void 0 || isKeyedBy(rowKey, primaryKey)) return true;
|
|
797
|
+
if (!must(this.#deferredWrites).tryReserveMore(1)) return false;
|
|
798
|
+
advanceContext.reservedRows++;
|
|
799
|
+
return true;
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Writes the changes that an advancement holds in memory through to the
|
|
803
|
+
* `prev` snapshot, and the rest of its changes after them, when they no
|
|
804
|
+
* longer fit (see {@link HeldRows}). The advancement then continues as if
|
|
805
|
+
* it had written through from the start.
|
|
806
|
+
*/
|
|
807
|
+
*#writeThrough(advanceContext, diff, reason) {
|
|
808
|
+
const budget = must(this.#deferredWrites);
|
|
809
|
+
this.#deferredWritesFallbacks.add(1, {
|
|
810
|
+
stage: "partway",
|
|
811
|
+
reason
|
|
812
|
+
});
|
|
813
|
+
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})`);
|
|
814
|
+
diff.setPrevWrites("divergent");
|
|
815
|
+
for (const source of this.#tables.values()) yield* source.writePendingChanges();
|
|
816
|
+
this.#releaseDeferredWrites(advanceContext);
|
|
817
|
+
}
|
|
818
|
+
#releaseDeferredWrites(advanceContext) {
|
|
819
|
+
const { reservedRows, heldBytes } = advanceContext;
|
|
820
|
+
if (reservedRows !== void 0) {
|
|
821
|
+
must(this.#deferredWrites).release(reservedRows, heldBytes);
|
|
822
|
+
advanceContext.reservedRows = void 0;
|
|
823
|
+
advanceContext.heldBytes = 0;
|
|
578
824
|
}
|
|
579
825
|
}
|
|
826
|
+
#recordAdvancePush(queryID, timeMs) {
|
|
827
|
+
const advance = this.#advanceContext;
|
|
828
|
+
if (advance === null) return;
|
|
829
|
+
const stats = getOrInsertComputed(advance.queryStats, queryID, () => ({
|
|
830
|
+
timeMs: 0,
|
|
831
|
+
changes: 0,
|
|
832
|
+
lastPos: -1,
|
|
833
|
+
timeMsByTable: /* @__PURE__ */ new Map()
|
|
834
|
+
}));
|
|
835
|
+
stats.timeMs += timeMs;
|
|
836
|
+
if (stats.lastPos !== advance.pos) {
|
|
837
|
+
stats.lastPos = advance.pos;
|
|
838
|
+
stats.changes++;
|
|
839
|
+
}
|
|
840
|
+
const table = advance.currentTable;
|
|
841
|
+
if (table !== void 0) stats.timeMsByTable.set(table, (stats.timeMsByTable.get(table) ?? 0) + timeMs);
|
|
842
|
+
}
|
|
843
|
+
/**
|
|
844
|
+
* The identity of the query of the pipeline for `queryID` and its
|
|
845
|
+
* {@link queryShape}, for logging.
|
|
846
|
+
*/
|
|
847
|
+
#queryForLog(queryID) {
|
|
848
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
849
|
+
if (pipeline === void 0) return;
|
|
850
|
+
const { transformationHash, queryName, shape } = pipeline;
|
|
851
|
+
return {
|
|
852
|
+
queryName,
|
|
853
|
+
shape,
|
|
854
|
+
fields: {
|
|
855
|
+
queryHash: queryID,
|
|
856
|
+
transformationHash,
|
|
857
|
+
...queryName !== void 0 && { queryName },
|
|
858
|
+
queryShape: shape.hash
|
|
859
|
+
}
|
|
860
|
+
};
|
|
861
|
+
}
|
|
862
|
+
/**
|
|
863
|
+
* Logs each query whose pushes took longer than the slow advance
|
|
864
|
+
* threshold, at most once per query shape per
|
|
865
|
+
* {@link SLOW_ADVANCE_LOG_WINDOW_MS}.
|
|
866
|
+
*/
|
|
867
|
+
#logSlowAdvances({ queryStats, numChanges }) {
|
|
868
|
+
if (!this.#lc.warn) return;
|
|
869
|
+
for (const [queryID, stats] of queryStats) {
|
|
870
|
+
if (stats.timeMs <= this.#logConfig.slowAdvanceThreshold) continue;
|
|
871
|
+
const query = this.#queryForLog(queryID);
|
|
872
|
+
if (query === void 0) continue;
|
|
873
|
+
const suppressed = slowAdvanceLogThrottle.admit(`${query.queryName ?? ""}:${query.shape.hash}`);
|
|
874
|
+
if (suppressed === void 0) continue;
|
|
875
|
+
this.#lc.warn(`Slow query advancement${query.queryName === void 0 ? "" : ` for ${query.queryName}`}: ${Math.round(stats.timeMs)} ms for ${stats.changes} of ${numChanges} changes`, {
|
|
876
|
+
zeroEvent: "query-slow-advance",
|
|
877
|
+
...query.fields,
|
|
878
|
+
advanceTimeMs: stats.timeMs,
|
|
879
|
+
changes: stats.changes,
|
|
880
|
+
advancementChanges: numChanges,
|
|
881
|
+
timeMsByTable: Object.fromEntries(stats.timeMsByTable),
|
|
882
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed },
|
|
883
|
+
zql: query.shape.zql
|
|
884
|
+
});
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
/**
|
|
888
|
+
* Logs the queries that took the most time in an advancement that timed
|
|
889
|
+
* out, since the reset that follows would otherwise not say what was slow.
|
|
890
|
+
* Throttled per query shape of the slowest query.
|
|
891
|
+
*/
|
|
892
|
+
#logAdvanceTimeout({ queryStats, numChanges }, reset) {
|
|
893
|
+
if (!this.#lc.warn) return;
|
|
894
|
+
const slowest = [...queryStats].toSorted(([, a], [, b]) => b.timeMs - a.timeMs).slice(0, ADVANCE_TIMEOUT_LOG_MAX_QUERIES).flatMap(([queryID, stats]) => {
|
|
895
|
+
const query = this.#queryForLog(queryID);
|
|
896
|
+
return query ? [{
|
|
897
|
+
query,
|
|
898
|
+
stats
|
|
899
|
+
}] : [];
|
|
900
|
+
});
|
|
901
|
+
if (slowest.length === 0) return;
|
|
902
|
+
const suppressed = slowAdvanceLogThrottle.admit(`timeout:${slowest[0].query.queryName ?? ""}:${slowest[0].query.shape.hash}`);
|
|
903
|
+
if (suppressed === void 0) return;
|
|
904
|
+
const summary = slowest.map(({ query, stats }) => `${query.queryName ?? query.fields.queryHash} (${Math.round(stats.timeMs)} ms)`).join(", ");
|
|
905
|
+
this.#lc.warn(`Advancement of ${numChanges} changes timed out. The queries that took the most time: ${summary}`, {
|
|
906
|
+
zeroEvent: "query-advance-timeout",
|
|
907
|
+
reason: reset.message,
|
|
908
|
+
advancementChanges: numChanges,
|
|
909
|
+
queries: slowest.map(({ query, stats }) => ({
|
|
910
|
+
...query.fields,
|
|
911
|
+
advanceTimeMs: stats.timeMs,
|
|
912
|
+
changes: stats.changes,
|
|
913
|
+
zql: query.shape.zql
|
|
914
|
+
})),
|
|
915
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed }
|
|
916
|
+
});
|
|
917
|
+
}
|
|
580
918
|
/** Implements `BuilderDelegate.getSource()` */
|
|
581
919
|
#getSource(tableName) {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
return source;
|
|
920
|
+
return getOrInsertComputed(this.#tables, tableName, (tableName) => {
|
|
921
|
+
const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
|
|
922
|
+
const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
|
|
923
|
+
const { db } = this.#snapshotter.current();
|
|
924
|
+
const source = new TableSource(this.#lc, this.#logConfig, db.db, tableName, tableSpec.zqlSpec, primaryKey, () => this.#shouldYield(), { skipUnobservableChanges: true });
|
|
925
|
+
this.#lc.debug?.(`created TableSource for ${tableName}`);
|
|
926
|
+
return source;
|
|
927
|
+
});
|
|
591
928
|
}
|
|
592
929
|
#shouldYield() {
|
|
593
930
|
if (this.#hydrateContext) return this.#hydrateContext.timer.elapsedLap() > this.#yieldThresholdMs();
|
|
@@ -608,9 +945,31 @@ var PipelineDriver = class {
|
|
|
608
945
|
const projectedTotalTimeMs = projectedAdvancementTimeMs(elapsed, pos, numChanges);
|
|
609
946
|
const shouldFinish = shouldFinishLateAdvancement(pos, numChanges);
|
|
610
947
|
if (!shouldFinish && shouldResetProjectedAdvancement(elapsed, projectedTotalTimeMs, pos, numChanges, totalHydrationTimeMs)) this.#throwProjectedAdvancementReset(pos, numChanges, elapsed, projectedTotalTimeMs, totalHydrationTimeMs);
|
|
611
|
-
if (!shouldFinish && elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS &&
|
|
948
|
+
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
949
|
return checkYield && advanceTimer.elapsedLap() > this.#yieldThresholdMs();
|
|
613
950
|
}
|
|
951
|
+
/**
|
|
952
|
+
* The rows an advancement holds in memory are bounded by its reservation,
|
|
953
|
+
* but their width is not known in advance. So the bytes they are estimated
|
|
954
|
+
* to hold are added to those held by the other advancements on this worker.
|
|
955
|
+
* Says whether that takes them past the budget, or if the rows are not
|
|
956
|
+
* bounded by the reservation after all.
|
|
957
|
+
*/
|
|
958
|
+
#holdPendingRows(advanceContext) {
|
|
959
|
+
const { reservedRows, heldBytes, pos, numChanges } = advanceContext;
|
|
960
|
+
if (reservedRows === void 0) return "fits";
|
|
961
|
+
const budget = must(this.#deferredWrites);
|
|
962
|
+
const rows = this.pendingRows;
|
|
963
|
+
const bytes = this.pendingBytes;
|
|
964
|
+
advanceContext.heldBytes = bytes;
|
|
965
|
+
const bytesFit = budget.holdBytes(bytes - heldBytes);
|
|
966
|
+
if (rows > reservedRows) {
|
|
967
|
+
budget.recordRowOverrun();
|
|
968
|
+
this.#lc.error?.(`Advancement holds ${rows} rows at ${pos} of ${numChanges} changes, more than the ${reservedRows} it reserved. Writing through the rest.`);
|
|
969
|
+
return "row-overrun";
|
|
970
|
+
}
|
|
971
|
+
return bytesFit ? "fits" : "bytes";
|
|
972
|
+
}
|
|
614
973
|
#throwSlowCurrentChangeReset(pos, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs) {
|
|
615
974
|
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
975
|
}
|
|
@@ -634,6 +993,26 @@ var PipelineDriver = class {
|
|
|
634
993
|
if (this.#streamer !== null) this.#stopAccumulating();
|
|
635
994
|
}
|
|
636
995
|
}
|
|
996
|
+
/**
|
|
997
|
+
* Converts a change pushed out of a query pipeline into row changes during
|
|
998
|
+
* the push. The relationships of a pushed node are lazy, and operators such
|
|
999
|
+
* as Join compute them from the state of the push in progress: while a child
|
|
1000
|
+
* change is pushed to each matching parent in turn, parents not yet pushed
|
|
1001
|
+
* must not see it. Read after the push has moved on to the next parent, or
|
|
1002
|
+
* after it has finished, a node's relationships show the later state, and
|
|
1003
|
+
* rows that are also pushed separately are counted twice.
|
|
1004
|
+
*/
|
|
1005
|
+
*#streamPushed(queryID, schema, change) {
|
|
1006
|
+
const streamer = this.#streamer;
|
|
1007
|
+
assert(streamer, "must #startAccumulating() before pushing changes");
|
|
1008
|
+
for (const rowChange of streamer.streamChange(queryID, schema, change)) {
|
|
1009
|
+
if (rowChange === "yield") {
|
|
1010
|
+
yield rowChange;
|
|
1011
|
+
continue;
|
|
1012
|
+
}
|
|
1013
|
+
must(this.#streamer).add(rowChange);
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
637
1016
|
#startAccumulating() {
|
|
638
1017
|
assert(this.#streamer === null, "Streamer already started");
|
|
639
1018
|
this.#streamer = new Streamer(must(this.#primaryKeys), this.#tableSpecs, (queryID, error) => this.#logQueryFailure(queryID, "query pipeline failed", error));
|
|
@@ -664,6 +1043,14 @@ var Streamer = class {
|
|
|
664
1043
|
this.#logQueryFailure = logQueryFailure;
|
|
665
1044
|
}
|
|
666
1045
|
#changes = [];
|
|
1046
|
+
/** Row changes that were already produced by {@link streamChange}. */
|
|
1047
|
+
#rowChanges = [];
|
|
1048
|
+
add(rowChange) {
|
|
1049
|
+
this.#rowChanges.push(rowChange);
|
|
1050
|
+
}
|
|
1051
|
+
streamChange(queryID, schema, change) {
|
|
1052
|
+
return this.#streamChanges(queryID, schema, [change]);
|
|
1053
|
+
}
|
|
667
1054
|
accumulate(queryID, schema, changes) {
|
|
668
1055
|
this.#changes.push([
|
|
669
1056
|
queryID,
|
|
@@ -673,6 +1060,7 @@ var Streamer = class {
|
|
|
673
1060
|
return this;
|
|
674
1061
|
}
|
|
675
1062
|
*stream() {
|
|
1063
|
+
yield* this.#rowChanges;
|
|
676
1064
|
for (const [queryID, schema, changes] of this.#changes) try {
|
|
677
1065
|
yield* this.#streamChanges(queryID, schema, changes);
|
|
678
1066
|
} catch (e) {
|
|
@@ -782,6 +1170,18 @@ var QueryFailureLoggingOperator = class {
|
|
|
782
1170
|
throw e;
|
|
783
1171
|
}
|
|
784
1172
|
}
|
|
1173
|
+
*reconcile(_pusher) {
|
|
1174
|
+
if (this.#output.reconcile) try {
|
|
1175
|
+
yield* this.#output.reconcile(this);
|
|
1176
|
+
} catch (e) {
|
|
1177
|
+
logQueryFailure(this.#lc, {
|
|
1178
|
+
queryHash: this.#queryHash,
|
|
1179
|
+
transformationHash: this.#transformationHash,
|
|
1180
|
+
queryName: this.#queryName
|
|
1181
|
+
}, "query pipeline failed during reconcile", e);
|
|
1182
|
+
throw e;
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
785
1185
|
};
|
|
786
1186
|
function logQueryFailure(lc, queryInfo, message, error) {
|
|
787
1187
|
if (error instanceof ResetPipelinesSignal) return;
|
|
@@ -808,18 +1208,27 @@ function* toAdds(nodes) {
|
|
|
808
1208
|
function getRowKey(cols, row) {
|
|
809
1209
|
return Object.fromEntries(cols.map((col) => [col, must(row[col])]));
|
|
810
1210
|
}
|
|
1211
|
+
/** Whether `rowKey` has exactly the columns of `primaryKey`. */
|
|
1212
|
+
function isKeyedBy(rowKey, primaryKey) {
|
|
1213
|
+
let cols = 0;
|
|
1214
|
+
for (const col in rowKey) {
|
|
1215
|
+
if (!primaryKey.includes(col)) return false;
|
|
1216
|
+
cols++;
|
|
1217
|
+
}
|
|
1218
|
+
return cols === primaryKey.length;
|
|
1219
|
+
}
|
|
811
1220
|
/**
|
|
812
1221
|
* Core hydration logic used by {@link PipelineDriver#addQuery}, extracted to a
|
|
813
1222
|
* function for reuse by the analyze-query RPC path so that analysis hydrates
|
|
814
1223
|
* queries the same way the view-syncer does in production.
|
|
815
1224
|
*/
|
|
816
|
-
function
|
|
1225
|
+
function hydrate(input, hash, clientSchema, tableSpecs) {
|
|
817
1226
|
const res = input.fetch({});
|
|
818
|
-
|
|
1227
|
+
return new Streamer(buildPrimaryKeys(clientSchema), tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
|
|
819
1228
|
}
|
|
820
|
-
function
|
|
1229
|
+
function hydrateInternal(input, hash, primaryKeys, tableSpecs) {
|
|
821
1230
|
const res = input.fetch({});
|
|
822
|
-
|
|
1231
|
+
return new Streamer(primaryKeys, tableSpecs).accumulate(hash, input.getSchema(), toAdds(res)).stream();
|
|
823
1232
|
}
|
|
824
1233
|
function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map()) {
|
|
825
1234
|
for (const [tableName, { primaryKey }] of Object.entries(clientSchema.tables)) primaryKeys.set(tableName, primaryKey);
|
|
@@ -828,7 +1237,7 @@ function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map())
|
|
|
828
1237
|
function mustGetPrimaryKey(primaryKeys, table) {
|
|
829
1238
|
const pKeys = must(primaryKeys, "primaryKey map must be non-null");
|
|
830
1239
|
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.`);
|
|
1240
|
+
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
1241
|
return rv;
|
|
833
1242
|
}
|
|
834
1243
|
/**
|