@rocicorp/zero 1.11.0-canary.3 → 1.11.0-canary.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/analyze-query/src/analyze-cli.js +4 -4
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- package/out/analyze-query/src/bin-analyze.js +13 -12
- package/out/analyze-query/src/bin-analyze.js.map +1 -1
- package/out/analyze-query/src/bin-transform.js +1 -1
- package/out/analyze-query/src/bin-transform.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 +60 -6
- 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/clients.d.ts +2 -2
- 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/base64.d.ts +19 -0
- package/out/shared/src/base64.d.ts.map +1 -0
- package/out/shared/src/base64.js +40 -0
- package/out/shared/src/base64.js.map +1 -0
- package/out/shared/src/centroid.d.ts +0 -1
- package/out/shared/src/centroid.d.ts.map +1 -1
- package/out/shared/src/centroid.js +1 -4
- package/out/shared/src/centroid.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/hash.d.ts.map +1 -1
- package/out/shared/src/hash.js +32 -7
- package/out/shared/src/hash.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/options-types.d.ts +2 -2
- package/out/shared/src/options.d.ts.map +1 -1
- package/out/shared/src/options.js +10 -7
- package/out/shared/src/options.js.map +1 -1
- package/out/shared/src/packed-boolean-map.d.ts +7 -0
- package/out/shared/src/packed-boolean-map.d.ts.map +1 -0
- package/out/shared/src/packed-boolean-map.js +36 -0
- package/out/shared/src/packed-boolean-map.js.map +1 -0
- 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/shared/src/tdigest.d.ts +10 -0
- package/out/shared/src/tdigest.d.ts.map +1 -1
- package/out/shared/src/tdigest.js +147 -63
- package/out/shared/src/tdigest.js.map +1 -1
- package/out/shared/src/valita.d.ts +13 -0
- package/out/shared/src/valita.d.ts.map +1 -1
- package/out/shared/src/valita.js +23 -23
- package/out/shared/src/valita.js.map +1 -1
- package/out/z2s/src/compiler.d.ts.map +1 -1
- package/out/z2s/src/compiler.js +10 -6
- package/out/z2s/src/compiler.js.map +1 -1
- package/out/z2s/src/sql.d.ts.map +1 -1
- package/out/z2s/src/sql.js +9 -5
- package/out/z2s/src/sql.js.map +1 -1
- package/out/zero/package.js +4 -5
- 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 +1 -0
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +46 -4
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +116 -24
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +409 -157
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.d.ts +1 -1
- package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
- package/out/zero-cache/src/custom/fetch.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/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +5 -3
- package/out/zero-cache/src/db/migration-lite.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/scripts/permissions.js +3 -3
- package/out/zero-cache/src/scripts/permissions.js.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 +117 -77
- 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 +95 -21
- 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 +16 -4
- 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/init-cleanup.d.ts +24 -0
- package/out/zero-cache/src/services/change-source/common/init-cleanup.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/common/init-cleanup.js +44 -0
- package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -0
- package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts +92 -2
- package/out/zero-cache/src/services/change-source/common/replica-restore.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-restore.js +27 -10
- package/out/zero-cache/src/services/change-source/common/replica-restore.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/custom/change-source.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +7 -3
- package/out/zero-cache/src/services/change-source/custom/change-source.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 +206 -19
- 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 +55 -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 +305 -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 +31 -18
- 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 +130 -157
- 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 +38 -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 +55 -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/logical-replication/stream.d.ts +31 -0
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +102 -3
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.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 +40 -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 +149 -27
- 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 +98 -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 +45 -2
- 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 +60 -3
- 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 +23 -10
- 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 +72 -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 +162 -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 +6 -17
- 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 +59 -8
- 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-log-initializer.d.ts +17 -0
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +44 -1
- package/out/zero-cache/src/services/change-streamer/change-log-initializer.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 +131 -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 +22 -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 +149 -78
- 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 +38 -16
- 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 +53 -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 +156 -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 +58 -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 +107 -16
- 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 +95 -4
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +293 -83
- 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 +58 -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 +123 -12
- 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 +19 -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 +23 -3
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
- package/out/zero-cache/src/services/http-service.d.ts +1 -1
- package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/http-service.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 +34 -3
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +121 -35
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/litestream/config-v5.yml +6 -7
- 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/litestream/wal-keeper.d.ts +33 -0
- package/out/zero-cache/src/services/litestream/wal-keeper.d.ts.map +1 -0
- package/out/zero-cache/src/services/litestream/wal-keeper.js +49 -0
- package/out/zero-cache/src/services/litestream/wal-keeper.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 +163 -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 +51 -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 +5 -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 +54 -21
- 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 +99 -8
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts +4 -1
- package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js +5 -2
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +16 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.js +70 -27
- package/out/zero-cache/src/services/replicator/reporter/recorder.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 +42 -22
- 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/advancement-metrics.d.ts +26 -0
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.d.ts.map +1 -0
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.js +26 -0
- package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -0
- 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/connection-context-manager.d.ts +2 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js +1 -0
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +27 -2
- 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 +85 -20
- 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 +76 -11
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +214 -40
- 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 +10 -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 +18 -4
- 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 +80 -6
- 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 +658 -195
- 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 +82 -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 +214 -0
- package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -0
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +2 -107
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.js +5 -20
- package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
- 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 +96 -14
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +214 -30
- 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 +566 -107
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/pg-data-type.d.ts +2 -0
- package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg-data-type.js +6 -1
- package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +1 -1
- package/out/zero-cache/src/types/pg.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 +1 -15
- package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
- package/out/zero-cache/src/types/row-key.js +6 -8
- 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 +18 -1
- package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connect-params.js +25 -1
- package/out/zero-cache/src/workers/connect-params.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +4 -4
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +8 -8
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +15 -7
- package/out/zero-cache/src/workers/replicator.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 +23 -13
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +94 -26
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
- package/out/zero-client/src/client/crud-impl.js +1 -1
- package/out/zero-client/src/client/crud-impl.js.map +1 -1
- package/out/zero-client/src/client/custom.d.ts +5 -4
- package/out/zero-client/src/client/custom.d.ts.map +1 -1
- package/out/zero-client/src/client/custom.js +3 -3
- package/out/zero-client/src/client/custom.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.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/keys.d.ts.map +1 -1
- package/out/zero-client/src/client/keys.js +19 -1
- package/out/zero-client/src/client/keys.js.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.d.ts +1 -1
- package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.d.ts.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.d.ts +2 -2
- package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.js +3 -7
- package/out/zero-client/src/client/mutation-tracker.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 +9 -4
- 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 +9 -0
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +47 -14
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/reload-error-handler.js +2 -2
- package/out/zero-client/src/client/reload-error-handler.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 +89 -50
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/mod.d.ts +2 -1
- 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 +64 -0
- package/out/zero-events/src/status.d.ts.map +1 -1
- package/out/zero-protocol/src/analyze-query-result.d.ts +5 -0
- package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -1
- package/out/zero-protocol/src/analyze-query-result.js.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/connect.d.ts +16 -0
- package/out/zero-protocol/src/connect.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.js +27 -1
- package/out/zero-protocol/src/connect.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +31 -31
- package/out/zero-protocol/src/feature-flag-enum.d.ts +14 -0
- package/out/zero-protocol/src/feature-flag-enum.d.ts.map +1 -0
- package/out/zero-protocol/src/feature-flag-enum.js +10 -0
- package/out/zero-protocol/src/feature-flag-enum.js.map +1 -0
- package/out/zero-protocol/src/feature-flag.d.ts +5 -0
- package/out/zero-protocol/src/feature-flag.d.ts.map +1 -0
- package/out/zero-protocol/src/inspect-down.d.ts +16 -16
- package/out/zero-protocol/src/poke.d.ts +17 -10
- package/out/zero-protocol/src/poke.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.js +3 -2
- package/out/zero-protocol/src/poke.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +30 -6
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +1 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- 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 +74 -7
- 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 +5 -1
- package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
- package/out/zero-server/src/adapters/pg.js +28 -7
- 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/closable-db-transaction.d.ts +16 -0
- package/out/zero-server/src/closable-db-transaction.d.ts.map +1 -0
- package/out/zero-server/src/closable-db-transaction.js +31 -0
- package/out/zero-server/src/closable-db-transaction.js.map +1 -0
- package/out/zero-server/src/custom.d.ts +10 -4
- package/out/zero-server/src/custom.d.ts.map +1 -1
- package/out/zero-server/src/custom.js +15 -6
- 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 +25 -4
- package/out/zero-server/src/process-mutations.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.js +103 -52
- 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 +3 -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 +61 -24
- 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 +74 -16
- 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/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 +29 -4
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +70 -34
- 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 +53 -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 +3 -3
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/mutate/mutator.d.ts +2 -2
- package/out/zql/src/mutate/mutator.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator.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 +9 -2
- package/out/zql/src/query/measure-push-operator.d.ts.map +1 -1
- package/out/zql/src/query/measure-push-operator.js +52 -5
- 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 +22 -5
- 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 +62 -30
- package/out/zqlite/src/db.js.map +1 -1
- package/out/zqlite/src/index-usage.d.ts +19 -0
- package/out/zqlite/src/index-usage.d.ts.map +1 -0
- package/out/zqlite/src/index-usage.js +49 -0
- package/out/zqlite/src/index-usage.js.map +1 -0
- 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/resolve-scalar-subqueries.d.ts +3 -1
- package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
- package/out/zqlite/src/resolve-scalar-subqueries.js +1 -0
- package/out/zqlite/src/resolve-scalar-subqueries.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 +87 -2
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +276 -42
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +4 -5
- 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
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts +0 -29
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +0 -154
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +0 -1
|
@@ -1,6 +1,8 @@
|
|
|
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";
|
|
5
|
+
import { assignProperty } from "../../../../shared/src/objects.js";
|
|
4
6
|
import { skipYields } from "../../../../zql/src/ivm/skip-yields.js";
|
|
5
7
|
import { throwOutput } from "../../../../zql/src/ivm/operator.js";
|
|
6
8
|
import { MeasurePushOperator } from "../../../../zql/src/query/measure-push-operator.js";
|
|
@@ -14,13 +16,18 @@ import { resolveSimpleScalarSubqueries } from "../../../../zqlite/src/resolve-sc
|
|
|
14
16
|
import { randInt } from "../../../../shared/src/rand.js";
|
|
15
17
|
import { createSQLiteCostModel } from "../../../../zqlite/src/sqlite-cost-model.js";
|
|
16
18
|
import { reloadPermissionsIfChanged } from "../../auth/load-permissions.js";
|
|
19
|
+
import { LogThrottle } from "../../observability/log-throttle.js";
|
|
17
20
|
import { getOrCreateCounter, getOrCreateLatencyHistogram } from "../../observability/metrics.js";
|
|
18
21
|
import "../../types/row-key.js";
|
|
19
22
|
import { getSubscriptionState } from "../replicator/schema/replication-state.js";
|
|
20
23
|
import { checkClientSchema } from "./client-schema.js";
|
|
24
|
+
import { planWarningMessage } from "./plan-warnings.js";
|
|
25
|
+
import { queryShape } from "./query-shape.js";
|
|
21
26
|
import { rowIDSignatureUnit } from "./row-set-signature.js";
|
|
22
27
|
import { ResetPipelinesSignal } from "./snapshotter.js";
|
|
23
28
|
//#region ../zero-cache/src/services/view-syncer/pipeline-driver.ts
|
|
29
|
+
/** The most queries a log of an advancement timeout lists. */
|
|
30
|
+
var ADVANCE_TIMEOUT_LOG_MAX_QUERIES = 3;
|
|
24
31
|
/**
|
|
25
32
|
* No matter how fast hydration is, advancement is given at least this long to
|
|
26
33
|
* complete before doing a pipeline reset.
|
|
@@ -33,6 +40,8 @@ var MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS = 5;
|
|
|
33
40
|
var MIN_PROJECTED_ADVANCEMENT_CHANGES = 16;
|
|
34
41
|
var PROJECTED_ADVANCEMENT_RESET_MULTIPLIER = 1.5;
|
|
35
42
|
var LATE_ADVANCEMENT_FINISH_PROGRESS = .8;
|
|
43
|
+
var planWarningLogThrottle = new LogThrottle({ windowMs: 60 * 6e4 });
|
|
44
|
+
var slowAdvanceLogThrottle = new LogThrottle({ windowMs: 5 * 6e4 });
|
|
36
45
|
function randomID() {
|
|
37
46
|
return randInt(1, Number.MAX_SAFE_INTEGER).toString(36);
|
|
38
47
|
}
|
|
@@ -46,9 +55,11 @@ function advancementResetTimeLimitMs(totalHydrationTimeMs) {
|
|
|
46
55
|
function minProjectedAdvancementSampleChanges(numChanges) {
|
|
47
56
|
return Math.max(MIN_PROJECTED_ADVANCEMENT_SAMPLE_CHANGES, Math.min(MAX_PROJECTED_ADVANCEMENT_SAMPLE_CHANGES, Math.ceil(numChanges * PROJECTED_ADVANCEMENT_SAMPLE_FRACTION)));
|
|
48
57
|
}
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
-
|
|
58
|
+
function canProjectAdvancement(elapsedMs, projectedTotalTimeMs, processedChanges, numChanges) {
|
|
59
|
+
return projectedTotalTimeMs !== void 0 && numChanges >= MIN_PROJECTED_ADVANCEMENT_CHANGES && processedChanges >= minProjectedAdvancementSampleChanges(numChanges) && elapsedMs >= MIN_PROJECTED_ADVANCEMENT_SAMPLE_MS;
|
|
60
|
+
}
|
|
61
|
+
function shouldResetProjectedAdvancement(elapsedMs, projectedTotalTimeMs, totalHydrationTimeMs) {
|
|
62
|
+
return projectedTotalTimeMs - elapsedMs > advancementResetTimeLimitMs(totalHydrationTimeMs) * PROJECTED_ADVANCEMENT_RESET_MULTIPLIER;
|
|
52
63
|
}
|
|
53
64
|
function shouldFinishLateAdvancement(processedChanges, numChanges) {
|
|
54
65
|
return numChanges > 0 && processedChanges / numChanges >= LATE_ADVANCEMENT_FINISH_PROGRESS;
|
|
@@ -56,6 +67,14 @@ function shouldFinishLateAdvancement(processedChanges, numChanges) {
|
|
|
56
67
|
function shouldResetSlowCurrentChange(currentChangeElapsedMs, totalHydrationTimeMs) {
|
|
57
68
|
return currentChangeElapsedMs > MIN_ADVANCEMENT_TIME_LIMIT_MS && currentChangeElapsedMs > advancementResetTimeLimitMs(totalHydrationTimeMs);
|
|
58
69
|
}
|
|
70
|
+
function formatAdvancementBreakdown(advanceContext, elapsed) {
|
|
71
|
+
const { diff, pushTimeMs, stage, currentChangeStartMs, currentTable } = advanceContext;
|
|
72
|
+
const totalPushMs = pushTimeMs + (stage === "push" && currentChangeStartMs !== void 0 ? Math.max(0, elapsed - currentChangeStartMs) : 0);
|
|
73
|
+
const stats = diff.stats;
|
|
74
|
+
const diffTimeMs = stats?.totalDiffMs ?? 0;
|
|
75
|
+
const clMs = stats ? ` [changelog: ${stats.changeLogReadMs.toFixed(1)}ms, parse: ${stats.parseMs.toFixed(1)}ms, rows: ${stats.rowReadMs.toFixed(1)}ms]` : "";
|
|
76
|
+
return `stage: ${stage}, diff: ${diffTimeMs.toFixed(1)}ms${clMs}, push: ${totalPushMs.toFixed(1)}ms` + (currentTable ? `, table: ${currentTable}` : "");
|
|
77
|
+
}
|
|
59
78
|
/**
|
|
60
79
|
* Manages the state of IVM pipelines for a given ViewSyncer (i.e. client group).
|
|
61
80
|
*/
|
|
@@ -67,21 +86,32 @@ var PipelineDriver = class {
|
|
|
67
86
|
* query, maintained as RowChanges are yielded from {@link addQuery} and
|
|
68
87
|
* {@link advance}. ADDs / REMOVEs XOR the row's unit in (XOR is
|
|
69
88
|
* self-inverse, so one op serves both directions); EDITs are no-ops.
|
|
70
|
-
* Hydration
|
|
71
|
-
*
|
|
89
|
+
* Hydration starts the query's entry at `0n` (the empty row set), so every
|
|
90
|
+
* hydrated query has one, even if it has no rows. A hydration that does not
|
|
91
|
+
* finish removes it.
|
|
72
92
|
*/
|
|
73
93
|
#rowSetSignatures = /* @__PURE__ */ new Map();
|
|
94
|
+
/**
|
|
95
|
+
* IDs of the queries whose {@link #rowSetSignatures} entry changed since the
|
|
96
|
+
* last {@link clearChangedRowSetSignatures}, so that the CVR flush only has
|
|
97
|
+
* to look at those instead of every query.
|
|
98
|
+
*/
|
|
99
|
+
#changedRowSetSignatures = /* @__PURE__ */ new Set();
|
|
74
100
|
#lc;
|
|
75
101
|
#snapshotter;
|
|
76
102
|
#storage;
|
|
77
103
|
#shardID;
|
|
78
104
|
#logConfig;
|
|
79
105
|
#config;
|
|
106
|
+
#deferredWrites;
|
|
80
107
|
#tableSpecs = /* @__PURE__ */ new Map();
|
|
81
108
|
#allTableNames = /* @__PURE__ */ new Set();
|
|
82
109
|
#costModels;
|
|
110
|
+
#planWarningThresholds;
|
|
83
111
|
#yieldThresholdMs;
|
|
84
112
|
#streamer = null;
|
|
113
|
+
/** The row changes of the push in progress, until #push yields them. */
|
|
114
|
+
#pushedRowChanges = null;
|
|
85
115
|
#hydrateContext = null;
|
|
86
116
|
#advanceContext = null;
|
|
87
117
|
#replicaVersion = null;
|
|
@@ -89,17 +119,34 @@ var PipelineDriver = class {
|
|
|
89
119
|
#permissions = null;
|
|
90
120
|
#advanceTime = getOrCreateLatencyHistogram("sync", "ivm.advance-time", "Time to advance all queries for a given client group in response to a single change.");
|
|
91
121
|
#conflictRowsDeleted = getOrCreateCounter("sync", "ivm.conflict-rows-deleted", "Number of rows deleted because they conflicted with added row");
|
|
122
|
+
#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
123
|
#inspectorDelegate;
|
|
93
|
-
|
|
124
|
+
#queryStats;
|
|
125
|
+
/**
|
|
126
|
+
* Passes the pipelines' metrics on to the inspector, and accounts the time
|
|
127
|
+
* spent pushing to each query to the advancement in progress.
|
|
128
|
+
*/
|
|
129
|
+
#metricsDelegate = { addMetric: (metric, value, ...args) => {
|
|
130
|
+
this.#inspectorDelegate.addMetric(metric, value, ...args);
|
|
131
|
+
if (metric === "query-update-server") this.#recordAdvancePush(args[0], value);
|
|
132
|
+
} };
|
|
133
|
+
constructor(lc, logConfig, snapshotter, shardID, storage, clientGroupID, inspectorDelegate, yieldThresholdMs, enablePlanner, config, deferredWrites, queryStats) {
|
|
94
134
|
this.#lc = lc.withContext("clientGroupID", clientGroupID);
|
|
95
135
|
this.#snapshotter = snapshotter;
|
|
96
136
|
this.#storage = storage;
|
|
97
137
|
this.#shardID = shardID;
|
|
98
138
|
this.#logConfig = logConfig;
|
|
99
139
|
this.#config = config;
|
|
140
|
+
this.#deferredWrites = deferredWrites;
|
|
100
141
|
this.#inspectorDelegate = inspectorDelegate;
|
|
101
142
|
this.#costModels = enablePlanner ? /* @__PURE__ */ new WeakMap() : void 0;
|
|
143
|
+
const planWarningThresholds = {
|
|
144
|
+
rows: logConfig.planWarningRowThreshold,
|
|
145
|
+
cost: logConfig.planWarningCostThreshold
|
|
146
|
+
};
|
|
147
|
+
this.#planWarningThresholds = planWarningThresholds.rows > 0 || planWarningThresholds.cost > 0 ? planWarningThresholds : void 0;
|
|
102
148
|
this.#yieldThresholdMs = yieldThresholdMs;
|
|
149
|
+
this.#queryStats = queryStats;
|
|
103
150
|
}
|
|
104
151
|
/**
|
|
105
152
|
* Initializes the PipelineDriver to the current head of the database.
|
|
@@ -131,6 +178,7 @@ var PipelineDriver = class {
|
|
|
131
178
|
this.#tables.clear();
|
|
132
179
|
this.#allTableNames.clear();
|
|
133
180
|
this.#rowSetSignatures.clear();
|
|
181
|
+
this.#changedRowSetSignatures.clear();
|
|
134
182
|
this.#initAndResetCommon(clientSchema);
|
|
135
183
|
}
|
|
136
184
|
#initAndResetCommon(clientSchema) {
|
|
@@ -140,11 +188,9 @@ var PipelineDriver = class {
|
|
|
140
188
|
checkClientSchema(this.#shardID, clientSchema, this.#tableSpecs, fullTables);
|
|
141
189
|
this.#allTableNames.clear();
|
|
142
190
|
for (const table of fullTables.keys()) this.#allTableNames.add(table);
|
|
143
|
-
const primaryKeys = this.#primaryKeys ??
|
|
191
|
+
const primaryKeys = buildRowKeys(clientSchema, this.#tableSpecs, this.#primaryKeys ?? void 0);
|
|
144
192
|
this.#primaryKeys = primaryKeys;
|
|
145
|
-
primaryKeys
|
|
146
|
-
for (const [table, spec] of this.#tableSpecs.entries()) primaryKeys.set(table, spec.tableSpec.primaryKey);
|
|
147
|
-
buildPrimaryKeys(clientSchema, primaryKeys);
|
|
193
|
+
this.#streamer ??= new Streamer(primaryKeys, this.#tableSpecs);
|
|
148
194
|
const { replicaVersion } = getSubscriptionState(db);
|
|
149
195
|
this.#replicaVersion = replicaVersion;
|
|
150
196
|
}
|
|
@@ -173,10 +219,23 @@ var PipelineDriver = class {
|
|
|
173
219
|
}
|
|
174
220
|
return this.#permissions;
|
|
175
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Advances the snapshot to the head of the database without diffing the
|
|
224
|
+
* change log, in preparation for hydrating queries at head.
|
|
225
|
+
*
|
|
226
|
+
* Throws a {@link ResetPipelinesSignal} if the change log records a
|
|
227
|
+
* schema change since the previous snapshot. The table specs (and any
|
|
228
|
+
* TableSources built from them) were computed at or before that snapshot
|
|
229
|
+
* and are stale with respect to the new head, so the caller must
|
|
230
|
+
* {@link reset()} before hydrating. ({@link advance()} detects this when
|
|
231
|
+
* the diff encounters the RESET op; this path skips the diff and so must
|
|
232
|
+
* check explicitly.)
|
|
233
|
+
*/
|
|
176
234
|
advanceWithoutDiff() {
|
|
177
|
-
const {
|
|
178
|
-
|
|
179
|
-
|
|
235
|
+
const { prev, curr } = this.#snapshotter.advanceWithoutDiff();
|
|
236
|
+
if (curr.schemaChangedSince(prev.version)) throw new ResetPipelinesSignal(`schema changed between ${prev.version} and ${curr.version}`, "schema-change");
|
|
237
|
+
for (const table of this.#tables.values()) table.setDB(curr.db.db);
|
|
238
|
+
return curr.version;
|
|
180
239
|
}
|
|
181
240
|
#ensureCostModelExistsIfEnabled(db) {
|
|
182
241
|
let existing = this.#costModels?.get(db);
|
|
@@ -196,7 +255,9 @@ var PipelineDriver = class {
|
|
|
196
255
|
this.#pipelines.delete(queryID);
|
|
197
256
|
this.#destroyPipeline(queryID, pipeline, "destroy");
|
|
198
257
|
}
|
|
258
|
+
this.#tables.clear();
|
|
199
259
|
this.#rowSetSignatures.clear();
|
|
260
|
+
this.#changedRowSetSignatures.clear();
|
|
200
261
|
this.#storage.destroy();
|
|
201
262
|
this.#snapshotter.destroy();
|
|
202
263
|
}
|
|
@@ -204,18 +265,76 @@ var PipelineDriver = class {
|
|
|
204
265
|
queries() {
|
|
205
266
|
return this.#pipelines;
|
|
206
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Stats from the hydration of the pipeline for `queryID`, or `undefined` if
|
|
270
|
+
* the query has no pipeline.
|
|
271
|
+
*/
|
|
272
|
+
hydrationStats(queryID) {
|
|
273
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
274
|
+
return pipeline ? {
|
|
275
|
+
rowCount: pipeline.hydrationRowCount,
|
|
276
|
+
rowsRead: pipeline.hydrationRowsRead,
|
|
277
|
+
planWarnings: pipeline.planWarnings,
|
|
278
|
+
shape: pipeline.shape
|
|
279
|
+
} : void 0;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Logs what the planner warned about the plan it chose for `query`, at
|
|
283
|
+
* most once per query shape per {@link PLAN_WARNING_LOG_WINDOW_MS}.
|
|
284
|
+
*/
|
|
285
|
+
#logPlanWarnings(shape, { queryHash, transformationHash, queryName }, warnings) {
|
|
286
|
+
if (!this.#lc.warn) return;
|
|
287
|
+
const suppressed = planWarningLogThrottle.admit(`${queryName ?? ""}:${shape.hash}`);
|
|
288
|
+
if (suppressed === void 0) return;
|
|
289
|
+
const messages = warnings.map(planWarningMessage);
|
|
290
|
+
this.#lc.warn(`Query plan warning${queryName === void 0 ? "" : ` for ${queryName}`}: ` + messages.join(" "), {
|
|
291
|
+
zeroEvent: "query-plan-warning",
|
|
292
|
+
queryHash,
|
|
293
|
+
transformationHash,
|
|
294
|
+
...queryName !== void 0 && { queryName },
|
|
295
|
+
queryShape: shape.hash,
|
|
296
|
+
warnings,
|
|
297
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed },
|
|
298
|
+
zql: shape.zql
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
#totalRowsRead() {
|
|
302
|
+
let total = 0;
|
|
303
|
+
for (const table of this.#tables.values()) total += table.rowsRead;
|
|
304
|
+
return total;
|
|
305
|
+
}
|
|
207
306
|
totalHydrationTimeMs() {
|
|
208
307
|
let total = 0;
|
|
209
308
|
for (const pipeline of this.#pipelines.values()) total += pipeline.hydrationTimeMs;
|
|
210
309
|
return total;
|
|
211
310
|
}
|
|
212
|
-
|
|
311
|
+
/**
|
|
312
|
+
* The rows the sources hold in memory for the advancement in progress.
|
|
313
|
+
* The advancement's reservation from the {@link DeferredWritesBudget}
|
|
314
|
+
* bounds this.
|
|
315
|
+
*/
|
|
316
|
+
get pendingRows() {
|
|
317
|
+
let total = 0;
|
|
318
|
+
for (const source of this.#tables.values()) total += source.pendingRows;
|
|
319
|
+
return total;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* The estimated bytes of {@link pendingRows}, which are added to the
|
|
323
|
+
* {@link DeferredWritesBudget}'s held bytes as the advancement goes.
|
|
324
|
+
*/
|
|
325
|
+
get pendingBytes() {
|
|
326
|
+
let total = 0;
|
|
327
|
+
for (const source of this.#tables.values()) total += source.pendingBytes;
|
|
328
|
+
return total;
|
|
329
|
+
}
|
|
330
|
+
#logQueryPipelineLifecycle({ zeroEvent, pipelineRunID, queryHash, transformationHash, queryName, hydrationReason, stopReason, hydrationTimeMs, hydrationRowCount, hydrationRowsRead, pipelineLifetimeMs }) {
|
|
213
331
|
let lc = this.#lc.withContext("zeroEvent", zeroEvent).withContext("pipelineRunID", pipelineRunID).withContext("queryHash", queryHash).withContext("transformationHash", transformationHash);
|
|
214
332
|
if (queryName !== void 0) lc = lc.withContext("queryName", queryName);
|
|
215
333
|
if (hydrationReason !== void 0) lc = lc.withContext("hydrationReason", hydrationReason);
|
|
216
334
|
if (stopReason !== void 0) lc = lc.withContext("stopReason", stopReason);
|
|
217
335
|
if (hydrationTimeMs !== void 0) lc = lc.withContext("hydrationTimeMs", hydrationTimeMs);
|
|
218
336
|
if (hydrationRowCount !== void 0) lc = lc.withContext("hydrationRowCount", hydrationRowCount);
|
|
337
|
+
if (hydrationRowsRead !== void 0) lc = lc.withContext("hydrationRowsRead", hydrationRowsRead);
|
|
219
338
|
if (pipelineLifetimeMs !== void 0) lc = lc.withContext("pipelineLifetimeMs", pipelineLifetimeMs);
|
|
220
339
|
lc.info?.("query pipeline lifecycle");
|
|
221
340
|
}
|
|
@@ -232,11 +351,15 @@ var PipelineDriver = class {
|
|
|
232
351
|
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
352
|
}
|
|
234
353
|
}
|
|
354
|
+
#disableCorrelatedPredicatePushdown() {
|
|
355
|
+
return this.#config?.enableCorrelatedPredicatePushdown === false;
|
|
356
|
+
}
|
|
235
357
|
#resolveScalarSubqueries(ast) {
|
|
236
|
-
const companionRows = [];
|
|
237
358
|
const companionInputs = [];
|
|
238
359
|
const executor = (subqueryAST, childField) => {
|
|
239
360
|
const input = buildPipeline(subqueryAST, {
|
|
361
|
+
enableNotExists: true,
|
|
362
|
+
disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
|
|
240
363
|
getSource: (name) => this.#getSource(name),
|
|
241
364
|
createStorage: () => this.#createStorage(),
|
|
242
365
|
decorateSourceInput: (input) => input,
|
|
@@ -244,23 +367,20 @@ var PipelineDriver = class {
|
|
|
244
367
|
addEdge() {},
|
|
245
368
|
decorateFilterInput: (input) => input
|
|
246
369
|
}, "scalar-subquery");
|
|
247
|
-
let node;
|
|
248
|
-
for (const n of skipYields(input.fetch({}))) node ??= n;
|
|
249
|
-
if (!node) {
|
|
250
|
-
companionInputs.push(input);
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
companionRows.push({
|
|
254
|
-
table: subqueryAST.table,
|
|
255
|
-
row: node.row
|
|
256
|
-
});
|
|
257
370
|
companionInputs.push(input);
|
|
258
|
-
return
|
|
371
|
+
return fetchScalarValue(input, childField);
|
|
259
372
|
};
|
|
260
|
-
|
|
373
|
+
let resolved;
|
|
374
|
+
let companions;
|
|
375
|
+
let ignoredScalarHints;
|
|
376
|
+
try {
|
|
377
|
+
({ast: resolved, companions, ignoredScalarHints} = resolveSimpleScalarSubqueries(ast, this.#tableSpecs, executor));
|
|
378
|
+
} catch (e) {
|
|
379
|
+
for (const input of companionInputs) input.destroy();
|
|
380
|
+
throw e;
|
|
381
|
+
}
|
|
261
382
|
return {
|
|
262
383
|
ast: resolved,
|
|
263
|
-
companionRows,
|
|
264
384
|
companions,
|
|
265
385
|
companionInputs,
|
|
266
386
|
ignoredScalarHints
|
|
@@ -288,6 +408,7 @@ var PipelineDriver = class {
|
|
|
288
408
|
assert(this.initialized(), "Pipeline driver must be initialized before adding queries");
|
|
289
409
|
this.removeQuery(queryID, "replace-query");
|
|
290
410
|
const pipelineRunID = randomID();
|
|
411
|
+
const shape = queryShape(query);
|
|
291
412
|
this.#logQueryPipelineLifecycle({
|
|
292
413
|
zeroEvent: "query-pipeline-hydrate-start",
|
|
293
414
|
pipelineRunID,
|
|
@@ -296,49 +417,58 @@ var PipelineDriver = class {
|
|
|
296
417
|
queryName,
|
|
297
418
|
hydrationReason
|
|
298
419
|
});
|
|
299
|
-
const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug() : void 0;
|
|
420
|
+
const debugDelegate = runtimeDebugFlags.trackRowsVended ? new Debug(true) : void 0;
|
|
300
421
|
const costModel = this.#ensureCostModelExistsIfEnabled(this.#snapshotter.current().db.db);
|
|
301
422
|
assert(this.#advanceContext === null, "Cannot hydrate while advance is in progress");
|
|
302
423
|
this.#hydrateContext = { timer };
|
|
424
|
+
const rowsReadAtStart = this.#totalRowsRead();
|
|
303
425
|
let hydrationFinished = false;
|
|
304
426
|
let hydrationFailed = false;
|
|
305
427
|
let hydrationRowCount = 0;
|
|
428
|
+
let planWarnings = [];
|
|
429
|
+
const planWarningThresholds = this.#planWarningThresholds;
|
|
430
|
+
let builtInputs = [];
|
|
306
431
|
try {
|
|
307
|
-
|
|
432
|
+
this.#rowSetSignatures.set(queryID, 0n);
|
|
433
|
+
this.#changedRowSetSignatures.add(queryID);
|
|
434
|
+
const { ast: resolvedQuery, companions: companionMeta, companionInputs, ignoredScalarHints } = this.#resolveScalarSubqueries(query);
|
|
435
|
+
builtInputs = [...companionInputs];
|
|
308
436
|
this.#warnIgnoredScalarHints(queryID, ignoredScalarHints);
|
|
309
437
|
const input = buildPipeline(resolvedQuery, {
|
|
310
438
|
debug: debugDelegate,
|
|
311
439
|
enableNotExists: true,
|
|
440
|
+
disableCorrelatedPredicatePushdown: this.#disableCorrelatedPredicatePushdown(),
|
|
441
|
+
enablePlannerAwarePushdown: this.#config?.enablePlannerAwarePushdown !== false,
|
|
312
442
|
getSource: (name) => this.#getSource(name),
|
|
313
443
|
createStorage: () => this.#createStorage(),
|
|
314
|
-
decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#
|
|
444
|
+
decorateSourceInput: (input, _queryID) => new MeasurePushOperator(new QueryFailureLoggingOperator(this.#lc, input, queryID, transformationHash, queryName), queryID, this.#metricsDelegate, "query-update-server"),
|
|
315
445
|
decorateInput: (input) => input,
|
|
316
446
|
addEdge() {},
|
|
317
|
-
decorateFilterInput: (input) => input
|
|
447
|
+
decorateFilterInput: (input) => input,
|
|
448
|
+
planWarnings: planWarningThresholds && {
|
|
449
|
+
thresholds: planWarningThresholds,
|
|
450
|
+
report: (warnings) => {
|
|
451
|
+
planWarnings = warnings;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
318
454
|
}, queryID, costModel);
|
|
455
|
+
builtInputs.push(input);
|
|
456
|
+
if (planWarnings.length > 0) this.#logPlanWarnings(shape, {
|
|
457
|
+
queryHash: queryID,
|
|
458
|
+
transformationHash,
|
|
459
|
+
queryName
|
|
460
|
+
}, planWarnings);
|
|
319
461
|
const schema = input.getSchema();
|
|
320
|
-
input.setOutput({ push: (change) =>
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
streamer.
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
if (change !== "yield") hydrationRowCount++;
|
|
328
|
-
yield change;
|
|
329
|
-
}
|
|
330
|
-
for (const { table, row } of companionRows) {
|
|
331
|
-
const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
|
|
332
|
-
hydrationRowCount++;
|
|
333
|
-
yield {
|
|
334
|
-
type: 0,
|
|
335
|
-
queryID,
|
|
336
|
-
table,
|
|
337
|
-
rowKey: getRowKey(primaryKey, row),
|
|
338
|
-
row
|
|
339
|
-
};
|
|
462
|
+
input.setOutput({ push: (change) => this.#streamPushed(queryID, schema, change) });
|
|
463
|
+
for (let i = -1; i < companionInputs.length; i++) {
|
|
464
|
+
const pipeline = i < 0 ? input : companionInputs[i];
|
|
465
|
+
for (const change of must(this.#streamer).streamNodes(queryID, i < 0 ? schema : companionStreamSchema(pipeline, companionMeta[i]), 0, pipeline.fetch({}))) {
|
|
466
|
+
if (change !== "yield") hydrationRowCount++;
|
|
467
|
+
yield change;
|
|
468
|
+
}
|
|
340
469
|
}
|
|
341
470
|
const hydrationTimeMs = timer.totalElapsed();
|
|
471
|
+
const hydrationRowsRead = this.#totalRowsRead() - rowsReadAtStart;
|
|
342
472
|
if (runtimeDebugFlags.trackRowCountsVended) {
|
|
343
473
|
if (hydrationTimeMs > this.#logConfig.slowHydrateThreshold) {
|
|
344
474
|
let totalRowsConsidered = 0;
|
|
@@ -356,7 +486,7 @@ var PipelineDriver = class {
|
|
|
356
486
|
for (let i = 0; i < companionMeta.length; i++) {
|
|
357
487
|
const meta = companionMeta[i];
|
|
358
488
|
const companionInput = companionInputs[i];
|
|
359
|
-
const companionSchema = companionInput
|
|
489
|
+
const companionSchema = companionStreamSchema(companionInput, meta);
|
|
360
490
|
const { childField, resolvedValue } = meta;
|
|
361
491
|
companionInput.setOutput({ push: (change) => {
|
|
362
492
|
let newValue;
|
|
@@ -368,13 +498,10 @@ var PipelineDriver = class {
|
|
|
368
498
|
case 1:
|
|
369
499
|
newValue = void 0;
|
|
370
500
|
break;
|
|
371
|
-
case 3: return
|
|
501
|
+
case 3: return this.#streamPushed(queryID, companionSchema, change);
|
|
372
502
|
}
|
|
373
503
|
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 [];
|
|
504
|
+
return this.#streamPushed(queryID, companionSchema, change);
|
|
378
505
|
} });
|
|
379
506
|
liveCompanions.push({
|
|
380
507
|
input: companionInput,
|
|
@@ -387,15 +514,29 @@ var PipelineDriver = class {
|
|
|
387
514
|
input,
|
|
388
515
|
hydrationTimeMs,
|
|
389
516
|
hydrationRowCount,
|
|
517
|
+
hydrationRowsRead,
|
|
518
|
+
planWarnings,
|
|
390
519
|
hydrationReason,
|
|
391
520
|
pipelineRunID,
|
|
392
521
|
pipelineReadyAtMs,
|
|
393
522
|
transformedAst: resolvedQuery,
|
|
523
|
+
originalAst: query,
|
|
524
|
+
shape,
|
|
394
525
|
transformationHash,
|
|
395
526
|
...queryName !== void 0 && { queryName },
|
|
396
527
|
companions: liveCompanions
|
|
397
528
|
});
|
|
398
529
|
hydrationFinished = true;
|
|
530
|
+
this.#queryStats?.recordHydration({
|
|
531
|
+
queryName,
|
|
532
|
+
shape
|
|
533
|
+
}, {
|
|
534
|
+
outcome: "finished",
|
|
535
|
+
timeMs: hydrationTimeMs,
|
|
536
|
+
rowCount: hydrationRowCount,
|
|
537
|
+
rowsRead: hydrationRowsRead,
|
|
538
|
+
planWarnings
|
|
539
|
+
});
|
|
399
540
|
this.#logQueryPipelineLifecycle({
|
|
400
541
|
zeroEvent: "query-pipeline-hydrate-finish",
|
|
401
542
|
pipelineRunID,
|
|
@@ -404,10 +545,18 @@ var PipelineDriver = class {
|
|
|
404
545
|
queryName,
|
|
405
546
|
hydrationReason,
|
|
406
547
|
hydrationTimeMs,
|
|
407
|
-
hydrationRowCount
|
|
548
|
+
hydrationRowCount,
|
|
549
|
+
hydrationRowsRead
|
|
408
550
|
});
|
|
409
551
|
} catch (e) {
|
|
410
552
|
hydrationFailed = true;
|
|
553
|
+
this.#queryStats?.recordHydration({
|
|
554
|
+
queryName,
|
|
555
|
+
shape
|
|
556
|
+
}, {
|
|
557
|
+
outcome: "failed",
|
|
558
|
+
timeMs: timer.totalElapsed()
|
|
559
|
+
});
|
|
411
560
|
this.#logQueryPipelineLifecycle({
|
|
412
561
|
zeroEvent: "query-pipeline-hydrate-failed",
|
|
413
562
|
pipelineRunID,
|
|
@@ -425,16 +574,30 @@ var PipelineDriver = class {
|
|
|
425
574
|
}, "query hydration failed", e);
|
|
426
575
|
throw e;
|
|
427
576
|
} finally {
|
|
428
|
-
if (!hydrationFinished && !hydrationFailed)
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
577
|
+
if (!hydrationFinished && !hydrationFailed) {
|
|
578
|
+
this.#queryStats?.recordHydration({
|
|
579
|
+
queryName,
|
|
580
|
+
shape
|
|
581
|
+
}, {
|
|
582
|
+
outcome: "aborted",
|
|
583
|
+
timeMs: timer.totalElapsed()
|
|
584
|
+
});
|
|
585
|
+
this.#logQueryPipelineLifecycle({
|
|
586
|
+
zeroEvent: "query-pipeline-hydrate-aborted",
|
|
587
|
+
pipelineRunID,
|
|
588
|
+
queryHash: queryID,
|
|
589
|
+
transformationHash,
|
|
590
|
+
queryName,
|
|
591
|
+
hydrationReason,
|
|
592
|
+
hydrationTimeMs: timer.totalElapsed(),
|
|
593
|
+
hydrationRowCount
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
if (!hydrationFinished) {
|
|
597
|
+
for (const input of builtInputs) input.destroy();
|
|
598
|
+
this.#rowSetSignatures.delete(queryID);
|
|
599
|
+
this.#changedRowSetSignatures.delete(queryID);
|
|
600
|
+
}
|
|
438
601
|
this.#hydrateContext = null;
|
|
439
602
|
}
|
|
440
603
|
}
|
|
@@ -449,6 +612,7 @@ var PipelineDriver = class {
|
|
|
449
612
|
this.#destroyPipeline(queryID, pipeline, stopReason);
|
|
450
613
|
}
|
|
451
614
|
this.#rowSetSignatures.delete(queryID);
|
|
615
|
+
this.#changedRowSetSignatures.delete(queryID);
|
|
452
616
|
}
|
|
453
617
|
#destroyPipeline(queryID, pipeline, stopReason) {
|
|
454
618
|
this.#logQueryPipelineLifecycle({
|
|
@@ -475,6 +639,20 @@ var PipelineDriver = class {
|
|
|
475
639
|
return this.#rowSetSignatures.get(queryID);
|
|
476
640
|
}
|
|
477
641
|
/**
|
|
642
|
+
* IDs of the queries whose {@link rowSetSignature} changed (by an ADD or
|
|
643
|
+
* REMOVE from {@link addQuery} or {@link advance}) since the last call to
|
|
644
|
+
* {@link clearChangedRowSetSignatures}.
|
|
645
|
+
*/
|
|
646
|
+
changedRowSetSignatures() {
|
|
647
|
+
return this.#changedRowSetSignatures;
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Called once the {@link changedRowSetSignatures} have been persisted.
|
|
651
|
+
*/
|
|
652
|
+
clearChangedRowSetSignatures() {
|
|
653
|
+
this.#changedRowSetSignatures.clear();
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
478
656
|
* Wraps an iterable of RowChanges, XORing each row's unit hash into the
|
|
479
657
|
* query's signature (ADDs and REMOVEs share the same op; EDITs are no-ops).
|
|
480
658
|
* Used to intercept the yield streams from {@link addQuery} and
|
|
@@ -490,6 +668,7 @@ var PipelineDriver = class {
|
|
|
490
668
|
rowKey: change.rowKey
|
|
491
669
|
});
|
|
492
670
|
this.#rowSetSignatures.set(change.queryID, cur ^ unit);
|
|
671
|
+
this.#changedRowSetSignatures.add(change.queryID);
|
|
493
672
|
}
|
|
494
673
|
yield change;
|
|
495
674
|
}
|
|
@@ -516,38 +695,74 @@ var PipelineDriver = class {
|
|
|
516
695
|
*/
|
|
517
696
|
advance(timer) {
|
|
518
697
|
assert(this.initialized(), "Pipeline driver must be initialized before advancing");
|
|
519
|
-
const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames);
|
|
698
|
+
const diff = this.#snapshotter.advance(this.#tableSpecs, this.#allTableNames, this.#tables, "divergent");
|
|
520
699
|
const { prev, curr, changes } = diff;
|
|
521
700
|
this.#lc.debug?.(`advance ${prev.version} => ${curr.version}: ${changes} changes`);
|
|
701
|
+
const progress = { changesProcessed: 0 };
|
|
522
702
|
return {
|
|
523
703
|
version: curr.version,
|
|
524
704
|
numChanges: changes,
|
|
525
|
-
changes: this.#trackRowSetSignatures(this.#advance(diff, timer, changes))
|
|
705
|
+
changes: this.#trackRowSetSignatures(this.#advance(diff, timer, changes, progress)),
|
|
706
|
+
progress: () => ({
|
|
707
|
+
changesScanned: diff.changesScanned,
|
|
708
|
+
changesProcessed: progress.changesProcessed,
|
|
709
|
+
changesSkipped: diff.changesSkipped
|
|
710
|
+
})
|
|
526
711
|
};
|
|
527
712
|
}
|
|
528
|
-
*#advance(diff, timer, numChanges) {
|
|
713
|
+
*#advance(diff, timer, numChanges, progress) {
|
|
529
714
|
assert(this.#hydrateContext === null, "Cannot advance while hydration is in progress");
|
|
530
715
|
const totalHydrationTimeMs = this.totalHydrationTimeMs();
|
|
531
|
-
|
|
716
|
+
const advanceContext = {
|
|
532
717
|
timer,
|
|
718
|
+
progress,
|
|
719
|
+
diff,
|
|
720
|
+
completedChanges: 0,
|
|
533
721
|
totalHydrationTimeMs,
|
|
534
722
|
numChanges,
|
|
723
|
+
reservedRows: void 0,
|
|
724
|
+
heldBytes: 0,
|
|
535
725
|
currentChangeStartMs: void 0,
|
|
536
|
-
pos: 0
|
|
726
|
+
pos: 0,
|
|
727
|
+
currentTable: void 0,
|
|
728
|
+
queryStats: /* @__PURE__ */ new Map(),
|
|
729
|
+
pushTimeMs: 0,
|
|
730
|
+
stage: "diff"
|
|
537
731
|
};
|
|
538
|
-
this.#
|
|
732
|
+
this.#advanceContext = advanceContext;
|
|
733
|
+
let timedOut = false;
|
|
539
734
|
try {
|
|
540
|
-
|
|
735
|
+
advanceContext.reservedRows = this.#reserveDeferredWrites(numChanges);
|
|
736
|
+
const deferWrites = advanceContext.reservedRows !== void 0;
|
|
737
|
+
if (deferWrites) diff.setPrevWrites("none");
|
|
738
|
+
for (const table of this.#tables.values()) table.setDeferWrites(deferWrites);
|
|
739
|
+
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"}).`);
|
|
740
|
+
for (const { table, prevValues: probedPrevValues, nextValue, rowKey } of diff) {
|
|
741
|
+
advanceContext.stage = "between";
|
|
742
|
+
advanceContext.completedChanges = diff.changesScanned - 1;
|
|
541
743
|
if (this.#shouldAdvanceYieldMaybeAbortAdvance()) yield "yield";
|
|
542
744
|
const start = timer.totalElapsed();
|
|
543
|
-
const advanceContext = must(this.#advanceContext);
|
|
544
745
|
advanceContext.currentChangeStartMs = start;
|
|
545
|
-
|
|
746
|
+
advanceContext.currentTable = table;
|
|
747
|
+
advanceContext.stage = "push";
|
|
748
|
+
let holds = "fits";
|
|
749
|
+
let pushCompleted = false;
|
|
546
750
|
try {
|
|
547
751
|
try {
|
|
548
752
|
const tableSource = this.#tables.get(table);
|
|
549
|
-
if (!tableSource)
|
|
753
|
+
if (!tableSource) {
|
|
754
|
+
pushCompleted = true;
|
|
755
|
+
continue;
|
|
756
|
+
}
|
|
550
757
|
const primaryKey = mustGetPrimaryKey(this.#primaryKeys, table);
|
|
758
|
+
const isUnobservableAdd = probedPrevValues.length === 0 && nextValue !== null && !tableSource.mayAcceptRow(nextValue);
|
|
759
|
+
const isUnobservableEdit = probedPrevValues.length === 1 && nextValue !== null && !tableSource.mayAcceptRow(nextValue) && !tableSource.mayAcceptRow(probedPrevValues[0]) && deepEqual(getRowKey(primaryKey, probedPrevValues[0]), rowKey);
|
|
760
|
+
if (isUnobservableAdd || isUnobservableEdit) {
|
|
761
|
+
pushCompleted = true;
|
|
762
|
+
continue;
|
|
763
|
+
}
|
|
764
|
+
if (nextValue !== null && !this.#reserveSecondRow(advanceContext, rowKey, primaryKey)) holds = "rows";
|
|
765
|
+
const prevValues = tableSource.reconcilePendingConflicts(probedPrevValues, nextValue, rowKey, this.#tableSpecs.get(table)?.tableSpec.uniqueKeys ?? []);
|
|
551
766
|
let editOldRow = void 0;
|
|
552
767
|
for (const prevValue of prevValues) if (nextValue && deepEqual(getRowKey(primaryKey, prevValue), getRowKey(primaryKey, nextValue))) editOldRow = prevValue;
|
|
553
768
|
else {
|
|
@@ -556,38 +771,232 @@ var PipelineDriver = class {
|
|
|
556
771
|
}
|
|
557
772
|
if (nextValue) if (editOldRow) yield* this.#push(tableSource, makeSourceChangeEdit(nextValue, editOldRow));
|
|
558
773
|
else yield* this.#push(tableSource, makeSourceChangeAdd(nextValue));
|
|
774
|
+
pushCompleted = true;
|
|
559
775
|
} finally {
|
|
560
776
|
advanceContext.pos++;
|
|
777
|
+
if (pushCompleted) {
|
|
778
|
+
progress.changesProcessed++;
|
|
779
|
+
advanceContext.completedChanges = diff.changesScanned;
|
|
780
|
+
}
|
|
561
781
|
}
|
|
562
782
|
this.#shouldAdvanceYieldMaybeAbortAdvance(false);
|
|
783
|
+
if (holds === "fits") holds = this.#holdPendingRows(advanceContext);
|
|
563
784
|
} finally {
|
|
785
|
+
advanceContext.pushTimeMs += timer.totalElapsed() - start;
|
|
786
|
+
advanceContext.stage = "diff";
|
|
564
787
|
advanceContext.currentChangeStartMs = void 0;
|
|
565
788
|
}
|
|
566
789
|
const elapsed = timer.totalElapsed() - start;
|
|
567
|
-
this.#advanceTime.recordMs(elapsed, {
|
|
568
|
-
|
|
569
|
-
type
|
|
570
|
-
});
|
|
790
|
+
this.#advanceTime.recordMs(elapsed, { table });
|
|
791
|
+
if (holds !== "fits") yield* this.#writeThrough(advanceContext, diff, holds);
|
|
571
792
|
}
|
|
793
|
+
advanceContext.completedChanges = diff.changesScanned;
|
|
572
794
|
const { curr } = diff;
|
|
573
795
|
for (const table of this.#tables.values()) table.setDB(curr.db.db);
|
|
574
796
|
this.#ensureCostModelExistsIfEnabled(curr.db.db);
|
|
575
797
|
this.#lc.debug?.(`Advanced to ${curr.version}`);
|
|
798
|
+
this.#logSlowAdvances(advanceContext);
|
|
799
|
+
} catch (e) {
|
|
800
|
+
if (e instanceof ResetPipelinesSignal && e.reason === "advancement-timeout") {
|
|
801
|
+
timedOut = true;
|
|
802
|
+
this.#logAdvanceTimeout(advanceContext, e);
|
|
803
|
+
}
|
|
804
|
+
throw e;
|
|
576
805
|
} finally {
|
|
806
|
+
if (advanceContext.reservedRows !== void 0) for (const table of this.#tables.values()) table.discardPendingChanges();
|
|
807
|
+
this.#releaseDeferredWrites(advanceContext);
|
|
577
808
|
this.#advanceContext = null;
|
|
809
|
+
this.#recordAdvanceStats(advanceContext, timedOut);
|
|
578
810
|
}
|
|
579
811
|
}
|
|
812
|
+
/** Accounts the time each query took in an advancement to its shape. */
|
|
813
|
+
#recordAdvanceStats({ queryStats }, timedOut) {
|
|
814
|
+
if (this.#queryStats === void 0) return;
|
|
815
|
+
for (const [queryID, { timeMs, changes }] of queryStats) {
|
|
816
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
817
|
+
if (pipeline !== void 0) this.#queryStats.recordAdvance(pipeline, {
|
|
818
|
+
timeMs,
|
|
819
|
+
changes,
|
|
820
|
+
timedOut
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Decides how the sources apply an advancement's changes: in memory if
|
|
826
|
+
* they fit in the worker's {@link DeferredWritesBudget}, and otherwise
|
|
827
|
+
* written through to the `prev` snapshot. Returns the number of rows
|
|
828
|
+
* reserved if they are held in memory.
|
|
829
|
+
*/
|
|
830
|
+
#reserveDeferredWrites(numChanges) {
|
|
831
|
+
const budget = this.#deferredWrites;
|
|
832
|
+
if (!budget) return;
|
|
833
|
+
if (budget.tryReserve(numChanges)) return numChanges;
|
|
834
|
+
this.#deferredWritesFallbacks.add(1, { stage: "start" });
|
|
835
|
+
this.#lc.debug?.(`writing through ${numChanges} changes: ${budget.reservedRows} rows of the deferred writes budget are reserved`);
|
|
836
|
+
}
|
|
837
|
+
/**
|
|
838
|
+
* If the change log identifies the rows of a table by a key other than its
|
|
839
|
+
* primary key here, an entry that sets a row can change its primary key,
|
|
840
|
+
* which is two rows to a source: the old and the new. (An entry that removes
|
|
841
|
+
* a row removes the one row its key identifies.) Reserves the second row for
|
|
842
|
+
* such an entry, if the advancement holds its changes in memory, and
|
|
843
|
+
* returns whether it fit.
|
|
844
|
+
*/
|
|
845
|
+
#reserveSecondRow(advanceContext, rowKey, primaryKey) {
|
|
846
|
+
if (advanceContext.reservedRows === void 0 || isKeyedBy(rowKey, primaryKey)) return true;
|
|
847
|
+
if (!must(this.#deferredWrites).tryReserveMore(1)) return false;
|
|
848
|
+
advanceContext.reservedRows++;
|
|
849
|
+
return true;
|
|
850
|
+
}
|
|
851
|
+
/**
|
|
852
|
+
* Writes the changes that an advancement holds in memory through to the
|
|
853
|
+
* `prev` snapshot, and the rest of its changes after them, when they no
|
|
854
|
+
* longer fit (see {@link HeldRows}). The advancement then continues as if
|
|
855
|
+
* it had written through from the start.
|
|
856
|
+
*/
|
|
857
|
+
*#writeThrough(advanceContext, diff, reason) {
|
|
858
|
+
const budget = must(this.#deferredWrites);
|
|
859
|
+
this.#deferredWritesFallbacks.add(1, {
|
|
860
|
+
stage: "partway",
|
|
861
|
+
reason
|
|
862
|
+
});
|
|
863
|
+
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})`);
|
|
864
|
+
diff.setPrevWrites("divergent");
|
|
865
|
+
for (const source of this.#tables.values()) yield* source.writePendingChanges();
|
|
866
|
+
this.#releaseDeferredWrites(advanceContext);
|
|
867
|
+
}
|
|
868
|
+
#releaseDeferredWrites(advanceContext) {
|
|
869
|
+
const { reservedRows, heldBytes } = advanceContext;
|
|
870
|
+
if (reservedRows !== void 0) {
|
|
871
|
+
must(this.#deferredWrites).release(reservedRows, heldBytes);
|
|
872
|
+
advanceContext.reservedRows = void 0;
|
|
873
|
+
advanceContext.heldBytes = 0;
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
#recordAdvancePush(queryID, timeMs) {
|
|
877
|
+
const advance = this.#advanceContext;
|
|
878
|
+
if (advance === null) return;
|
|
879
|
+
const stats = getOrInsertComputed(advance.queryStats, queryID, () => ({
|
|
880
|
+
timeMs: 0,
|
|
881
|
+
changes: 0,
|
|
882
|
+
lastPos: -1,
|
|
883
|
+
timeMsByTable: /* @__PURE__ */ new Map()
|
|
884
|
+
}));
|
|
885
|
+
stats.timeMs += timeMs;
|
|
886
|
+
if (stats.lastPos !== advance.pos) {
|
|
887
|
+
stats.lastPos = advance.pos;
|
|
888
|
+
stats.changes++;
|
|
889
|
+
}
|
|
890
|
+
const table = advance.currentTable;
|
|
891
|
+
if (table !== void 0) stats.timeMsByTable.set(table, (stats.timeMsByTable.get(table) ?? 0) + timeMs);
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* The identity of the query of the pipeline for `queryID` and its
|
|
895
|
+
* {@link queryShape}, for logging.
|
|
896
|
+
*/
|
|
897
|
+
#queryForLog(queryID) {
|
|
898
|
+
const pipeline = this.#pipelines.get(queryID);
|
|
899
|
+
if (pipeline === void 0) return;
|
|
900
|
+
const { transformationHash, queryName, shape } = pipeline;
|
|
901
|
+
return {
|
|
902
|
+
queryName,
|
|
903
|
+
shape,
|
|
904
|
+
fields: {
|
|
905
|
+
queryHash: queryID,
|
|
906
|
+
transformationHash,
|
|
907
|
+
...queryName !== void 0 && { queryName },
|
|
908
|
+
queryShape: shape.hash
|
|
909
|
+
}
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
/** Compute once for an admitted log, without clocks or allocations per change. */
|
|
913
|
+
#advancementLogFields({ timer, diff, progress, completedChanges, queryStats, totalHydrationTimeMs }) {
|
|
914
|
+
const advancementTimeMs = timer.totalElapsed();
|
|
915
|
+
let queryPushTimeMs = 0;
|
|
916
|
+
for (const stats of queryStats.values()) queryPushTimeMs += stats.timeMs;
|
|
917
|
+
return {
|
|
918
|
+
advancementTimeMs,
|
|
919
|
+
queryPushTimeMs,
|
|
920
|
+
outsideQueryPushTimeMs: Math.max(0, advancementTimeMs - queryPushTimeMs),
|
|
921
|
+
totalHydrationTimeMs,
|
|
922
|
+
changesScanned: diff.changesScanned,
|
|
923
|
+
changesCompleted: completedChanges,
|
|
924
|
+
changesProcessed: progress.changesProcessed,
|
|
925
|
+
changesSkipped: diff.changesSkipped
|
|
926
|
+
};
|
|
927
|
+
}
|
|
928
|
+
/**
|
|
929
|
+
* Logs each query whose pushes took longer than the slow advance
|
|
930
|
+
* threshold, at most once per query shape per
|
|
931
|
+
* {@link SLOW_ADVANCE_LOG_WINDOW_MS}.
|
|
932
|
+
*/
|
|
933
|
+
#logSlowAdvances(context) {
|
|
934
|
+
if (!this.#lc.warn) return;
|
|
935
|
+
const { queryStats, numChanges } = context;
|
|
936
|
+
let advancementFields;
|
|
937
|
+
for (const [queryID, stats] of queryStats) {
|
|
938
|
+
if (stats.timeMs <= this.#logConfig.slowAdvanceThreshold) continue;
|
|
939
|
+
const query = this.#queryForLog(queryID);
|
|
940
|
+
if (query === void 0) continue;
|
|
941
|
+
const suppressed = slowAdvanceLogThrottle.admit(`${query.queryName ?? ""}:${query.shape.hash}`);
|
|
942
|
+
if (suppressed === void 0) continue;
|
|
943
|
+
this.#lc.warn(`Slow query advancement${query.queryName === void 0 ? "" : ` for ${query.queryName}`}: ${Math.round(stats.timeMs)} ms for ${stats.changes} of ${numChanges} changes`, {
|
|
944
|
+
zeroEvent: "query-slow-advance",
|
|
945
|
+
...query.fields,
|
|
946
|
+
advanceTimeMs: stats.timeMs,
|
|
947
|
+
changes: stats.changes,
|
|
948
|
+
advancementChanges: numChanges,
|
|
949
|
+
...advancementFields ??= this.#advancementLogFields(context),
|
|
950
|
+
timeMsByTable: Object.fromEntries(stats.timeMsByTable),
|
|
951
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed },
|
|
952
|
+
zql: query.shape.zql
|
|
953
|
+
});
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* Logs the queries that took the most time in an advancement that timed
|
|
958
|
+
* out, since the reset that follows would otherwise not say what was slow.
|
|
959
|
+
* Throttled per query shape of the slowest query, with a shared fallback
|
|
960
|
+
* when the timeout happens before any query push timings are recorded.
|
|
961
|
+
*/
|
|
962
|
+
#logAdvanceTimeout(context, reset) {
|
|
963
|
+
if (!this.#lc.warn) return;
|
|
964
|
+
const { queryStats, numChanges } = context;
|
|
965
|
+
const slowest = [...queryStats].toSorted(([, a], [, b]) => b.timeMs - a.timeMs).slice(0, ADVANCE_TIMEOUT_LOG_MAX_QUERIES).flatMap(([queryID, stats]) => {
|
|
966
|
+
const query = this.#queryForLog(queryID);
|
|
967
|
+
return query ? [{
|
|
968
|
+
query,
|
|
969
|
+
stats
|
|
970
|
+
}] : [];
|
|
971
|
+
});
|
|
972
|
+
const leadingQuery = slowest[0]?.query;
|
|
973
|
+
const suppressed = slowAdvanceLogThrottle.admit(leadingQuery ? `timeout:${leadingQuery.queryName ?? ""}:${leadingQuery.shape.hash}` : "timeout:outside-query-push");
|
|
974
|
+
if (suppressed === void 0) return;
|
|
975
|
+
const summary = slowest.map(({ query, stats }) => `${query.queryName ?? query.fields.queryHash} (${Math.round(stats.timeMs)} ms)`).join(", ");
|
|
976
|
+
this.#lc.warn(`Advancement of ${numChanges} changes timed out. ` + (summary ? `The queries that took the most time: ${summary}` : "No query push timings were recorded."), {
|
|
977
|
+
zeroEvent: "query-advance-timeout",
|
|
978
|
+
reason: reset.message,
|
|
979
|
+
advancementChanges: numChanges,
|
|
980
|
+
...this.#advancementLogFields(context),
|
|
981
|
+
queries: slowest.map(({ query, stats }) => ({
|
|
982
|
+
...query.fields,
|
|
983
|
+
advanceTimeMs: stats.timeMs,
|
|
984
|
+
changes: stats.changes,
|
|
985
|
+
zql: query.shape.zql
|
|
986
|
+
})),
|
|
987
|
+
...suppressed > 0 && { suppressedSinceLastLog: suppressed }
|
|
988
|
+
});
|
|
989
|
+
}
|
|
580
990
|
/** Implements `BuilderDelegate.getSource()` */
|
|
581
991
|
#getSource(tableName) {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
return source;
|
|
992
|
+
return getOrInsertComputed(this.#tables, tableName, (tableName) => {
|
|
993
|
+
const tableSpec = mustGetTableSpec(this.#tableSpecs, tableName);
|
|
994
|
+
const primaryKey = mustGetPrimaryKey(this.#primaryKeys, tableName);
|
|
995
|
+
const { db } = this.#snapshotter.current();
|
|
996
|
+
const source = new TableSource(this.#lc, this.#logConfig, db.db, tableName, tableSpec.zqlSpec, primaryKey, () => this.#shouldYield(), { skipUnobservableChanges: true });
|
|
997
|
+
this.#lc.debug?.(`created TableSource for ${tableName}`);
|
|
998
|
+
return source;
|
|
999
|
+
});
|
|
591
1000
|
}
|
|
592
1001
|
#shouldYield() {
|
|
593
1002
|
if (this.#hydrateContext) return this.#hydrateContext.timer.elapsedLap() > this.#yieldThresholdMs();
|
|
@@ -601,120 +1010,132 @@ var PipelineDriver = class {
|
|
|
601
1010
|
* checks; a single pathological push always resets.
|
|
602
1011
|
*/
|
|
603
1012
|
#shouldAdvanceYieldMaybeAbortAdvance(checkYield = true) {
|
|
604
|
-
const { currentChangeStartMs,
|
|
1013
|
+
const { currentChangeStartMs, completedChanges, numChanges, timer: advanceTimer, totalHydrationTimeMs } = must(this.#advanceContext);
|
|
605
1014
|
const elapsed = advanceTimer.totalElapsed();
|
|
606
1015
|
const currentChangeElapsedMs = currentChangeStartMs === void 0 ? void 0 : elapsed - currentChangeStartMs;
|
|
607
|
-
if (currentChangeElapsedMs !== void 0 && shouldResetSlowCurrentChange(currentChangeElapsedMs, totalHydrationTimeMs)) this.#throwSlowCurrentChangeReset(
|
|
608
|
-
const projectedTotalTimeMs = projectedAdvancementTimeMs(elapsed,
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
1016
|
+
if (currentChangeElapsedMs !== void 0 && shouldResetSlowCurrentChange(currentChangeElapsedMs, totalHydrationTimeMs)) this.#throwSlowCurrentChangeReset(completedChanges, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs);
|
|
1017
|
+
const projectedTotalTimeMs = projectedAdvancementTimeMs(elapsed, completedChanges, numChanges);
|
|
1018
|
+
if (!shouldFinishLateAdvancement(completedChanges, numChanges)) {
|
|
1019
|
+
if (canProjectAdvancement(elapsed, projectedTotalTimeMs, completedChanges, numChanges)) {
|
|
1020
|
+
const projectedTotal = must(projectedTotalTimeMs);
|
|
1021
|
+
if (shouldResetProjectedAdvancement(elapsed, projectedTotal, totalHydrationTimeMs)) this.#throwProjectedAdvancementReset(completedChanges, numChanges, elapsed, projectedTotal, totalHydrationTimeMs);
|
|
1022
|
+
} else if (elapsed > MIN_ADVANCEMENT_TIME_LIMIT_MS && elapsed > totalHydrationTimeMs) {
|
|
1023
|
+
const breakdown = formatAdvancementBreakdown(must(this.#advanceContext), elapsed);
|
|
1024
|
+
this.#lc.warn?.(`Advancement exceeded timeout at ${completedChanges} of ${numChanges} changes after ${elapsed.toFixed(1)} ms (${breakdown}). Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
|
|
1025
|
+
throw new ResetPipelinesSignal(`Advancement exceeded timeout at ${completedChanges} of ${numChanges} changes after ${elapsed} ms. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout", breakdown);
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
612
1028
|
return checkYield && advanceTimer.elapsedLap() > this.#yieldThresholdMs();
|
|
613
1029
|
}
|
|
1030
|
+
/**
|
|
1031
|
+
* The rows an advancement holds in memory are bounded by its reservation,
|
|
1032
|
+
* but their width is not known in advance. So the bytes they are estimated
|
|
1033
|
+
* to hold are added to those held by the other advancements on this worker.
|
|
1034
|
+
* Says whether that takes them past the budget, or if the rows are not
|
|
1035
|
+
* bounded by the reservation after all.
|
|
1036
|
+
*/
|
|
1037
|
+
#holdPendingRows(advanceContext) {
|
|
1038
|
+
const { reservedRows, heldBytes, pos, numChanges } = advanceContext;
|
|
1039
|
+
if (reservedRows === void 0) return "fits";
|
|
1040
|
+
const budget = must(this.#deferredWrites);
|
|
1041
|
+
const rows = this.pendingRows;
|
|
1042
|
+
const bytes = this.pendingBytes;
|
|
1043
|
+
advanceContext.heldBytes = bytes;
|
|
1044
|
+
const bytesFit = budget.holdBytes(bytes - heldBytes);
|
|
1045
|
+
if (rows > reservedRows) {
|
|
1046
|
+
budget.recordRowOverrun();
|
|
1047
|
+
this.#lc.error?.(`Advancement holds ${rows} rows at ${pos} of ${numChanges} changes, more than the ${reservedRows} it reserved. Writing through the rest.`);
|
|
1048
|
+
return "row-overrun";
|
|
1049
|
+
}
|
|
1050
|
+
return bytesFit ? "fits" : "bytes";
|
|
1051
|
+
}
|
|
614
1052
|
#throwSlowCurrentChangeReset(pos, numChanges, elapsed, currentChangeElapsedMs, totalHydrationTimeMs) {
|
|
615
|
-
|
|
1053
|
+
const breakdown = this.#advanceContext ? formatAdvancementBreakdown(this.#advanceContext, elapsed) : void 0;
|
|
1054
|
+
this.#lc.warn?.(`Advancement slow current change at ${pos} of ${numChanges} changes after ${currentChangeElapsedMs.toFixed(1)} ms (${elapsed.toFixed(1)} ms total)` + (breakdown ? ` (${breakdown})` : "") + `. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
|
|
1055
|
+
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", breakdown);
|
|
616
1056
|
}
|
|
617
1057
|
#throwProjectedAdvancementReset(pos, numChanges, elapsed, projectedTotalTimeMs, totalHydrationTimeMs) {
|
|
1058
|
+
const breakdown = this.#advanceContext ? formatAdvancementBreakdown(this.#advanceContext, elapsed) : void 0;
|
|
618
1059
|
const projection = projectedTotalTimeMs === void 0 ? "" : ` Projected total advancement time is ${projectedTotalTimeMs} ms.`;
|
|
619
|
-
|
|
1060
|
+
this.#lc.warn?.(`Advancement projected timeout at ${pos} of ${numChanges} changes after ${elapsed.toFixed(1)} ms` + projection + (breakdown ? ` (${breakdown})` : "") + `. Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`);
|
|
1061
|
+
throw new ResetPipelinesSignal(`Advancement projected to exceed hydration time at ${pos} of ${numChanges} changes after ${elapsed} ms.` + projection + ` Advancement time limited based on total hydration time of ${totalHydrationTimeMs} ms.`, "advancement-timeout", breakdown);
|
|
620
1062
|
}
|
|
621
1063
|
/** Implements `BuilderDelegate.createStorage()` */
|
|
622
1064
|
#createStorage() {
|
|
623
1065
|
return this.#storage.createStorage();
|
|
624
1066
|
}
|
|
625
1067
|
*#push(source, change) {
|
|
626
|
-
this.#
|
|
1068
|
+
assert(this.#pushedRowChanges === null, "push already in progress");
|
|
627
1069
|
try {
|
|
1070
|
+
this.#pushedRowChanges = [];
|
|
628
1071
|
for (const val of source.genPush(change)) {
|
|
629
1072
|
if (val === "yield") yield "yield";
|
|
630
|
-
|
|
631
|
-
this.#
|
|
1073
|
+
const rowChanges = this.#pushedRowChanges;
|
|
1074
|
+
this.#pushedRowChanges = [];
|
|
1075
|
+
yield* rowChanges;
|
|
632
1076
|
}
|
|
633
1077
|
} finally {
|
|
634
|
-
|
|
1078
|
+
this.#pushedRowChanges = null;
|
|
635
1079
|
}
|
|
636
1080
|
}
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
const
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
1081
|
+
/**
|
|
1082
|
+
* Converts a change pushed out of a query pipeline into row changes during
|
|
1083
|
+
* the push. The relationships of a pushed node are lazy, and operators such
|
|
1084
|
+
* as Join compute them from the state of the push in progress: while a child
|
|
1085
|
+
* change is pushed to each matching parent in turn, parents not yet pushed
|
|
1086
|
+
* must not see it. Read after the push has moved on to the next parent, or
|
|
1087
|
+
* after it has finished, a node's relationships show the later state, and
|
|
1088
|
+
* rows that are also pushed separately are counted twice.
|
|
1089
|
+
*/
|
|
1090
|
+
*#streamPushed(queryID, schema, change) {
|
|
1091
|
+
assert(this.#pushedRowChanges, "changes are only pushed by #push");
|
|
1092
|
+
for (const rowChange of must(this.#streamer).streamChange(queryID, schema, change)) {
|
|
1093
|
+
if (rowChange === "yield") {
|
|
1094
|
+
yield rowChange;
|
|
1095
|
+
continue;
|
|
1096
|
+
}
|
|
1097
|
+
must(this.#pushedRowChanges).push(rowChange);
|
|
1098
|
+
}
|
|
655
1099
|
}
|
|
656
1100
|
};
|
|
1101
|
+
/** Turns the output of query pipelines into the row changes sent to clients. */
|
|
657
1102
|
var Streamer = class {
|
|
658
1103
|
#primaryKeys;
|
|
659
1104
|
#tableSpecs;
|
|
660
|
-
|
|
661
|
-
constructor(primaryKeys, tableSpecs, logQueryFailure) {
|
|
1105
|
+
constructor(primaryKeys, tableSpecs) {
|
|
662
1106
|
this.#primaryKeys = primaryKeys;
|
|
663
1107
|
this.#tableSpecs = tableSpecs;
|
|
664
|
-
this.#logQueryFailure = logQueryFailure;
|
|
665
|
-
}
|
|
666
|
-
#changes = [];
|
|
667
|
-
accumulate(queryID, schema, changes) {
|
|
668
|
-
this.#changes.push([
|
|
669
|
-
queryID,
|
|
670
|
-
schema,
|
|
671
|
-
changes
|
|
672
|
-
]);
|
|
673
|
-
return this;
|
|
674
|
-
}
|
|
675
|
-
*stream() {
|
|
676
|
-
for (const [queryID, schema, changes] of this.#changes) try {
|
|
677
|
-
yield* this.#streamChanges(queryID, schema, changes);
|
|
678
|
-
} catch (e) {
|
|
679
|
-
this.#logQueryFailure?.(queryID, e);
|
|
680
|
-
throw e;
|
|
681
|
-
}
|
|
682
1108
|
}
|
|
683
|
-
|
|
1109
|
+
/** The row changes for a change pushed out of the pipeline of `queryID`. */
|
|
1110
|
+
*streamChange(queryID, schema, change) {
|
|
684
1111
|
if (schema.system === "permissions") return;
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
break;
|
|
696
|
-
case 3: {
|
|
697
|
-
const child = change[2];
|
|
698
|
-
const childSchema = must(schema.relationships[child.relationshipName]);
|
|
699
|
-
yield* this.#streamChanges(queryID, childSchema, [child.change]);
|
|
700
|
-
break;
|
|
701
|
-
}
|
|
702
|
-
case 2:
|
|
703
|
-
yield* this.#streamNodes(queryID, schema, type, () => [{
|
|
704
|
-
row: change[1].row,
|
|
705
|
-
relationships: {}
|
|
706
|
-
}]);
|
|
707
|
-
break;
|
|
708
|
-
default: unreachable(change[0]);
|
|
1112
|
+
const type = change[0];
|
|
1113
|
+
switch (type) {
|
|
1114
|
+
case 1:
|
|
1115
|
+
case 0:
|
|
1116
|
+
yield* this.streamNodes(queryID, schema, type, [change[1]]);
|
|
1117
|
+
break;
|
|
1118
|
+
case 3: {
|
|
1119
|
+
const child = change[2];
|
|
1120
|
+
yield* this.streamChange(queryID, must(schema.relationships[child.relationshipName]), child.change);
|
|
1121
|
+
break;
|
|
709
1122
|
}
|
|
1123
|
+
case 2:
|
|
1124
|
+
yield* this.streamNodes(queryID, schema, type, [{
|
|
1125
|
+
row: change[1].row,
|
|
1126
|
+
relationships: {}
|
|
1127
|
+
}]);
|
|
1128
|
+
break;
|
|
1129
|
+
default: unreachable(change[0]);
|
|
710
1130
|
}
|
|
711
1131
|
}
|
|
712
|
-
|
|
1132
|
+
/** A row change of type `op` for each of `nodes` and their descendants. */
|
|
1133
|
+
*streamNodes(queryID, schema, op, nodes) {
|
|
713
1134
|
const { tableName: table, system } = schema;
|
|
1135
|
+
if (system === "permissions") return;
|
|
714
1136
|
const primaryKey = must(this.#primaryKeys.get(table));
|
|
715
1137
|
const spec = must(this.#tableSpecs.get(table)).tableSpec;
|
|
716
|
-
|
|
717
|
-
for (const node of nodes()) {
|
|
1138
|
+
for (const node of nodes) {
|
|
718
1139
|
if (node === "yield") {
|
|
719
1140
|
yield node;
|
|
720
1141
|
continue;
|
|
@@ -736,9 +1157,9 @@ var Streamer = class {
|
|
|
736
1157
|
rowKey,
|
|
737
1158
|
row: op === 1 ? void 0 : row
|
|
738
1159
|
};
|
|
739
|
-
for (const
|
|
1160
|
+
for (const relationship of Object.keys(relationships)) {
|
|
740
1161
|
const childSchema = must(schema.relationships[relationship]);
|
|
741
|
-
yield* this
|
|
1162
|
+
if (childSchema.system !== "permissions") yield* this.streamNodes(queryID, childSchema, op, relationships[relationship]());
|
|
742
1163
|
}
|
|
743
1164
|
}
|
|
744
1165
|
}
|
|
@@ -782,6 +1203,18 @@ var QueryFailureLoggingOperator = class {
|
|
|
782
1203
|
throw e;
|
|
783
1204
|
}
|
|
784
1205
|
}
|
|
1206
|
+
*reconcile(_pusher) {
|
|
1207
|
+
if (this.#output.reconcile) try {
|
|
1208
|
+
yield* this.#output.reconcile(this);
|
|
1209
|
+
} catch (e) {
|
|
1210
|
+
logQueryFailure(this.#lc, {
|
|
1211
|
+
queryHash: this.#queryHash,
|
|
1212
|
+
transformationHash: this.#transformationHash,
|
|
1213
|
+
queryName: this.#queryName
|
|
1214
|
+
}, "query pipeline failed during reconcile", e);
|
|
1215
|
+
throw e;
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
785
1218
|
};
|
|
786
1219
|
function logQueryFailure(lc, queryInfo, message, error) {
|
|
787
1220
|
if (error instanceof ResetPipelinesSignal) return;
|
|
@@ -792,43 +1225,73 @@ function logQueryFailure(lc, queryInfo, message, error) {
|
|
|
792
1225
|
}
|
|
793
1226
|
queryLC.error?.(message, error);
|
|
794
1227
|
}
|
|
795
|
-
function* toAdds(nodes) {
|
|
796
|
-
for (const node of nodes) {
|
|
797
|
-
if (node === "yield") {
|
|
798
|
-
yield node;
|
|
799
|
-
continue;
|
|
800
|
-
}
|
|
801
|
-
yield [
|
|
802
|
-
0,
|
|
803
|
-
node,
|
|
804
|
-
null
|
|
805
|
-
];
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
1228
|
function getRowKey(cols, row) {
|
|
809
|
-
|
|
1229
|
+
const rowKey = {};
|
|
1230
|
+
for (const col of cols) assignProperty(rowKey, col, must(row[col]));
|
|
1231
|
+
return rowKey;
|
|
1232
|
+
}
|
|
1233
|
+
/** Whether `rowKey` has exactly the columns of `primaryKey`. */
|
|
1234
|
+
function isKeyedBy(rowKey, primaryKey) {
|
|
1235
|
+
let cols = 0;
|
|
1236
|
+
for (const col in rowKey) {
|
|
1237
|
+
if (!primaryKey.includes(col)) return false;
|
|
1238
|
+
cols++;
|
|
1239
|
+
}
|
|
1240
|
+
return cols === primaryKey.length;
|
|
810
1241
|
}
|
|
811
1242
|
/**
|
|
812
1243
|
* Core hydration logic used by {@link PipelineDriver#addQuery}, extracted to a
|
|
813
1244
|
* function for reuse by the analyze-query RPC path so that analysis hydrates
|
|
814
|
-
* queries the same way the view-syncer does in production.
|
|
1245
|
+
* queries the same way the view-syncer does in production. As there, the rows
|
|
1246
|
+
* of a table outside `clientSchema` are keyed by its key in the replica.
|
|
1247
|
+
*/
|
|
1248
|
+
function hydrate(input, hash, clientSchema, tableSpecs) {
|
|
1249
|
+
return new Streamer(buildRowKeys(clientSchema, tableSpecs), tableSpecs).streamNodes(hash, input.getSchema(), 0, input.fetch({}));
|
|
1250
|
+
}
|
|
1251
|
+
/**
|
|
1252
|
+
* Returns the value of `childField` in the row of `input`, the pipeline of a
|
|
1253
|
+
* scalar subquery: `null` if the field is `NULL`, or `undefined` if there is
|
|
1254
|
+
* no row. Used by {@link PipelineDriver#addQuery} and the analyze-query RPC
|
|
1255
|
+
* path to resolve scalar subqueries the same way.
|
|
815
1256
|
*/
|
|
816
|
-
function
|
|
817
|
-
|
|
818
|
-
|
|
1257
|
+
function fetchScalarValue(input, childField) {
|
|
1258
|
+
let node;
|
|
1259
|
+
for (const n of skipYields(input.fetch({}))) node ??= n;
|
|
1260
|
+
if (!node) return;
|
|
1261
|
+
return node.row[childField] ?? null;
|
|
819
1262
|
}
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
1263
|
+
/**
|
|
1264
|
+
* The schema the rows of a companion pipeline are streamed with. A companion is
|
|
1265
|
+
* built from the bare subquery, so its schema says `'client'` even when its
|
|
1266
|
+
* gate came from a permission rule. Rows read for a rule are never synced, so
|
|
1267
|
+
* such a companion takes the gate's system and the Streamer skips it, the rows
|
|
1268
|
+
* behind any EXISTS nested in it included.
|
|
1269
|
+
*/
|
|
1270
|
+
function companionStreamSchema(input, { system }) {
|
|
1271
|
+
const schema = input.getSchema();
|
|
1272
|
+
return system === "permissions" ? {
|
|
1273
|
+
...schema,
|
|
1274
|
+
system
|
|
1275
|
+
} : schema;
|
|
823
1276
|
}
|
|
824
1277
|
function buildPrimaryKeys(clientSchema, primaryKeys = /* @__PURE__ */ new Map()) {
|
|
825
1278
|
for (const [tableName, { primaryKey }] of Object.entries(clientSchema.tables)) primaryKeys.set(tableName, primaryKey);
|
|
826
1279
|
return primaryKeys;
|
|
827
1280
|
}
|
|
1281
|
+
/**
|
|
1282
|
+
* Sets `primaryKeys` to the columns that key the synced rows of each table:
|
|
1283
|
+
* the table's primary key in `clientSchema`, or, for a table outside it, its
|
|
1284
|
+
* key in the replica.
|
|
1285
|
+
*/
|
|
1286
|
+
function buildRowKeys(clientSchema, tableSpecs, primaryKeys = /* @__PURE__ */ new Map()) {
|
|
1287
|
+
primaryKeys.clear();
|
|
1288
|
+
for (const [table, spec] of tableSpecs.entries()) primaryKeys.set(table, spec.tableSpec.primaryKey);
|
|
1289
|
+
return buildPrimaryKeys(clientSchema, primaryKeys);
|
|
1290
|
+
}
|
|
828
1291
|
function mustGetPrimaryKey(primaryKeys, table) {
|
|
829
1292
|
const pKeys = must(primaryKeys, "primaryKey map must be non-null");
|
|
830
1293
|
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.`);
|
|
1294
|
+
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
1295
|
return rv;
|
|
833
1296
|
}
|
|
834
1297
|
/**
|
|
@@ -841,6 +1304,6 @@ function scalarValuesEqual(a, b) {
|
|
|
841
1304
|
return a === b;
|
|
842
1305
|
}
|
|
843
1306
|
//#endregion
|
|
844
|
-
export { PipelineDriver, hydrate };
|
|
1307
|
+
export { PipelineDriver, fetchScalarValue, hydrate };
|
|
845
1308
|
|
|
846
1309
|
//# sourceMappingURL=pipeline-driver.js.map
|