@rocicorp/zero 0.25.0-canary.0 → 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-BJ2CGCME.js → chunk-55BOUNXO.js} +3 -3
- package/out/chunk-55BOUNXO.js.map +7 -0
- package/out/{chunk-MXPHMVU7.js → chunk-AIPM77UE.js} +2337 -548
- package/out/chunk-AIPM77UE.js.map +7 -0
- package/out/{chunk-4RB4OYLQ.js → chunk-TJFNGO7E.js} +3 -2
- package/out/{lazy-inspector-2SW772W4.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 +4 -3
- 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.js +2 -2
- 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 +12 -12
- 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/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 +6 -3
- 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 +1 -1
- 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 +19 -2
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -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 +67 -31
- 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 +8 -0
- package/out/zero-client/src/client/client-error-kind-enum.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts +65 -13
- package/out/zero-client/src/client/connection-manager.d.ts.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.d.ts +45 -0
- package/out/zero-client/src/client/connection.d.ts.map +1 -0
- package/out/zero-client/src/client/error.d.ts +178 -23
- package/out/zero-client/src/client/error.d.ts.map +1 -1
- 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/metrics.d.ts +9 -0
- 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 +27 -5
- 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/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-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 +2 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +5 -1
- 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 +2 -2
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/source.d.ts +1 -1
- 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.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 +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +4 -3
- package/out/chunk-BJ2CGCME.js.map +0 -7
- package/out/chunk-MXPHMVU7.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/ping-result-enum.d.ts +0 -5
- package/out/zero-client/src/client/ping-result-enum.d.ts.map +0 -1
- /package/out/{chunk-4RB4OYLQ.js.map → chunk-TJFNGO7E.js.map} +0 -0
- /package/out/{lazy-inspector-2SW772W4.js.map → lazy-inspector-OXIFYSSQ.js.map} +0 -0
|
@@ -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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { assert } from "../../../shared/src/asserts.js";
|
|
2
|
+
/**
|
|
3
|
+
* A PlannerFanIn node can either be a normal FanIn or UnionFanIn.
|
|
4
|
+
*
|
|
5
|
+
* These have different performance characteristics so we need to distinguish them.
|
|
6
|
+
*
|
|
7
|
+
* A normal FanIn only does a single fetch to FanOut, regardless of how many internal
|
|
8
|
+
* branches / inputs it has.
|
|
9
|
+
*
|
|
10
|
+
* A UnionFanIn does a fetch per internal branch / input. This causes an exponential
|
|
11
|
+
* increase in cost if many UnionFanIns are chained after on another. E.g., `(A or B) AND (C or D)`.
|
|
12
|
+
*
|
|
13
|
+
* To capture this cost blow-up, union fan in assigns different branch patterns to their inputs.
|
|
14
|
+
*
|
|
15
|
+
* Since UFI will generate a unique branch pattern per input, planner-connection will yield a higher cost
|
|
16
|
+
* each time a UFI is present. planner-connection will return the sum of the costs of each unique branch pattern.
|
|
17
|
+
*/
|
|
18
|
+
export class PlannerFanIn {
|
|
19
|
+
kind = 'fan-in';
|
|
20
|
+
#type;
|
|
21
|
+
#output;
|
|
22
|
+
#inputs;
|
|
23
|
+
constructor(inputs) {
|
|
24
|
+
this.#type = 'FI';
|
|
25
|
+
this.#inputs = inputs;
|
|
26
|
+
}
|
|
27
|
+
get type() {
|
|
28
|
+
return this.#type;
|
|
29
|
+
}
|
|
30
|
+
closestJoinOrSource() {
|
|
31
|
+
return 'join';
|
|
32
|
+
}
|
|
33
|
+
setOutput(node) {
|
|
34
|
+
this.#output = node;
|
|
35
|
+
}
|
|
36
|
+
get output() {
|
|
37
|
+
assert(this.#output !== undefined, 'Output not set');
|
|
38
|
+
return this.#output;
|
|
39
|
+
}
|
|
40
|
+
reset() {
|
|
41
|
+
this.#type = 'FI';
|
|
42
|
+
}
|
|
43
|
+
convertToUFI() {
|
|
44
|
+
this.#type = 'UFI';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Propagate unlimiting when a parent join is flipped.
|
|
48
|
+
* Fan-in propagates to all of its inputs.
|
|
49
|
+
*/
|
|
50
|
+
propagateUnlimitFromFlippedJoin() {
|
|
51
|
+
for (const input of this.#inputs) {
|
|
52
|
+
if ('propagateUnlimitFromFlippedJoin' in input &&
|
|
53
|
+
typeof input.propagateUnlimitFromFlippedJoin === 'function') {
|
|
54
|
+
input.propagateUnlimitFromFlippedJoin();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
estimateCost(branchPattern) {
|
|
59
|
+
// FanIn always sums costs of its inputs
|
|
60
|
+
// But it needs to pass the correct branch pattern to each input
|
|
61
|
+
let totalCost = {
|
|
62
|
+
rows: 0,
|
|
63
|
+
runningCost: 0,
|
|
64
|
+
startupCost: 0,
|
|
65
|
+
selectivity: 0,
|
|
66
|
+
limit: undefined,
|
|
67
|
+
};
|
|
68
|
+
branchPattern = branchPattern ?? [];
|
|
69
|
+
if (this.#type === 'FI') {
|
|
70
|
+
// Normal FanIn: all inputs get the same branch pattern with 0 prepended
|
|
71
|
+
const updatedPattern = [0, ...branchPattern];
|
|
72
|
+
let maxrows = 0;
|
|
73
|
+
let maxRunningCost = 0;
|
|
74
|
+
let maxStartupCost = 0;
|
|
75
|
+
// Track complement probability for OR selectivity: P(A OR B) = 1 - (1-A)(1-B)
|
|
76
|
+
let noMatchProb = 1.0;
|
|
77
|
+
for (const input of this.#inputs) {
|
|
78
|
+
const cost = input.estimateCost(updatedPattern);
|
|
79
|
+
if (cost.rows > maxrows) {
|
|
80
|
+
maxrows = cost.rows;
|
|
81
|
+
}
|
|
82
|
+
if (cost.runningCost > maxRunningCost) {
|
|
83
|
+
maxRunningCost = cost.runningCost;
|
|
84
|
+
}
|
|
85
|
+
// FI fetches from the root only once, so take the max startup cost
|
|
86
|
+
if (cost.startupCost > maxStartupCost) {
|
|
87
|
+
maxStartupCost = cost.startupCost;
|
|
88
|
+
}
|
|
89
|
+
// OR branches: combine selectivities assuming independent events
|
|
90
|
+
// P(A OR B) = 1 - (1-A)(1-B)
|
|
91
|
+
// Track probability of NO match in any branch
|
|
92
|
+
noMatchProb *= 1 - cost.selectivity;
|
|
93
|
+
// all inputs should have the same limit.
|
|
94
|
+
assert(totalCost.limit === undefined || cost.limit === totalCost.limit, 'All FanIn inputs should have the same limit');
|
|
95
|
+
totalCost.limit = cost.limit;
|
|
96
|
+
}
|
|
97
|
+
totalCost.rows = maxrows;
|
|
98
|
+
totalCost.runningCost = maxRunningCost;
|
|
99
|
+
totalCost.startupCost = maxStartupCost;
|
|
100
|
+
totalCost.selectivity = 1 - noMatchProb;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Union FanIn (UFI): each input gets unique branch pattern
|
|
104
|
+
let i = 0;
|
|
105
|
+
// Track complement probability for OR selectivity: P(A OR B) = 1 - (1-A)(1-B)
|
|
106
|
+
let noMatchProb = 1.0;
|
|
107
|
+
for (const input of this.#inputs) {
|
|
108
|
+
const updatedPattern = [i, ...branchPattern];
|
|
109
|
+
const cost = input.estimateCost(updatedPattern);
|
|
110
|
+
totalCost.rows += cost.rows;
|
|
111
|
+
totalCost.runningCost += cost.runningCost;
|
|
112
|
+
// UFI runs all branches, so startup costs add up
|
|
113
|
+
totalCost.startupCost += cost.startupCost;
|
|
114
|
+
// OR branches: combine selectivities assuming independent events
|
|
115
|
+
// P(A OR B) = 1 - (1-A)(1-B)
|
|
116
|
+
// Track probability of NO match in any branch
|
|
117
|
+
noMatchProb *= 1 - cost.selectivity;
|
|
118
|
+
// all inputs should have the same limit.
|
|
119
|
+
assert(totalCost.limit === undefined || cost.limit === totalCost.limit, 'All FanIn inputs should have the same limit');
|
|
120
|
+
totalCost.limit = cost.limit;
|
|
121
|
+
i++;
|
|
122
|
+
}
|
|
123
|
+
totalCost.selectivity = 1 - noMatchProb;
|
|
124
|
+
}
|
|
125
|
+
return totalCost;
|
|
126
|
+
}
|
|
127
|
+
propagateConstraints(branchPattern, constraint, from) {
|
|
128
|
+
if (this.#type === 'FI') {
|
|
129
|
+
const updatedPattern = [0, ...branchPattern];
|
|
130
|
+
/**
|
|
131
|
+
* All inputs get the same branch pattern.
|
|
132
|
+
* 1. They cannot contribute differing constraints to their parent inputs because they are not flipped.
|
|
133
|
+
* If they were flipped this would be of type UFI.
|
|
134
|
+
* 2. All inputs need to be called because they could be pinned. If they are pinned they could have constraints
|
|
135
|
+
* to send to their children.
|
|
136
|
+
*/
|
|
137
|
+
for (const input of this.#inputs) {
|
|
138
|
+
input.propagateConstraints(updatedPattern, constraint, from);
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
let i = 0;
|
|
143
|
+
for (const input of this.#inputs) {
|
|
144
|
+
input.propagateConstraints([i, ...branchPattern], constraint, from);
|
|
145
|
+
i++;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=planner-fan-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-fan-in.js","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-fan-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;AAQtD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,QAAiB,CAAC;IAClC,KAAK,CAAe;IACpB,OAAO,CAA2B;IACzB,OAAO,CAAgB;IAEhC,YAAY,MAAqB;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,mBAAmB;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,IAAiB;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,IAAI,MAAM;QACR,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,YAAY;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,+BAA+B;QAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,IACE,iCAAiC,IAAI,KAAK;gBAC1C,OAAO,KAAK,CAAC,+BAA+B,KAAK,UAAU,EAC3D,CAAC;gBAEC,KACD,CAAC,+BAA+B,EAAE,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAY,CAAC,aAAwB;QACnC,wCAAwC;QACxC,gEAAgE;QAChE,IAAI,SAAS,GAAiB;YAC5B,IAAI,EAAE,CAAC;YACP,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,KAAK,EAAE,SAAS;SACjB,CAAC;QAEF,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,wEAAwE;YACxE,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC;YAC7C,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,8EAA8E;YAC9E,IAAI,WAAW,GAAG,GAAG,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;gBAChD,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;oBACxB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;gBACtB,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,GAAG,cAAc,EAAE,CAAC;oBACtC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC;gBACpC,CAAC;gBACD,mEAAmE;gBACnE,IAAI,IAAI,CAAC,WAAW,GAAG,cAAc,EAAE,CAAC;oBACtC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC;gBACpC,CAAC;gBAED,iEAAiE;gBACjE,6BAA6B;gBAC7B,8CAA8C;gBAC9C,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;gBAEpC,yCAAyC;gBACzC,MAAM,CACJ,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,EAC/D,6CAA6C,CAC9C,CAAC;gBACF,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAC/B,CAAC;YAED,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC;YACzB,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;YACvC,SAAS,CAAC,WAAW,GAAG,cAAc,CAAC;YACvC,SAAS,CAAC,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,8EAA8E;YAC9E,IAAI,WAAW,GAAG,GAAG,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;gBAChD,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;gBAC5B,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;gBAC1C,iDAAiD;gBACjD,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;gBAE1C,iEAAiE;gBACjE,6BAA6B;gBAC7B,8CAA8C;gBAC9C,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;gBAEpC,yCAAyC;gBACzC,MAAM,CACJ,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,EAC/D,6CAA6C,CAC9C,CAAC;gBACF,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC7B,CAAC,EAAE,CAAC;YACN,CAAC;YACD,SAAS,CAAC,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC;QAC1C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oBAAoB,CAClB,aAAuB,EACvB,UAAyC,EACzC,IAAiB;QAEjB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC;YAC7C;;;;;;eAMG;YACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,KAAK,CAAC,oBAAoB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACpE,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PlannerConstraint } from './planner-constraint.ts';
|
|
2
|
+
import type { CostEstimate, JoinOrConnection, PlannerNode } from './planner-node.ts';
|
|
3
|
+
export declare class PlannerFanOut {
|
|
4
|
+
#private;
|
|
5
|
+
readonly kind: "fan-out";
|
|
6
|
+
constructor(input: PlannerNode);
|
|
7
|
+
get type(): "FO" | "UFO";
|
|
8
|
+
addOutput(node: PlannerNode): void;
|
|
9
|
+
get outputs(): PlannerNode[];
|
|
10
|
+
closestJoinOrSource(): JoinOrConnection;
|
|
11
|
+
propagateConstraints(branchPattern: number[], constraint: PlannerConstraint | undefined, _from: PlannerNode): void;
|
|
12
|
+
estimateCost(branchPattern?: number[]): CostEstimate;
|
|
13
|
+
convertToUFO(): void;
|
|
14
|
+
reset(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Propagate unlimiting when a parent join is flipped.
|
|
17
|
+
* Fan-out propagates to its input.
|
|
18
|
+
*/
|
|
19
|
+
propagateUnlimitFromFlippedJoin(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=planner-fan-out.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-fan-out.d.ts","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-fan-out.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,aAAa;;IACxB,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;gBAKvB,KAAK,EAAE,WAAW;IAK9B,IAAI,IAAI,iBAEP;IAED,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAIlC,IAAI,OAAO,IAAI,WAAW,EAAE,CAE3B;IAED,mBAAmB,IAAI,gBAAgB;IAIvC,oBAAoB,CAClB,aAAa,EAAE,MAAM,EAAE,EACvB,UAAU,EAAE,iBAAiB,GAAG,SAAS,EACzC,KAAK,EAAE,WAAW,GACjB,IAAI;IAIP,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY;IAIpD,YAAY,IAAI,IAAI;IAIpB,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,+BAA+B,IAAI,IAAI;CAUxC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export class PlannerFanOut {
|
|
2
|
+
kind = 'fan-out';
|
|
3
|
+
#type;
|
|
4
|
+
#outputs = [];
|
|
5
|
+
#input;
|
|
6
|
+
constructor(input) {
|
|
7
|
+
this.#type = 'FO';
|
|
8
|
+
this.#input = input;
|
|
9
|
+
}
|
|
10
|
+
get type() {
|
|
11
|
+
return this.#type;
|
|
12
|
+
}
|
|
13
|
+
addOutput(node) {
|
|
14
|
+
this.#outputs.push(node);
|
|
15
|
+
}
|
|
16
|
+
get outputs() {
|
|
17
|
+
return this.#outputs;
|
|
18
|
+
}
|
|
19
|
+
closestJoinOrSource() {
|
|
20
|
+
return this.#input.closestJoinOrSource();
|
|
21
|
+
}
|
|
22
|
+
propagateConstraints(branchPattern, constraint, _from) {
|
|
23
|
+
this.#input.propagateConstraints(branchPattern, constraint, this);
|
|
24
|
+
}
|
|
25
|
+
estimateCost(branchPattern) {
|
|
26
|
+
return this.#input.estimateCost(branchPattern);
|
|
27
|
+
}
|
|
28
|
+
convertToUFO() {
|
|
29
|
+
this.#type = 'UFO';
|
|
30
|
+
}
|
|
31
|
+
reset() {
|
|
32
|
+
this.#type = 'FO';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Propagate unlimiting when a parent join is flipped.
|
|
36
|
+
* Fan-out propagates to its input.
|
|
37
|
+
*/
|
|
38
|
+
propagateUnlimitFromFlippedJoin() {
|
|
39
|
+
if ('propagateUnlimitFromFlippedJoin' in this.#input &&
|
|
40
|
+
typeof this.#input.propagateUnlimitFromFlippedJoin === 'function') {
|
|
41
|
+
this.#input.propagateUnlimitFromFlippedJoin();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=planner-fan-out.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-fan-out.js","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-fan-out.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,SAAkB,CAAC;IACnC,KAAK,CAAe;IACX,QAAQ,GAAkB,EAAE,CAAC;IAC7B,MAAM,CAAc;IAE7B,YAAY,KAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,IAAiB;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAC3C,CAAC;IAED,oBAAoB,CAClB,aAAuB,EACvB,UAAyC,EACzC,KAAkB;QAElB,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,YAAY,CAAC,aAAwB;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAED,YAAY;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,+BAA+B;QAC7B,IACE,iCAAiC,IAAI,IAAI,CAAC,MAAM;YAChD,OAAO,IAAI,CAAC,MAAM,CAAC,+BAA+B,KAAK,UAAU,EACjE,CAAC;YAEC,IAAI,CAAC,MACN,CAAC,+BAA+B,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { PlannerJoin } from './planner-join.ts';
|
|
2
|
+
import type { PlannerFanOut } from './planner-fan-out.ts';
|
|
3
|
+
import type { PlannerFanIn } from './planner-fan-in.ts';
|
|
4
|
+
import type { PlannerConnection } from './planner-connection.ts';
|
|
5
|
+
import type { PlannerTerminus } from './planner-terminus.ts';
|
|
6
|
+
import { PlannerSource, type ConnectionCostModel } from './planner-source.ts';
|
|
7
|
+
import type { PlannerConstraint } from './planner-constraint.ts';
|
|
8
|
+
import type { PlanDebugger } from './planner-debug.ts';
|
|
9
|
+
/**
|
|
10
|
+
* Captured state of a plan for comparison and restoration.
|
|
11
|
+
*/
|
|
12
|
+
type PlanState = {
|
|
13
|
+
connections: Array<{
|
|
14
|
+
limit: number | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
joins: Array<{
|
|
17
|
+
type: 'semi' | 'flipped';
|
|
18
|
+
}>;
|
|
19
|
+
fanOuts: Array<{
|
|
20
|
+
type: 'FO' | 'UFO';
|
|
21
|
+
}>;
|
|
22
|
+
fanIns: Array<{
|
|
23
|
+
type: 'FI' | 'UFI';
|
|
24
|
+
}>;
|
|
25
|
+
connectionConstraints: Array<Map<string, PlannerConstraint | undefined>>;
|
|
26
|
+
};
|
|
27
|
+
export declare class PlannerGraph {
|
|
28
|
+
#private;
|
|
29
|
+
joins: PlannerJoin[];
|
|
30
|
+
fanOuts: PlannerFanOut[];
|
|
31
|
+
fanIns: PlannerFanIn[];
|
|
32
|
+
connections: PlannerConnection[];
|
|
33
|
+
/**
|
|
34
|
+
* Reset all planning state back to initial values for another planning pass.
|
|
35
|
+
* Resets only mutable planning state - graph structure is unchanged.
|
|
36
|
+
*
|
|
37
|
+
* This allows replanning the same query graph with different strategies.
|
|
38
|
+
*/
|
|
39
|
+
resetPlanningState(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Create and register a source (table) in the graph.
|
|
42
|
+
*/
|
|
43
|
+
addSource(name: string, model: ConnectionCostModel): PlannerSource;
|
|
44
|
+
/**
|
|
45
|
+
* Get a source by table name.
|
|
46
|
+
*/
|
|
47
|
+
getSource(name: string): PlannerSource;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a source exists by table name.
|
|
50
|
+
*/
|
|
51
|
+
hasSource(name: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Set the terminus (final output) node of the graph.
|
|
54
|
+
* Constraint propagation starts from this node.
|
|
55
|
+
*/
|
|
56
|
+
setTerminus(terminus: PlannerTerminus): void;
|
|
57
|
+
/**
|
|
58
|
+
* Initiate constraint propagation from the terminus node.
|
|
59
|
+
* This sends constraints up through the graph to update
|
|
60
|
+
* connection cost estimates.
|
|
61
|
+
*/
|
|
62
|
+
propagateConstraints(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Calculate total cost of the current plan.
|
|
65
|
+
* Total cost includes both startup cost (one-time, e.g., sorting) and running cost.
|
|
66
|
+
*/
|
|
67
|
+
getTotalCost(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Capture a lightweight snapshot of the current planning state.
|
|
70
|
+
* Used for backtracking during multi-start greedy search.
|
|
71
|
+
*
|
|
72
|
+
* Captures mutable state including pinned flags, join types, and
|
|
73
|
+
* constraint maps to avoid needing repropagation on restore.
|
|
74
|
+
*
|
|
75
|
+
* @returns A snapshot that can be restored via restorePlanningSnapshot()
|
|
76
|
+
*/
|
|
77
|
+
capturePlanningSnapshot(): PlanState;
|
|
78
|
+
/**
|
|
79
|
+
* Restore planning state from a previously captured snapshot.
|
|
80
|
+
* Used for backtracking when a planning attempt fails.
|
|
81
|
+
*
|
|
82
|
+
* Restores pinned flags, join types, and constraint maps, eliminating
|
|
83
|
+
* the need for repropagation.
|
|
84
|
+
*
|
|
85
|
+
* @param state - Snapshot created by capturePlanningSnapshot()
|
|
86
|
+
*/
|
|
87
|
+
restorePlanningSnapshot(state: PlanState): void;
|
|
88
|
+
/**
|
|
89
|
+
* Main planning algorithm using exhaustive join flip enumeration.
|
|
90
|
+
*
|
|
91
|
+
* Enumerates all possible flip patterns for flippable joins (2^n for n flippable joins).
|
|
92
|
+
* Each pattern represents a different query execution plan. We evaluate the cost of each
|
|
93
|
+
* plan and select the one with the lowest cost.
|
|
94
|
+
*
|
|
95
|
+
* Connections are used only for cost estimation - the flip patterns determine the plan.
|
|
96
|
+
* FanOut/FanIn states (FO/UFO and FI/UFI) are automatically derived from join flip states.
|
|
97
|
+
*
|
|
98
|
+
* @param planDebugger - Optional debugger to receive structured events during planning
|
|
99
|
+
*/
|
|
100
|
+
plan(planDebugger?: PlanDebugger): void;
|
|
101
|
+
}
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=planner-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-graph.d.ts","sourceRoot":"","sources":["../../../../../zql/src/planner/planner-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAC,aAAa,EAAE,KAAK,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,KAAK,SAAS,GAAG;IACf,WAAW,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,CAAC,CAAC;IAChD,KAAK,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,CAAC,CAAC;IACzC,OAAO,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAA;KAAC,CAAC,CAAC;IACrC,MAAM,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAA;KAAC,CAAC,CAAC;IACpC,qBAAqB,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC;CAC1E,CAAC;AAkBF,qBAAa,YAAY;;IAQvB,KAAK,EAAE,WAAW,EAAE,CAAM;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAM;IAC9B,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,WAAW,EAAE,iBAAiB,EAAE,CAAM;IAEtC;;;;;OAKG;IACH,kBAAkB;IAOlB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,aAAa;IAUlE;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAMtC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI5C;;;;OAIG;IACH,oBAAoB,IAAI,IAAI;IAQ5B;;;OAGG;IACH,YAAY,IAAI,MAAM;IAKtB;;;;;;;;OAQG;IACH,uBAAuB,IAAI,SAAS;IAYpC;;;;;;;;OAQG;IACH,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAuI/C;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI;CA8HxC"}
|