@rocicorp/zero 0.24.2025102200 → 0.25.0-canary.1
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/{chunk-PIXC6O7W.js → chunk-55BOUNXO.js} +3 -3
- package/out/chunk-55BOUNXO.js.map +7 -0
- package/out/{chunk-JS2ABYXG.js → chunk-AIPM77UE.js} +2762 -674
- package/out/chunk-AIPM77UE.js.map +7 -0
- package/out/{chunk-VHLCXJ6Q.js → chunk-TJFNGO7E.js} +4 -2
- package/out/{chunk-VHLCXJ6Q.js.map → chunk-TJFNGO7E.js.map} +2 -2
- package/out/{lazy-inspector-NCBESZMS.js → lazy-inspector-OXIFYSSQ.js} +2 -2
- package/out/react.js +16 -4
- package/out/react.js.map +4 -4
- package/out/replicache/src/dag/lazy-store.d.ts +1 -1
- package/out/replicache/src/dag/lazy-store.d.ts.map +1 -1
- package/out/replicache/src/log-options.d.ts +1 -1
- package/out/replicache/src/log-options.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.d.ts +3 -3
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/replicache-options.d.ts +1 -1
- package/out/replicache/src/replicache-options.d.ts.map +1 -1
- package/out/shared/src/options.d.ts +1 -1
- package/out/shared/src/options.d.ts.map +1 -1
- package/out/shared/src/promise-race.d.ts +17 -0
- package/out/shared/src/promise-race.d.ts.map +1 -0
- package/out/solid.js +19 -6
- package/out/solid.js.map +4 -4
- package/out/z2s/src/compiler.d.ts +1 -1
- package/out/z2s/src/compiler.d.ts.map +1 -1
- package/out/z2s/src/compiler.js +1 -1
- 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 +1 -1
- package/out/z2s/src/sql.js.map +1 -1
- package/out/zero/package.json +5 -4
- package/out/zero-cache/src/config/zero-config.d.ts +12 -0
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +36 -0
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.d.ts +3 -1
- package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
- package/out/zero-cache/src/custom/fetch.js +101 -24
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.d.ts +2 -6
- package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js +42 -41
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
- package/out/zero-cache/src/db/create.d.ts +4 -0
- package/out/zero-cache/src/db/create.d.ts.map +1 -1
- package/out/zero-cache/src/db/create.js +7 -9
- package/out/zero-cache/src/db/create.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 +38 -17
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.js +7 -6
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
- package/out/zero-cache/src/db/specs.d.ts +24 -19
- package/out/zero-cache/src/db/specs.d.ts.map +1 -1
- package/out/zero-cache/src/db/specs.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 +1 -1
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +5 -1
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +1 -1
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/column-metadata.d.ts +65 -0
- package/out/zero-cache/src/services/change-source/column-metadata.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/column-metadata.js +198 -0
- package/out/zero-cache/src/services/change-source/column-metadata.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source.js +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.d.ts +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +25 -25
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +10 -10
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +5 -5
- package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +16 -16
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +24 -24
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -1
- 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 +18 -2
- 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.d.ts +8 -8
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +9 -7
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.d.ts +4 -4
- package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js +74 -56
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +3 -1
- 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 +10 -6
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-schema.js +7 -4
- package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +4 -4
- 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 +15 -6
- 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.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +4 -2
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/key-columns.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/key-columns.js +4 -2
- package/out/zero-cache/src/services/view-syncer/key-columns.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +2 -2
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +57 -27
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +11 -6
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +34 -22
- 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 +4 -4
- 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 +111 -51
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/error-with-level.d.ts +9 -0
- package/out/zero-cache/src/types/error-with-level.d.ts.map +1 -0
- package/out/zero-cache/src/types/error-with-level.js +24 -0
- package/out/zero-cache/src/types/error-with-level.js.map +1 -0
- package/out/zero-cache/src/types/lite.d.ts +15 -13
- package/out/zero-cache/src/types/lite.d.ts.map +1 -1
- package/out/zero-cache/src/types/lite.js +17 -5
- package/out/zero-cache/src/types/lite.js.map +1 -1
- package/out/zero-cache/src/types/pg-data-type.d.ts +73 -0
- package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -0
- package/out/zero-cache/src/types/pg-data-type.js +76 -0
- package/out/zero-cache/src/types/pg-data-type.js.map +1 -0
- package/out/zero-cache/src/types/pg.d.ts +1 -73
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +0 -77
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/processes.d.ts +1 -1
- package/out/zero-cache/src/types/processes.d.ts.map +1 -1
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/schema-versions.d.ts +7 -3
- package/out/zero-cache/src/types/schema-versions.d.ts.map +1 -1
- package/out/zero-cache/src/types/schema-versions.js +7 -5
- package/out/zero-cache/src/types/schema-versions.js.map +1 -1
- package/out/zero-cache/src/types/subscription.d.ts +1 -1
- package/out/zero-cache/src/types/subscription.js +1 -1
- package/out/zero-cache/src/types/websocket-handoff.d.ts +3 -3
- package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
- package/out/zero-cache/src/types/websocket-handoff.js +6 -4
- package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts +6 -1
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +26 -9
- package/out/zero-cache/src/workers/connection.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 +7 -1
- 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 +21 -1
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/client-error-kind-enum.d.ts +27 -0
- package/out/zero-client/src/client/client-error-kind-enum.d.ts.map +1 -0
- package/out/zero-client/src/client/client-error-kind.d.ts +5 -0
- package/out/zero-client/src/client/client-error-kind.d.ts.map +1 -0
- package/out/zero-client/src/client/connection-manager.d.ts +138 -0
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -0
- package/out/zero-client/src/client/connection-status-enum.d.ts +11 -0
- package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -0
- package/out/zero-client/src/client/connection-status.d.ts +5 -0
- package/out/zero-client/src/client/connection-status.d.ts.map +1 -0
- package/out/zero-client/src/client/connection.d.ts +45 -0
- package/out/zero-client/src/client/connection.d.ts.map +1 -0
- package/out/zero-client/src/client/crud.d.ts.map +1 -1
- package/out/zero-client/src/client/error.d.ts +192 -0
- package/out/zero-client/src/client/error.d.ts.map +1 -0
- package/out/zero-client/src/client/ivm-branch.d.ts +2 -2
- package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
- package/out/zero-client/src/client/metric-name.d.ts +5 -0
- package/out/zero-client/src/client/metric-name.d.ts.map +1 -0
- package/out/zero-client/src/client/metrics.d.ts +12 -9
- package/out/zero-client/src/client/metrics.d.ts.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.d.ts +5 -4
- package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
- package/out/zero-client/src/client/options.d.ts +6 -2
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts +5 -4
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-rep.d.ts +1 -1
- package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +55 -11
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/mod.d.ts +9 -1
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.d.ts +2 -0
- package/out/zero-protocol/src/ast.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.js +1 -0
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/custom-queries.d.ts +75 -4
- package/out/zero-protocol/src/custom-queries.d.ts.map +1 -1
- package/out/zero-protocol/src/custom-queries.js +18 -1
- package/out/zero-protocol/src/custom-queries.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +1 -1
- package/out/zero-protocol/src/error-kind-enum.d.ts +65 -0
- package/out/zero-protocol/src/error-kind-enum.d.ts.map +1 -1
- package/out/zero-protocol/src/error-kind-enum.js +2 -0
- package/out/zero-protocol/src/error-kind-enum.js.map +1 -1
- package/out/zero-protocol/src/error-origin-enum.d.ts +7 -0
- package/out/zero-protocol/src/error-origin-enum.d.ts.map +1 -0
- package/out/zero-protocol/src/error-origin-enum.js +4 -0
- package/out/zero-protocol/src/error-origin-enum.js.map +1 -0
- package/out/zero-protocol/src/error-origin.d.ts +5 -0
- package/out/zero-protocol/src/error-origin.d.ts.map +1 -0
- package/out/zero-protocol/src/error-origin.js +3 -0
- package/out/zero-protocol/src/error-origin.js.map +1 -0
- package/out/zero-protocol/src/error-reason-enum.d.ts +15 -0
- package/out/zero-protocol/src/error-reason-enum.d.ts.map +1 -0
- package/out/zero-protocol/src/error-reason-enum.js +8 -0
- package/out/zero-protocol/src/error-reason-enum.js.map +1 -0
- package/out/zero-protocol/src/error-reason.d.ts +5 -0
- package/out/zero-protocol/src/error-reason.d.ts.map +1 -0
- package/out/zero-protocol/src/error-reason.js +3 -0
- package/out/zero-protocol/src/error-reason.js.map +1 -0
- package/out/zero-protocol/src/error.d.ts +139 -1
- package/out/zero-protocol/src/error.d.ts.map +1 -1
- package/out/zero-protocol/src/error.js +64 -2
- package/out/zero-protocol/src/error.js.map +1 -1
- package/out/zero-protocol/src/mutation-id.d.ts +7 -0
- package/out/zero-protocol/src/mutation-id.d.ts.map +1 -0
- package/out/zero-protocol/src/mutation-id.js +6 -0
- package/out/zero-protocol/src/mutation-id.js.map +1 -0
- package/out/zero-protocol/src/mutations-patch.d.ts +3 -3
- package/out/zero-protocol/src/mutations-patch.d.ts.map +1 -1
- package/out/zero-protocol/src/mutations-patch.js +2 -1
- package/out/zero-protocol/src/mutations-patch.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +2 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/push.d.ts +138 -13
- package/out/zero-protocol/src/push.d.ts.map +1 -1
- package/out/zero-protocol/src/push.js +34 -13
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-react/src/mod.d.ts +2 -1
- package/out/zero-react/src/mod.d.ts.map +1 -1
- package/out/zero-react/src/use-zero-connection-state.d.ts +9 -0
- package/out/zero-react/src/use-zero-connection-state.d.ts.map +1 -0
- package/out/zero-react/src/use-zero-online.d.ts +2 -0
- package/out/zero-react/src/use-zero-online.d.ts.map +1 -1
- package/out/zero-schema/src/builder/relationship-builder.d.ts +20 -18
- package/out/zero-schema/src/builder/relationship-builder.d.ts.map +1 -1
- package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
- package/out/zero-server/src/adapters/drizzle.d.ts +2 -3
- package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
- package/out/zero-server/src/adapters/drizzle.js.map +1 -1
- package/out/zero-server/src/adapters/pg.d.ts +1 -0
- package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
- package/out/zero-server/src/adapters/pg.js.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.map +1 -1
- package/out/zero-server/src/process-mutations.d.ts +3 -3
- package/out/zero-server/src/process-mutations.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/schema.js +1 -1
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-server/src/zql-database.d.ts +1 -1
- package/out/zero-server/src/zql-database.d.ts.map +1 -1
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-solid/src/mod.d.ts +3 -2
- package/out/zero-solid/src/mod.d.ts.map +1 -1
- package/out/zero-solid/src/use-zero-connection-state.d.ts +10 -0
- package/out/zero-solid/src/use-zero-connection-state.d.ts.map +1 -0
- package/out/zero-solid/src/use-zero-online.d.ts +1 -7
- package/out/zero-solid/src/use-zero-online.d.ts.map +1 -1
- package/out/zero.js +13 -3
- package/out/zql/src/builder/builder.d.ts +14 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +33 -2
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/ivm/data.d.ts +1 -1
- package/out/zql/src/ivm/data.d.ts.map +1 -1
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/filter-push.d.ts +1 -1
- package/out/zql/src/ivm/filter-push.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-push.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +5 -5
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +0 -16
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/source.d.ts +2 -6
- package/out/zql/src/ivm/source.d.ts.map +1 -1
- package/out/zql/src/ivm/take.d.ts +1 -1
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/planner/planner-builder.d.ts +14 -0
- package/out/zql/src/planner/planner-builder.d.ts.map +1 -0
- package/out/zql/src/planner/planner-builder.js +180 -0
- package/out/zql/src/planner/planner-builder.js.map +1 -0
- package/out/zql/src/planner/planner-connection.d.ts +119 -0
- package/out/zql/src/planner/planner-connection.d.ts.map +1 -0
- package/out/zql/src/planner/planner-connection.js +301 -0
- package/out/zql/src/planner/planner-connection.js.map +1 -0
- package/out/zql/src/planner/planner-constraint.d.ts +14 -0
- package/out/zql/src/planner/planner-constraint.d.ts.map +1 -0
- package/out/zql/src/planner/planner-constraint.js +12 -0
- package/out/zql/src/planner/planner-constraint.js.map +1 -0
- package/out/zql/src/planner/planner-debug.d.ts +118 -0
- package/out/zql/src/planner/planner-debug.d.ts.map +1 -0
- package/out/zql/src/planner/planner-debug.js +125 -0
- package/out/zql/src/planner/planner-debug.js.map +1 -0
- package/out/zql/src/planner/planner-fan-in.d.ts +37 -0
- package/out/zql/src/planner/planner-fan-in.d.ts.map +1 -0
- package/out/zql/src/planner/planner-fan-in.js +149 -0
- package/out/zql/src/planner/planner-fan-in.js.map +1 -0
- package/out/zql/src/planner/planner-fan-out.d.ts +21 -0
- package/out/zql/src/planner/planner-fan-out.d.ts.map +1 -0
- package/out/zql/src/planner/planner-fan-out.js +45 -0
- package/out/zql/src/planner/planner-fan-out.js.map +1 -0
- package/out/zql/src/planner/planner-graph.d.ts +103 -0
- package/out/zql/src/planner/planner-graph.d.ts.map +1 -0
- package/out/zql/src/planner/planner-graph.js +411 -0
- package/out/zql/src/planner/planner-graph.js.map +1 -0
- package/out/zql/src/planner/planner-join.d.ts +81 -0
- package/out/zql/src/planner/planner-join.d.ts.map +1 -0
- package/out/zql/src/planner/planner-join.js +246 -0
- package/out/zql/src/planner/planner-join.js.map +1 -0
- package/out/zql/src/planner/planner-node.d.ts +21 -0
- package/out/zql/src/planner/planner-node.d.ts.map +1 -0
- package/out/zql/src/planner/planner-node.js +2 -0
- package/out/zql/src/planner/planner-node.js.map +1 -0
- package/out/zql/src/planner/planner-source.d.ts +11 -0
- package/out/zql/src/planner/planner-source.d.ts.map +1 -0
- package/out/zql/src/planner/planner-source.js +13 -0
- package/out/zql/src/planner/planner-source.js.map +1 -0
- package/out/zql/src/planner/planner-terminus.d.ts +16 -0
- package/out/zql/src/planner/planner-terminus.d.ts.map +1 -0
- package/out/zql/src/planner/planner-terminus.js +28 -0
- package/out/zql/src/planner/planner-terminus.js.map +1 -0
- package/out/zql/src/query/expression.d.ts +2 -2
- package/out/zql/src/query/expression.d.ts.map +1 -1
- package/out/zql/src/query/expression.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +3 -3
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +8 -8
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +0 -6
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query.d.ts +3 -3
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/static-query.d.ts +1 -1
- package/out/zql/src/query/static-query.d.ts.map +1 -1
- package/out/zql/src/query/static-query.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/query-delegate.d.ts +1 -1
- package/out/zqlite/src/query-delegate.d.ts.map +1 -1
- package/out/zqlite/src/query-delegate.js.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.d.ts +17 -0
- package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -0
- package/out/zqlite/src/sqlite-cost-model.js +134 -0
- package/out/zqlite/src/sqlite-cost-model.js.map +1 -0
- package/out/zqlite/src/table-source.d.ts +4 -4
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +0 -16
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +5 -4
- package/out/chunk-JS2ABYXG.js.map +0 -7
- package/out/chunk-PIXC6O7W.js.map +0 -7
- package/out/zero-cache/src/types/error-for-client.d.ts +0 -23
- package/out/zero-cache/src/types/error-for-client.d.ts.map +0 -1
- package/out/zero-cache/src/types/error-for-client.js +0 -28
- package/out/zero-cache/src/types/error-for-client.js.map +0 -1
- package/out/zero-client/src/client/connection-state-enum.d.ts +0 -7
- package/out/zero-client/src/client/connection-state-enum.d.ts.map +0 -1
- package/out/zero-client/src/client/ping-result-enum.d.ts +0 -5
- package/out/zero-client/src/client/ping-result-enum.d.ts.map +0 -1
- package/out/zero-client/src/client/server-error.d.ts +0 -15
- package/out/zero-client/src/client/server-error.d.ts.map +0 -1
- package/out/zql/src/query/assert-no-not-exists.d.ts +0 -17
- package/out/zql/src/query/assert-no-not-exists.d.ts.map +0 -1
- package/out/zql/src/query/assert-no-not-exists.js +0 -40
- package/out/zql/src/query/assert-no-not-exists.js.map +0 -1
- /package/out/{lazy-inspector-NCBESZMS.js.map → lazy-inspector-OXIFYSSQ.js.map} +0 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { assert } from "../../../shared/src/asserts.js";
|
|
2
|
+
import { mergeConstraints, } from "./planner-constraint.js";
|
|
3
|
+
/**
|
|
4
|
+
* Represents a connection to a source (table scan).
|
|
5
|
+
*
|
|
6
|
+
* # Dual State Pattern
|
|
7
|
+
* Like all planner nodes, PlannerConnection separates:
|
|
8
|
+
* 1. immutable structure: Ordering, filters, cost model (set at construction)
|
|
9
|
+
* 2. mutable state: Pinned status, constraints (mutated during planning)
|
|
10
|
+
*
|
|
11
|
+
* # Cost Estimation
|
|
12
|
+
* The ordering and filters determine the initial cost. As planning progresses,
|
|
13
|
+
* constraints from parent joins refine the cost estimate.
|
|
14
|
+
*
|
|
15
|
+
* # Constraint Flow
|
|
16
|
+
* When a connection is pinned as the outer loop, it reveals constraints for
|
|
17
|
+
* connected joins. These constraints propagate through the graph, allowing
|
|
18
|
+
* other connections to update their cost estimates.
|
|
19
|
+
*
|
|
20
|
+
* Example:
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* builder.issue.whereExists('assignee', a => a.where('name', 'Alice'))
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* ```
|
|
27
|
+
* [issue] [assignee]
|
|
28
|
+
* | |
|
|
29
|
+
* | +-- where name = 'Alice'
|
|
30
|
+
* \ /
|
|
31
|
+
* \ /
|
|
32
|
+
* [join]
|
|
33
|
+
* |
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* - Initial state: Both connections have no constraints, costs are unconstrained
|
|
37
|
+
* - If `issue` chosen first: Reveals constraint `assignee_id` for assignee connection
|
|
38
|
+
* - If `assignee` chosen first: Reveals constraint `assignee_id` for issue connection
|
|
39
|
+
* - Updated costs guide the next selection
|
|
40
|
+
*
|
|
41
|
+
* # Lifecycle
|
|
42
|
+
* 1. Construct with immutable structure (ordering, filters, cost model)
|
|
43
|
+
* 2. Wire to output node during graph construction
|
|
44
|
+
* 3. Planning mutates pinned status and accumulates constraints
|
|
45
|
+
* 4. reset() clears mutable state for replanning
|
|
46
|
+
*/
|
|
47
|
+
export class PlannerConnection {
|
|
48
|
+
kind = 'connection';
|
|
49
|
+
// ========================================================================
|
|
50
|
+
// IMMUTABLE STRUCTURE (set during construction, never changes)
|
|
51
|
+
// ========================================================================
|
|
52
|
+
#sort;
|
|
53
|
+
#filters;
|
|
54
|
+
#model;
|
|
55
|
+
table;
|
|
56
|
+
name; // Human-readable name for debugging (defaults to table name)
|
|
57
|
+
#baseConstraints; // Constraints from parent correlation
|
|
58
|
+
#baseLimit; // Original limit from query structure (never modified)
|
|
59
|
+
selectivity; // Fraction of rows passing filters (1.0 = no filtering)
|
|
60
|
+
#output; // Set once during graph construction
|
|
61
|
+
// ========================================================================
|
|
62
|
+
// MUTABLE PLANNING STATE (changes during plan search)
|
|
63
|
+
// ========================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Current limit during planning. Can be cleared (set to undefined) when a
|
|
66
|
+
* parent join is flipped, indicating this connection is now in an outer loop
|
|
67
|
+
* and should not be limited by EXISTS semantics.
|
|
68
|
+
*/
|
|
69
|
+
limit;
|
|
70
|
+
/**
|
|
71
|
+
* Constraints accumulated from parent joins during planning.
|
|
72
|
+
* Key is a path through the graph (e.g., "0,1" for branch pattern [0,1]).
|
|
73
|
+
*
|
|
74
|
+
* Undefined constraints are possible when a FO converts to UFO and only
|
|
75
|
+
* a single join in the UFO is flipped - other branches report undefined.
|
|
76
|
+
*/
|
|
77
|
+
#constraints;
|
|
78
|
+
/**
|
|
79
|
+
* Cached total cost (sum of all branches) to avoid redundant calculations.
|
|
80
|
+
* Invalidated when constraints change.
|
|
81
|
+
*/
|
|
82
|
+
#cachedTotalCost = undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Cached per-constraint costs to avoid redundant cost model calls.
|
|
85
|
+
* Maps constraint key (branch pattern string) to computed cost.
|
|
86
|
+
* Invalidated when constraints change.
|
|
87
|
+
*/
|
|
88
|
+
#cachedConstraintCosts = new Map();
|
|
89
|
+
#costDirty = true;
|
|
90
|
+
constructor(table, model, sort, filters, baseConstraints, limit, name) {
|
|
91
|
+
this.table = table;
|
|
92
|
+
this.name = name ?? table;
|
|
93
|
+
this.#sort = sort;
|
|
94
|
+
this.#filters = filters;
|
|
95
|
+
this.#model = model;
|
|
96
|
+
this.#baseConstraints = baseConstraints;
|
|
97
|
+
this.#baseLimit = limit;
|
|
98
|
+
this.limit = limit;
|
|
99
|
+
this.#constraints = new Map();
|
|
100
|
+
// Compute selectivity for EXISTS child connections (baseLimit === 1)
|
|
101
|
+
// Selectivity = fraction of rows that pass filters
|
|
102
|
+
if (limit !== undefined && filters) {
|
|
103
|
+
const costWithFilters = model(table, sort, filters, undefined);
|
|
104
|
+
const costWithoutFilters = model(table, sort, undefined, undefined);
|
|
105
|
+
this.selectivity =
|
|
106
|
+
costWithoutFilters.rows > 0
|
|
107
|
+
? costWithFilters.rows / costWithoutFilters.rows
|
|
108
|
+
: 1.0;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Root connections or connections without filters
|
|
112
|
+
this.selectivity = 1.0;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
setOutput(node) {
|
|
116
|
+
this.#output = node;
|
|
117
|
+
}
|
|
118
|
+
get output() {
|
|
119
|
+
assert(this.#output !== undefined, 'Output not set');
|
|
120
|
+
return this.#output;
|
|
121
|
+
}
|
|
122
|
+
closestJoinOrSource() {
|
|
123
|
+
return 'connection';
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Constraints are uniquely identified by their path through the
|
|
127
|
+
* graph.
|
|
128
|
+
*
|
|
129
|
+
* FO represents all sub-joins as a single path.
|
|
130
|
+
* UFO represents each sub-join as a separate path.
|
|
131
|
+
* The first branch in a UFO will match the path of FO so no re-set needs to happen
|
|
132
|
+
* when swapping from FO to UFO.
|
|
133
|
+
*
|
|
134
|
+
* FO swaps to UFO when a join inside FO-FI gets flipped.
|
|
135
|
+
*
|
|
136
|
+
* The max of the last element of the paths is the number of
|
|
137
|
+
* root branches.
|
|
138
|
+
*/
|
|
139
|
+
propagateConstraints(path, c) {
|
|
140
|
+
const key = path.join(',');
|
|
141
|
+
this.#constraints.set(key, c);
|
|
142
|
+
// Constraints changed, invalidate cost caches
|
|
143
|
+
this.#cachedTotalCost = undefined;
|
|
144
|
+
this.#cachedConstraintCosts.clear();
|
|
145
|
+
this.#costDirty = true;
|
|
146
|
+
}
|
|
147
|
+
estimateCost(branchPattern) {
|
|
148
|
+
// If no branch pattern specified, return sum of all branches
|
|
149
|
+
// This is used by getUnpinnedConnectionCosts to get total cost
|
|
150
|
+
if (branchPattern === undefined) {
|
|
151
|
+
// Return cached total cost if still valid
|
|
152
|
+
if (!this.#costDirty && this.#cachedTotalCost !== undefined) {
|
|
153
|
+
return this.#cachedTotalCost;
|
|
154
|
+
}
|
|
155
|
+
// Calculate fresh cost - sum of all branch costs
|
|
156
|
+
let totalRows = 0;
|
|
157
|
+
let maxStartupCost = 0;
|
|
158
|
+
if (this.#constraints.size === 0) {
|
|
159
|
+
// No constraints - compute unconstrained cost (but still merge base constraints)
|
|
160
|
+
const key = '';
|
|
161
|
+
let cost = this.#cachedConstraintCosts.get(key);
|
|
162
|
+
if (cost === undefined) {
|
|
163
|
+
// Merge base constraints even when no propagated constraints
|
|
164
|
+
const { startupCost, rows } = this.#model(this.table, this.#sort, this.#filters, this.#baseConstraints);
|
|
165
|
+
cost = {
|
|
166
|
+
rows,
|
|
167
|
+
runningCost: rows,
|
|
168
|
+
startupCost,
|
|
169
|
+
selectivity: this.selectivity,
|
|
170
|
+
limit: this.limit,
|
|
171
|
+
};
|
|
172
|
+
this.#cachedConstraintCosts.set(key, cost);
|
|
173
|
+
}
|
|
174
|
+
totalRows = cost.rows;
|
|
175
|
+
maxStartupCost = cost.startupCost;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Sum costs for all constraint branches
|
|
179
|
+
for (const [key, constraint] of this.#constraints.entries()) {
|
|
180
|
+
let cost = this.#cachedConstraintCosts.get(key);
|
|
181
|
+
if (cost === undefined) {
|
|
182
|
+
// Merge base constraints with propagated constraints
|
|
183
|
+
const mergedConstraint = mergeConstraints(this.#baseConstraints, constraint);
|
|
184
|
+
const { startupCost, rows } = this.#model(this.table, this.#sort, this.#filters, mergedConstraint);
|
|
185
|
+
cost = {
|
|
186
|
+
rows,
|
|
187
|
+
runningCost: rows,
|
|
188
|
+
startupCost,
|
|
189
|
+
selectivity: this.selectivity,
|
|
190
|
+
limit: this.limit,
|
|
191
|
+
};
|
|
192
|
+
this.#cachedConstraintCosts.set(key, cost);
|
|
193
|
+
}
|
|
194
|
+
totalRows += cost.rows;
|
|
195
|
+
// TODO: if no branch pattern is specified, should we sum startup costs?
|
|
196
|
+
maxStartupCost = Math.max(maxStartupCost, cost.startupCost);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
const ret = {
|
|
200
|
+
rows: totalRows,
|
|
201
|
+
runningCost: totalRows,
|
|
202
|
+
startupCost: maxStartupCost,
|
|
203
|
+
selectivity: this.selectivity,
|
|
204
|
+
limit: this.limit,
|
|
205
|
+
};
|
|
206
|
+
// Cache total and mark as clean
|
|
207
|
+
this.#cachedTotalCost = ret;
|
|
208
|
+
this.#costDirty = false;
|
|
209
|
+
return ret;
|
|
210
|
+
}
|
|
211
|
+
// Branch pattern specified - return cost for this specific branch
|
|
212
|
+
const key = branchPattern.join(',');
|
|
213
|
+
// Check per-constraint cache first
|
|
214
|
+
let cost = this.#cachedConstraintCosts.get(key);
|
|
215
|
+
if (cost !== undefined) {
|
|
216
|
+
return cost;
|
|
217
|
+
}
|
|
218
|
+
// Cache miss - compute and cache
|
|
219
|
+
const constraint = this.#constraints.get(key);
|
|
220
|
+
// Merge base constraints with propagated constraints
|
|
221
|
+
const mergedConstraint = mergeConstraints(this.#baseConstraints, constraint);
|
|
222
|
+
const { startupCost, rows } = this.#model(this.table, this.#sort, this.#filters, mergedConstraint);
|
|
223
|
+
cost = {
|
|
224
|
+
rows,
|
|
225
|
+
runningCost: rows,
|
|
226
|
+
startupCost,
|
|
227
|
+
selectivity: this.selectivity,
|
|
228
|
+
limit: this.limit,
|
|
229
|
+
};
|
|
230
|
+
this.#cachedConstraintCosts.set(key, cost);
|
|
231
|
+
return cost;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Remove the limit from this connection.
|
|
235
|
+
* Called when a parent join is flipped, making this connection part of an
|
|
236
|
+
* outer loop that should produce all rows rather than stopping at the limit.
|
|
237
|
+
*/
|
|
238
|
+
unlimit() {
|
|
239
|
+
if (this.limit !== undefined) {
|
|
240
|
+
this.limit = undefined;
|
|
241
|
+
// Limit changes do not impact connection costs.
|
|
242
|
+
// Limit is taken into account at the join level.
|
|
243
|
+
// Given that, we do not need to invalidate cost caches here.
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Propagate unlimiting when a parent join is flipped.
|
|
248
|
+
* For connections, we simply remove the limit.
|
|
249
|
+
*/
|
|
250
|
+
propagateUnlimitFromFlippedJoin() {
|
|
251
|
+
this.unlimit();
|
|
252
|
+
}
|
|
253
|
+
reset() {
|
|
254
|
+
this.#constraints.clear();
|
|
255
|
+
this.limit = this.#baseLimit;
|
|
256
|
+
// Clear all cost caches
|
|
257
|
+
this.#cachedTotalCost = undefined;
|
|
258
|
+
this.#cachedConstraintCosts.clear();
|
|
259
|
+
this.#costDirty = true;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Capture constraint state for snapshotting.
|
|
263
|
+
* Used by PlannerGraph to save/restore planning state.
|
|
264
|
+
*/
|
|
265
|
+
captureConstraints() {
|
|
266
|
+
return new Map(this.#constraints);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Restore constraint state from a snapshot.
|
|
270
|
+
* Used by PlannerGraph to restore planning state.
|
|
271
|
+
*/
|
|
272
|
+
restoreConstraints(constraints) {
|
|
273
|
+
this.#constraints.clear();
|
|
274
|
+
for (const [key, value] of constraints) {
|
|
275
|
+
this.#constraints.set(key, value);
|
|
276
|
+
}
|
|
277
|
+
// Constraints changed, invalidate cost caches
|
|
278
|
+
this.#cachedTotalCost = undefined;
|
|
279
|
+
this.#cachedConstraintCosts.clear();
|
|
280
|
+
this.#costDirty = true;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get current constraints for debugging.
|
|
284
|
+
* Returns a copy of the constraints map.
|
|
285
|
+
*/
|
|
286
|
+
getConstraintsForDebug() {
|
|
287
|
+
return new Map(this.#constraints);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get estimated cost for each constraint branch.
|
|
291
|
+
* Returns a map of constraint key to cost estimate.
|
|
292
|
+
* Forces cost calculation if not already cached.
|
|
293
|
+
*/
|
|
294
|
+
getConstraintCostsForDebug() {
|
|
295
|
+
// Trigger cost calculation to populate cache
|
|
296
|
+
this.estimateCost(undefined);
|
|
297
|
+
// Return copy of cached costs
|
|
298
|
+
return new Map(this.#cachedConstraintCosts);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=planner-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-connection.js","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* We do not know the value a constraint will take until runtime.
|
|
3
|
+
*
|
|
4
|
+
* However, we do know the column.
|
|
5
|
+
*
|
|
6
|
+
* E.g., we know that `issue.assignee_id` will be constrained to typeof issue.assignee_id.
|
|
7
|
+
*/
|
|
8
|
+
export type PlannerConstraint = Record<string, undefined>;
|
|
9
|
+
/**
|
|
10
|
+
* Multiple flipped joins will contribute extra constraints to a parent join.
|
|
11
|
+
* These need to be merged.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mergeConstraints(a: PlannerConstraint | undefined, b: PlannerConstraint | undefined): PlannerConstraint | undefined;
|
|
14
|
+
//# sourceMappingURL=planner-constraint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-constraint.d.ts","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-constraint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,iBAAiB,GAAG,SAAS,EAChC,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAC/B,iBAAiB,GAAG,SAAS,CAI/B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiple flipped joins will contribute extra constraints to a parent join.
|
|
3
|
+
* These need to be merged.
|
|
4
|
+
*/
|
|
5
|
+
export function mergeConstraints(a, b) {
|
|
6
|
+
if (!a)
|
|
7
|
+
return b;
|
|
8
|
+
if (!b)
|
|
9
|
+
return a;
|
|
10
|
+
return { ...a, ...b };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=planner-constraint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-constraint.js","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-constraint.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,CAAgC,EAChC,CAAgC;IAEhC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,OAAO,EAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { PlannerConstraint } from './planner-constraint.ts';
|
|
2
|
+
import type { CostEstimate, JoinType, NodeType } from './planner-node.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Structured debug events emitted during query planning.
|
|
5
|
+
* These events can be accumulated, printed, or analyzed to understand
|
|
6
|
+
* the planner's decision-making process.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Starting a new planning attempt with a different root connection.
|
|
10
|
+
*/
|
|
11
|
+
export type AttemptStartEvent = {
|
|
12
|
+
type: 'attempt-start';
|
|
13
|
+
attemptNumber: number;
|
|
14
|
+
totalAttempts: number;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Snapshot of connection costs before selecting the next connection.
|
|
18
|
+
*/
|
|
19
|
+
export type ConnectionCostsEvent = {
|
|
20
|
+
type: 'connection-costs';
|
|
21
|
+
attemptNumber: number;
|
|
22
|
+
costs: Array<{
|
|
23
|
+
connection: string;
|
|
24
|
+
cost: number;
|
|
25
|
+
costEstimate: CostEstimate;
|
|
26
|
+
pinned: boolean;
|
|
27
|
+
constraints: Map<string, PlannerConstraint | undefined>;
|
|
28
|
+
constraintCosts: Map<string, CostEstimate>;
|
|
29
|
+
}>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* A connection was chosen and pinned.
|
|
33
|
+
*/
|
|
34
|
+
export type ConnectionSelectedEvent = {
|
|
35
|
+
type: 'connection-selected';
|
|
36
|
+
attemptNumber: number;
|
|
37
|
+
connection: string;
|
|
38
|
+
cost: number;
|
|
39
|
+
isRoot: boolean;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Constraints have been propagated through the graph.
|
|
43
|
+
*/
|
|
44
|
+
export type ConstraintsPropagatedEvent = {
|
|
45
|
+
type: 'constraints-propagated';
|
|
46
|
+
attemptNumber: number;
|
|
47
|
+
connectionConstraints: Array<{
|
|
48
|
+
connection: string;
|
|
49
|
+
constraints: Map<string, PlannerConstraint | undefined>;
|
|
50
|
+
constraintCosts: Map<string, CostEstimate>;
|
|
51
|
+
}>;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* A complete plan was found for this attempt.
|
|
55
|
+
*/
|
|
56
|
+
export type PlanCompleteEvent = {
|
|
57
|
+
type: 'plan-complete';
|
|
58
|
+
attemptNumber: number;
|
|
59
|
+
totalCost: number;
|
|
60
|
+
nodeCosts: Array<{
|
|
61
|
+
node: string;
|
|
62
|
+
nodeType: NodeType;
|
|
63
|
+
costEstimate: CostEstimate;
|
|
64
|
+
}>;
|
|
65
|
+
joinStates: Array<{
|
|
66
|
+
join: string;
|
|
67
|
+
type: JoinType;
|
|
68
|
+
}>;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Planning attempt failed (e.g., unflippable join).
|
|
72
|
+
*/
|
|
73
|
+
export type PlanFailedEvent = {
|
|
74
|
+
type: 'plan-failed';
|
|
75
|
+
attemptNumber: number;
|
|
76
|
+
reason: string;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* The best plan across all attempts was selected.
|
|
80
|
+
*/
|
|
81
|
+
export type BestPlanSelectedEvent = {
|
|
82
|
+
type: 'best-plan-selected';
|
|
83
|
+
bestAttemptNumber: number;
|
|
84
|
+
totalCost: number;
|
|
85
|
+
joinStates: Array<{
|
|
86
|
+
join: string;
|
|
87
|
+
type: JoinType;
|
|
88
|
+
}>;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Union of all debug event types.
|
|
92
|
+
*/
|
|
93
|
+
export type PlanDebugEvent = AttemptStartEvent | ConnectionCostsEvent | ConnectionSelectedEvent | ConstraintsPropagatedEvent | PlanCompleteEvent | PlanFailedEvent | BestPlanSelectedEvent;
|
|
94
|
+
/**
|
|
95
|
+
* Interface for objects that receive debug events during planning.
|
|
96
|
+
*/
|
|
97
|
+
export interface PlanDebugger {
|
|
98
|
+
log(event: PlanDebugEvent): void;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Simple accumulator debugger that stores all events.
|
|
102
|
+
* Useful for tests and debugging.
|
|
103
|
+
*/
|
|
104
|
+
export declare class AccumulatorDebugger implements PlanDebugger {
|
|
105
|
+
readonly events: PlanDebugEvent[];
|
|
106
|
+
log(event: PlanDebugEvent): void;
|
|
107
|
+
/**
|
|
108
|
+
* Get all events of a specific type.
|
|
109
|
+
*/
|
|
110
|
+
getEvents<T extends PlanDebugEvent['type']>(type: T): Extract<PlanDebugEvent, {
|
|
111
|
+
type: T;
|
|
112
|
+
}>[];
|
|
113
|
+
/**
|
|
114
|
+
* Format events as a human-readable string.
|
|
115
|
+
*/
|
|
116
|
+
format(): string;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=planner-debug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-debug.d.ts","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-debug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple accumulator debugger that stores all events.
|
|
3
|
+
* Useful for tests and debugging.
|
|
4
|
+
*/
|
|
5
|
+
export class AccumulatorDebugger {
|
|
6
|
+
events = [];
|
|
7
|
+
log(event) {
|
|
8
|
+
this.events.push(event);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get all events of a specific type.
|
|
12
|
+
*/
|
|
13
|
+
getEvents(type) {
|
|
14
|
+
return this.events.filter(e => e.type === type);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Format events as a human-readable string.
|
|
18
|
+
*/
|
|
19
|
+
format() {
|
|
20
|
+
const lines = [];
|
|
21
|
+
for (const event of this.events) {
|
|
22
|
+
lines.push(formatEvent(event));
|
|
23
|
+
}
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Format a constraint object as a human-readable string.
|
|
29
|
+
*/
|
|
30
|
+
function formatConstraint(constraint) {
|
|
31
|
+
if (!constraint)
|
|
32
|
+
return '{}';
|
|
33
|
+
const keys = Object.keys(constraint);
|
|
34
|
+
if (keys.length === 0)
|
|
35
|
+
return '{}';
|
|
36
|
+
return '{' + keys.join(', ') + '}';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Format a single debug event as a human-readable string.
|
|
40
|
+
*/
|
|
41
|
+
function formatEvent(event) {
|
|
42
|
+
switch (event.type) {
|
|
43
|
+
case 'attempt-start':
|
|
44
|
+
return `[Attempt ${event.attemptNumber + 1}/${event.totalAttempts}] Starting planning attempt`;
|
|
45
|
+
case 'connection-costs': {
|
|
46
|
+
const lines = [`[Attempt ${event.attemptNumber + 1}] Connection costs:`];
|
|
47
|
+
for (const c of event.costs) {
|
|
48
|
+
// Format the main connection info
|
|
49
|
+
// const limitStr = c.costEstimate.limit !== undefined
|
|
50
|
+
// ? c.costEstimate.limit.toString()
|
|
51
|
+
// : 'none';
|
|
52
|
+
lines.push(` ${c.connection}: cost=${c.cost.toFixed(2)}, `);
|
|
53
|
+
// Format each branch's constraints with costs
|
|
54
|
+
if (c.constraints.size === 0) {
|
|
55
|
+
const cost = c.constraintCosts.get('');
|
|
56
|
+
const costStr = cost ? ` cost=${cost.rows.toFixed(2)}` : '';
|
|
57
|
+
lines.push(` Branch [none]: {}${costStr}`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
for (const [branchKey, constraint] of c.constraints) {
|
|
61
|
+
const branchLabel = branchKey === '' ? 'none' : branchKey;
|
|
62
|
+
const cost = c.constraintCosts.get(branchKey);
|
|
63
|
+
const costStr = cost ? ` cost=${cost.rows.toFixed(2)}` : '';
|
|
64
|
+
lines.push(` Branch [${branchLabel}]: ${formatConstraint(constraint)}${costStr}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return lines.join('\n');
|
|
69
|
+
}
|
|
70
|
+
case 'connection-selected':
|
|
71
|
+
return (`[Attempt ${event.attemptNumber + 1}] Selected ${event.isRoot ? 'ROOT' : ''} connection: ` +
|
|
72
|
+
`${event.connection} (cost=${event.cost.toFixed(2)})`);
|
|
73
|
+
case 'constraints-propagated': {
|
|
74
|
+
const lines = [
|
|
75
|
+
`[Attempt ${event.attemptNumber + 1}] Constraints propagated:`,
|
|
76
|
+
];
|
|
77
|
+
for (const c of event.connectionConstraints) {
|
|
78
|
+
lines.push(` ${c.connection}:`);
|
|
79
|
+
// Format each branch's constraints with costs
|
|
80
|
+
if (c.constraints.size === 0) {
|
|
81
|
+
const cost = c.constraintCosts.get('');
|
|
82
|
+
const costStr = cost ? ` cost=${cost.rows.toFixed(2)}` : '';
|
|
83
|
+
lines.push(` Branch [none]: {}${costStr}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
for (const [branchKey, constraint] of c.constraints) {
|
|
87
|
+
const branchLabel = branchKey === '' ? 'none' : branchKey;
|
|
88
|
+
const cost = c.constraintCosts.get(branchKey);
|
|
89
|
+
const costStr = cost ? ` cost=${cost.rows.toFixed(2)}` : '';
|
|
90
|
+
lines.push(` Branch [${branchLabel}]: ${formatConstraint(constraint)}${costStr}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return lines.join('\n');
|
|
95
|
+
}
|
|
96
|
+
case 'plan-complete': {
|
|
97
|
+
const lines = [
|
|
98
|
+
`[Attempt ${event.attemptNumber + 1}] Plan complete! Total cost: ${event.totalCost.toFixed(2)}`,
|
|
99
|
+
` Joins:`,
|
|
100
|
+
];
|
|
101
|
+
for (const j of event.joinStates) {
|
|
102
|
+
lines.push(` ${j.join}: ${j.type}`);
|
|
103
|
+
}
|
|
104
|
+
lines.push(` Node costs:`);
|
|
105
|
+
for (const n of event.nodeCosts) {
|
|
106
|
+
lines.push(` ${n.node} (${n.nodeType}): ${n.costEstimate.runningCost.toFixed(2)}`);
|
|
107
|
+
}
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
case 'plan-failed':
|
|
111
|
+
return `[Attempt ${event.attemptNumber + 1}] Plan FAILED: ${event.reason}`;
|
|
112
|
+
case 'best-plan-selected': {
|
|
113
|
+
const lines = [
|
|
114
|
+
`[FINAL] Best plan selected from attempt ${event.bestAttemptNumber + 1}`,
|
|
115
|
+
` Total cost: ${event.totalCost.toFixed(2)}`,
|
|
116
|
+
` Joins:`,
|
|
117
|
+
];
|
|
118
|
+
for (const j of event.joinStates) {
|
|
119
|
+
lines.push(` ${j.join}: ${j.type}`);
|
|
120
|
+
}
|
|
121
|
+
return lines.join('\n');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=planner-debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-debug.js","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-debug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { PlannerConstraint } from './planner-constraint.ts';
|
|
2
|
+
import type { CostEstimate, JoinOrConnection, PlannerNode } from './planner-node.ts';
|
|
3
|
+
/**
|
|
4
|
+
* A PlannerFanIn node can either be a normal FanIn or UnionFanIn.
|
|
5
|
+
*
|
|
6
|
+
* These have different performance characteristics so we need to distinguish them.
|
|
7
|
+
*
|
|
8
|
+
* A normal FanIn only does a single fetch to FanOut, regardless of how many internal
|
|
9
|
+
* branches / inputs it has.
|
|
10
|
+
*
|
|
11
|
+
* A UnionFanIn does a fetch per internal branch / input. This causes an exponential
|
|
12
|
+
* increase in cost if many UnionFanIns are chained after on another. E.g., `(A or B) AND (C or D)`.
|
|
13
|
+
*
|
|
14
|
+
* To capture this cost blow-up, union fan in assigns different branch patterns to their inputs.
|
|
15
|
+
*
|
|
16
|
+
* Since UFI will generate a unique branch pattern per input, planner-connection will yield a higher cost
|
|
17
|
+
* each time a UFI is present. planner-connection will return the sum of the costs of each unique branch pattern.
|
|
18
|
+
*/
|
|
19
|
+
export declare class PlannerFanIn {
|
|
20
|
+
#private;
|
|
21
|
+
readonly kind: "fan-in";
|
|
22
|
+
constructor(inputs: PlannerNode[]);
|
|
23
|
+
get type(): "FI" | "UFI";
|
|
24
|
+
closestJoinOrSource(): JoinOrConnection;
|
|
25
|
+
setOutput(node: PlannerNode): void;
|
|
26
|
+
get output(): PlannerNode;
|
|
27
|
+
reset(): void;
|
|
28
|
+
convertToUFI(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Propagate unlimiting when a parent join is flipped.
|
|
31
|
+
* Fan-in propagates to all of its inputs.
|
|
32
|
+
*/
|
|
33
|
+
propagateUnlimitFromFlippedJoin(): void;
|
|
34
|
+
estimateCost(branchPattern?: number[]): CostEstimate;
|
|
35
|
+
propagateConstraints(branchPattern: number[], constraint: PlannerConstraint | undefined, from: PlannerNode): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=planner-fan-in.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-fan-in.d.ts","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-fan-in.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;;IACvB,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;gBAKtB,MAAM,EAAE,WAAW,EAAE;IAKjC,IAAI,IAAI,iBAEP;IAED,mBAAmB,IAAI,gBAAgB;IAIvC,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAIlC,IAAI,MAAM,IAAI,WAAW,CAGxB;IAED,KAAK;IAIL,YAAY,IAAI,IAAI;IAIpB;;;OAGG;IACH,+BAA+B,IAAI,IAAI;IAavC,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY;IAmFpD,oBAAoB,CAClB,aAAa,EAAE,MAAM,EAAE,EACvB,UAAU,EAAE,iBAAiB,GAAG,SAAS,EACzC,IAAI,EAAE,WAAW,GAChB,IAAI;CAsBR"}
|