@rocicorp/zero 1.11.0-canary.7 → 1.11.0-canary.9
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/replicache/src/dag/gc.d.ts.map +1 -1
- package/out/replicache/src/dag/gc.js +2 -1
- package/out/replicache/src/dag/gc.js.map +1 -1
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
- package/out/replicache/src/dag/store-impl.d.ts +12 -2
- package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
- package/out/replicache/src/dag/store-impl.js +22 -8
- package/out/replicache/src/dag/store-impl.js.map +1 -1
- package/out/replicache/src/db/rebase.d.ts +14 -2
- package/out/replicache/src/db/rebase.d.ts.map +1 -1
- package/out/replicache/src/db/rebase.js +27 -5
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.d.ts +10 -5
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js +16 -9
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/persist.d.ts.map +1 -1
- package/out/replicache/src/persist/persist.js +12 -5
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js +6 -2
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts +7 -3
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js +98 -11
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/replicache-options.d.ts +9 -0
- package/out/replicache/src/replicache-options.d.ts.map +1 -1
- package/out/shared/src/iterables.d.ts +2 -0
- package/out/shared/src/iterables.d.ts.map +1 -1
- package/out/shared/src/iterables.js +18 -1
- package/out/shared/src/iterables.js.map +1 -1
- package/out/shared/src/ring-buffer.d.ts +8 -0
- package/out/shared/src/ring-buffer.d.ts.map +1 -1
- package/out/shared/src/ring-buffer.js +22 -1
- package/out/shared/src/ring-buffer.js.map +1 -1
- package/out/zero/package.js +2 -3
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +2 -2
- package/out/zero-cache/src/config/zero-config.js.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 +18 -2
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +20 -7
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-resume.d.ts +156 -0
- package/out/zero-cache/src/services/change-source/pg/backfill-resume.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/backfill-resume.js +15 -0
- package/out/zero-cache/src/services/change-source/pg/backfill-resume.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts +15 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js +99 -0
- package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +14 -16
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +33 -126
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +16 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +8 -4
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts +16 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +113 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +1 -15
- package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js +18 -21
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +8 -9
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts +17 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js +19 -3
- package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js +1 -0
- package/out/zero-cache/src/services/change-streamer/vfs-watermark-poller.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js +1 -0
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +14 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +30 -4
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js +2 -2
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +6 -10
- 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 +14 -4
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/streams.d.ts.map +1 -1
- package/out/zero-cache/src/types/streams.js +1 -1
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts +20 -0
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +32 -14
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
- package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.js +3 -1
- package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
- package/out/zero-client/src/client/connection.d.ts +6 -0
- package/out/zero-client/src/client/connection.d.ts.map +1 -1
- package/out/zero-client/src/client/connection.js +2 -1
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +8 -11
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +11 -15
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/custom.js +2 -2
- package/out/zero-client/src/client/custom.js.map +1 -1
- package/out/zero-client/src/client/error.js +1 -1
- package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.js +2 -1
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +3 -0
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +42 -6
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero-rep.d.ts +1 -0
- package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-rep.js +7 -5
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +9 -3
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +48 -11
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/types/query-result.d.ts +2 -0
- package/out/zero-client/src/types/query-result.d.ts.map +1 -1
- package/out/zero-react/src/use-query.d.ts +5 -4
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js +12 -1
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-server/src/adapters/drizzle.d.ts +2 -1
- package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
- package/out/zero-server/src/adapters/drizzle.js +12 -7
- package/out/zero-server/src/adapters/drizzle.js.map +1 -1
- package/out/zero-server/src/adapters/kysely.d.ts +2 -1
- package/out/zero-server/src/adapters/kysely.d.ts.map +1 -1
- package/out/zero-server/src/adapters/kysely.js +8 -2
- package/out/zero-server/src/adapters/kysely.js.map +1 -1
- package/out/zero-server/src/adapters/pg.d.ts +1 -0
- package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
- package/out/zero-server/src/adapters/pg.js +8 -2
- package/out/zero-server/src/adapters/pg.js.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.d.ts +1 -0
- package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.js +7 -1
- package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
- package/out/zero-server/src/adapters/prisma.d.ts +3 -2
- package/out/zero-server/src/adapters/prisma.d.ts.map +1 -1
- package/out/zero-server/src/adapters/prisma.js +8 -2
- package/out/zero-server/src/adapters/prisma.js.map +1 -1
- package/out/zero-server/src/custom.d.ts +5 -1
- package/out/zero-server/src/custom.d.ts.map +1 -1
- package/out/zero-server/src/custom.js +6 -3
- package/out/zero-server/src/custom.js.map +1 -1
- package/out/zero-server/src/mod.d.ts +1 -1
- package/out/zero-server/src/mod.d.ts.map +1 -1
- package/out/zero-server/src/pg-query-executor.d.ts +2 -2
- package/out/zero-server/src/pg-query-executor.d.ts.map +1 -1
- package/out/zero-server/src/pg-query-executor.js +2 -2
- package/out/zero-server/src/pg-query-executor.js.map +1 -1
- package/out/zero-server/src/schema.d.ts +2 -2
- package/out/zero-server/src/schema.d.ts.map +1 -1
- package/out/zero-server/src/schema.js +2 -2
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-server/src/zql-database.d.ts +21 -1
- package/out/zero-server/src/zql-database.d.ts.map +1 -1
- package/out/zero-server/src/zql-database.js +33 -2
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-solid/src/solid-view.d.ts +10 -0
- package/out/zero-solid/src/solid-view.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.js +27 -0
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zql/src/ivm/array-view.d.ts +10 -0
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +20 -8
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/cap.d.ts.map +1 -1
- package/out/zql/src/ivm/cap.js +5 -3
- package/out/zql/src/ivm/cap.js.map +1 -1
- package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
- package/out/zql/src/ivm/deferred-input.js +3 -2
- package/out/zql/src/ivm/deferred-input.js.map +1 -1
- package/out/zql/src/ivm/exists.d.ts +1 -1
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.d.ts +2 -2
- package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-in.js +6 -5
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.d.ts +2 -2
- package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.d.ts +6 -6
- package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-operators.js +10 -8
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter.d.ts +2 -2
- package/out/zql/src/ivm/filter.d.ts.map +1 -1
- package/out/zql/src/ivm/filter.js +7 -4
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +2 -2
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +2 -2
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +9 -9
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +3 -4
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +9 -7
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +3 -3
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/mutate/custom.d.ts +24 -1
- package/out/zql/src/mutate/custom.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.js.map +1 -1
- package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator-registry.js +2 -2
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts +2 -0
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +55 -28
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +11 -1
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +1 -0
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query.d.ts +7 -1
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.d.ts +1 -0
- package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.js.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/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +7 -5
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +2 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-delegate-base.js","names":[],"sources":["../../../../../zql/src/query/query-delegate-base.ts"],"sourcesContent":["import {resolver} from '@rocicorp/resolver';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts';\nimport {\n hashOfAST,\n hashOfNameAndArgs,\n} from '../../../zero-protocol/src/query-hash.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {buildPipeline} from '../builder/builder.ts';\nimport {ArrayView} from '../ivm/array-view.ts';\nimport {DeferredInput} from '../ivm/deferred-input.ts';\nimport type {FilterInput} from '../ivm/filter-operators.ts';\nimport {MemoryStorage} from '../ivm/memory-storage.ts';\nimport type {Input, InputBase, Storage} from '../ivm/operator.ts';\nimport type {Source, SourceInput} from '../ivm/source.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport type {MetricMap} from './metrics-delegate.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {\n CommitListener,\n GotCallback,\n QueryDelegate,\n} from './query-delegate.ts';\nimport {asQueryInternals, type QueryInternals} from './query-internals.ts';\nimport type {\n HumanReadable,\n MaterializeOptions,\n PreloadOptions,\n Query,\n RunOptions,\n} from './query.ts';\nimport {DEFAULT_PRELOAD_TTL_MS, DEFAULT_TTL_MS, type TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\n/**\n * Base class that provides default implementations for common QueryDelegate methods.\n * Subclasses can override specific methods as needed.\n */\nexport abstract class QueryDelegateBase implements QueryDelegate {\n /**\n * Default implementation that just calls applyViewUpdates synchronously.\n * Override if you need custom batching behavior (e.g., SolidJS).\n */\n batchViewUpdates<T>(applyViewUpdates: () => T): T {\n return applyViewUpdates();\n }\n\n /**\n * Default implementation returns MemoryStorage.\n * Override if you need custom storage.\n */\n createStorage(): Storage {\n return new MemoryStorage();\n }\n\n /**\n * Default implementation calls materializeImpl.\n * Override if you need custom materialization behavior.\n */\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: undefined,\n options?: MaterializeOptions,\n ): TypedView<HumanReadable<TReturn>>;\n\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: ViewFactory<TTable, TSchema, TReturn, T>,\n options?: MaterializeOptions,\n ): T;\n\n /**\n * Materialize a query into a custom view using a provided factory function.\n */\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: ViewFactory<TTable, TSchema, TReturn, T>,\n options?: MaterializeOptions,\n ): T;\n\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: ViewFactory<TTable, TSchema, TReturn, T>,\n options?: MaterializeOptions,\n ): T {\n return materializeImpl(query, this, factory, options);\n }\n\n /**\n * Default implementation calls runImpl.\n * Override if you need custom query execution (e.g., TestPGQueryDelegate).\n */\n run<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n return runImpl(query, this, options);\n }\n\n /**\n * Default implementation calls preloadImpl.\n * Override if you need custom preload behavior.\n */\n preload<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n options?: PreloadOptions,\n ): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n return preloadImpl(query, this, options);\n }\n\n /**\n * Default no-op implementation for decorateSourceInput.\n * Override if you need to wrap or instrument source inputs.\n */\n decorateSourceInput(input: SourceInput, _queryID: string): Input {\n return input;\n }\n\n /**\n * Default no-op implementation for decorateInput.\n * Override if you need to wrap or instrument inputs.\n */\n decorateInput(input: Input, _name: string): Input {\n return input;\n }\n\n /**\n * Default no-op implementation for decorateFilterInput.\n * Override if you need to wrap or instrument filter inputs.\n */\n decorateFilterInput(input: FilterInput, _name: string): FilterInput {\n return input;\n }\n\n /**\n * Default no-op implementation for addEdge.\n * Override if you need to track graph edges (e.g., visualization).\n */\n addEdge(_source: InputBase, _dest: InputBase): void {\n // No-op\n }\n\n /**\n * Default no-op implementation for addMetric.\n * Override if you need to collect metrics.\n */\n addMetric<K extends keyof MetricMap>(\n _metric: K,\n _value: number,\n ..._args: MetricMap[K]\n ): void {\n // No-op\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to track server queries (e.g., ZeroContext, test delegates).\n */\n addServerQuery(_ast: AST, _ttl: TTL, _gotCallback?: GotCallback): () => void {\n return () => {};\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to track custom queries (e.g., ZeroContext, test delegates).\n */\n addCustomQuery(\n _ast: AST,\n _customQueryID: CustomQueryID,\n _ttl: TTL,\n _gotCallback?: GotCallback,\n ): () => void {\n return () => {};\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to handle query updates.\n */\n updateServerQuery(_ast: AST, _ttl: TTL): void {\n // No-op\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to handle custom query updates.\n */\n updateCustomQuery(_customQueryID: CustomQueryID, _ttl: TTL): void {\n // No-op\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to flush query changes.\n */\n flushQueryChanges(): void {\n // No-op\n }\n\n /**\n * Called when a transaction commits. Override to add custom behavior.\n * Default implementation returns a no-op cleanup function.\n */\n onTransactionCommit(_cb: CommitListener): () => void {\n return () => {};\n }\n\n /**\n * Validates run options. Override to add custom validation.\n * Default implementation is a no-op.\n */\n assertValidRunOptions(_options?: RunOptions): void {\n // No-op\n }\n\n abstract readonly defaultQueryComplete: boolean;\n\n /**\n * Default: pipelines can always be built immediately. Override (together\n * with `onPipelinesReady`) to defer pipeline construction.\n */\n get pipelinesReady(): boolean {\n return true;\n }\n\n onPipelinesReady(_cb: () => void): () => void {\n throw new Error(\n 'onPipelinesReady called on a delegate whose pipelines are always ready',\n );\n }\n\n // BuilderDelegate methods - must be implemented\n abstract getSource(name: string): Source | undefined;\n}\n\n// oxlint-disable-next-line require-await\nexport async function runImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n options?: RunOptions,\n): Promise<HumanReadable<TReturn>> {\n delegate.assertValidRunOptions(options);\n const v: TypedView<HumanReadable<TReturn>> = materializeImpl(\n query,\n delegate,\n undefined,\n {\n ttl: options?.ttl,\n },\n );\n if (options?.type === 'complete') {\n return new Promise(resolve => {\n v.addListener((data, type) => {\n if (type === 'complete') {\n v.destroy();\n resolve(data as HumanReadable<TReturn>);\n } else if (type === 'error') {\n v.destroy();\n resolve(Promise.reject(data));\n }\n });\n });\n }\n\n options?.type satisfies 'unknown' | undefined;\n\n const ret = v.data;\n v.destroy();\n return ret;\n}\n\nexport function preloadImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n options?: PreloadOptions,\n): {\n cleanup: () => void;\n complete: Promise<void>;\n} {\n const qi = asQueryInternals(query);\n const ttl = options?.ttl ?? DEFAULT_PRELOAD_TTL_MS;\n const {resolve, promise: complete} = resolver<void>();\n const {customQueryID, ast} = qi;\n if (customQueryID) {\n const cleanup = delegate.addCustomQuery(ast, customQueryID, ttl, got => {\n if (got) {\n resolve();\n }\n });\n return {\n cleanup,\n complete,\n };\n }\n\n const cleanup = delegate.addServerQuery(ast, ttl, got => {\n if (got) {\n resolve();\n }\n });\n return {\n cleanup,\n complete,\n };\n}\n\nexport function materializeImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n factory: ViewFactory<\n TTable,\n TSchema,\n TReturn,\n T\n // oxlint-disable-next-line no-explicit-any\n > = arrayViewFactory as any,\n options?: MaterializeOptions,\n): T {\n let ttl: TTL = options?.ttl ?? DEFAULT_TTL_MS;\n\n const qi = asQueryInternals(query);\n const {ast, format, customQueryID} = qi;\n\n const queryID = customQueryID\n ? hashOfNameAndArgs(customQueryID.name, customQueryID.args)\n : hashOfAST(qi.ast);\n const queryCompleteResolver = resolver<true>();\n // When the delegate cannot build pipelines yet, the view starts over an\n // empty DeferredInput and is hydrated later. A view must not report\n // `complete` until it has actually been hydrated, so completion is gated on\n // both the server's \"got\" and the pipeline being attached.\n const deferPipeline = !delegate.pipelinesReady;\n let attached = !deferPipeline;\n let gotQueries = delegate.defaultQueryComplete;\n let queryComplete: boolean | ErroredQuery = attached && gotQueries;\n const updateTTL = customQueryID\n ? (newTTL: TTL) => delegate.updateCustomQuery(customQueryID, newTTL)\n : (newTTL: TTL) => delegate.updateServerQuery(ast, newTTL);\n\n // Completion, and the end-to-end metric, require both the server's \"got\"\n // and the pipeline being attached: until then the view is still empty.\n const maybeResolveComplete = () => {\n if (attached && gotQueries && queryComplete !== true) {\n delegate.addMetric(\n 'query-materialization-end-to-end',\n performance.now() - t0,\n queryID,\n ast,\n );\n queryComplete = true;\n queryCompleteResolver.resolve(true);\n }\n };\n\n const gotCallback: GotCallback = (got, error) => {\n if (error) {\n queryCompleteResolver.reject(error);\n queryComplete = error;\n return;\n }\n\n if (got) {\n gotQueries = true;\n maybeResolveComplete();\n }\n };\n\n let removeCommitObserver: (() => void) | undefined;\n let removePendingAttach: (() => void) | undefined;\n const onDestroy = () => {\n removePendingAttach?.();\n removePendingAttach = undefined;\n input.destroy();\n removeCommitObserver?.();\n removeAddedQuery();\n };\n\n const t0 = performance.now();\n\n const removeAddedQuery = customQueryID\n ? delegate.addCustomQuery(ast, customQueryID, ttl, gotCallback)\n : delegate.addServerQuery(ast, ttl, gotCallback);\n\n const deferred = deferPipeline\n ? newDeferredInput(ast, delegate, queryID)\n : undefined;\n // No type annotation here: annotating this as `Input` widens it enough that\n // the view type loses the pipeline's concrete schema, and `Zero.run` then\n // stops rejecting a query built from a schema with legacy queries enabled\n // (custom.test.ts covers that rejection).\n const input = deferred ?? buildPipeline(ast, delegate, queryID);\n\n const view = delegate.batchViewUpdates(() =>\n (factory ?? arrayViewFactory)(\n query,\n input,\n format,\n onDestroy,\n cb => {\n removeCommitObserver = delegate.onTransactionCommit(cb);\n },\n queryComplete || queryCompleteResolver.promise,\n updateTTL,\n ),\n );\n\n if (!deferred) {\n delegate.addMetric(\n 'query-materialization-client',\n performance.now() - t0,\n queryID,\n );\n } else {\n // Registered after the factory ran so a throwing factory leaves nothing\n // behind.\n removePendingAttach = delegate.onPipelinesReady(() => {\n removePendingAttach = undefined;\n if (deferred.destroyed) {\n return;\n }\n const t1 = performance.now();\n try {\n deferred.attach();\n } catch (e) {\n // Surface the failure on this view and let the delegate decide how\n // to log it. Other pending pipelines are unaffected.\n const error: ErroredQuery = {\n error: 'app',\n id: queryID,\n name: customQueryID?.name ?? '',\n message: e instanceof Error ? e.message : String(e),\n };\n queryComplete = error;\n queryCompleteResolver.reject(error);\n throw e;\n }\n attached = true;\n delegate.addMetric(\n 'query-materialization-client',\n performance.now() - t1,\n queryID,\n );\n maybeResolveComplete();\n });\n }\n\n return view as T;\n}\n\n/**\n * Creates the placeholder input for a query whose pipeline cannot be built yet.\n *\n * `Input.getSchema()` is unconditional, so the placeholder needs the schema up\n * front. It is captured by building a pipeline and immediately destroying it:\n * building only connects to the sources, while the indexes and rows -- the\n * expensive part this deferral exists to postpone -- are read on the first\n * fetch. Measured at ~5us against ~500us for a single 100 row fetch.\n *\n * Building here also means a query that cannot be built at all (an unknown\n * table, `not(exists())` on the client) still throws from `materialize()`,\n * as it did before hydration was deferred.\n */\nfunction newDeferredInput(\n ast: AST,\n delegate: QueryDelegate,\n queryID: string,\n): DeferredInput {\n const build = () => buildPipeline(ast, delegate, queryID);\n const probe = build();\n try {\n return new DeferredInput(probe.getSchema(), build);\n } finally {\n probe.destroy();\n }\n}\n\nfunction arrayViewFactory<\n TTable extends string,\n TSchema extends Schema,\n TReturn,\n>(\n _query: QueryInternals<TTable, TSchema, TReturn>,\n input: Input,\n format: Format,\n onDestroy: () => void,\n onTransactionCommit: (cb: () => void) => void,\n queryComplete: true | ErroredQuery | Promise<true>,\n updateTTL: (ttl: TTL) => void,\n): TypedView<HumanReadable<TReturn>> {\n const v = new ArrayView<HumanReadable<TReturn>>(\n input,\n format,\n queryComplete,\n updateTTL,\n );\n v.onDestroy = onDestroy;\n onTransactionCommit(() => v.flush());\n return v;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-delegate-base.js","names":[],"sources":["../../../../../zql/src/query/query-delegate-base.ts"],"sourcesContent":["import {resolver} from '@rocicorp/resolver';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {ErroredQuery} from '../../../zero-protocol/src/custom-queries.ts';\nimport {\n hashOfAST,\n hashOfNameAndArgs,\n} from '../../../zero-protocol/src/query-hash.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {buildPipeline} from '../builder/builder.ts';\nimport {ArrayView} from '../ivm/array-view.ts';\nimport {DeferredInput} from '../ivm/deferred-input.ts';\nimport type {FilterInput} from '../ivm/filter-operators.ts';\nimport {MemoryStorage} from '../ivm/memory-storage.ts';\nimport type {Input, InputBase, Storage} from '../ivm/operator.ts';\nimport type {Source, SourceInput} from '../ivm/source.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport type {MetricMap} from './metrics-delegate.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {\n CommitListener,\n GotCallback,\n QueryDelegate,\n} from './query-delegate.ts';\nimport {asQueryInternals, type QueryInternals} from './query-internals.ts';\nimport type {\n HumanReadable,\n MaterializeOptions,\n PreloadOptions,\n Query,\n RunOptions,\n} from './query.ts';\nimport {DEFAULT_PRELOAD_TTL_MS, DEFAULT_TTL_MS, type TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\n/**\n * Base class that provides default implementations for common QueryDelegate methods.\n * Subclasses can override specific methods as needed.\n */\nexport abstract class QueryDelegateBase implements QueryDelegate {\n /**\n * Default implementation that just calls applyViewUpdates synchronously.\n * Override if you need custom batching behavior (e.g., SolidJS).\n */\n batchViewUpdates<T>(applyViewUpdates: () => T): T {\n return applyViewUpdates();\n }\n\n /**\n * Default implementation returns MemoryStorage.\n * Override if you need custom storage.\n */\n createStorage(): Storage {\n return new MemoryStorage();\n }\n\n /**\n * Default implementation calls materializeImpl.\n * Override if you need custom materialization behavior.\n */\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: undefined,\n options?: MaterializeOptions,\n ): TypedView<HumanReadable<TReturn>>;\n\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: ViewFactory<TTable, TSchema, TReturn, T>,\n options?: MaterializeOptions,\n ): T;\n\n /**\n * Materialize a query into a custom view using a provided factory function.\n */\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: ViewFactory<TTable, TSchema, TReturn, T>,\n options?: MaterializeOptions,\n ): T;\n\n materialize<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n >(\n query: Query<TTable, TSchema, TReturn>,\n factory?: ViewFactory<TTable, TSchema, TReturn, T>,\n options?: MaterializeOptions,\n ): T {\n return materializeImpl(query, this, factory, options);\n }\n\n /**\n * Default implementation calls runImpl.\n * Override if you need custom query execution (e.g., TestPGQueryDelegate).\n */\n run<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n return runImpl(query, this, options);\n }\n\n /**\n * Default implementation calls preloadImpl.\n * Override if you need custom preload behavior.\n */\n preload<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n options?: PreloadOptions,\n ): {\n cleanup: () => void;\n complete: Promise<void>;\n cached: Promise<void>;\n } {\n return preloadImpl(query, this, options);\n }\n\n /**\n * Default no-op implementation for decorateSourceInput.\n * Override if you need to wrap or instrument source inputs.\n */\n decorateSourceInput(input: SourceInput, _queryID: string): Input {\n return input;\n }\n\n /**\n * Default no-op implementation for decorateInput.\n * Override if you need to wrap or instrument inputs.\n */\n decorateInput(input: Input, _name: string): Input {\n return input;\n }\n\n /**\n * Default no-op implementation for decorateFilterInput.\n * Override if you need to wrap or instrument filter inputs.\n */\n decorateFilterInput(input: FilterInput, _name: string): FilterInput {\n return input;\n }\n\n /**\n * Default no-op implementation for addEdge.\n * Override if you need to track graph edges (e.g., visualization).\n */\n addEdge(_source: InputBase, _dest: InputBase): void {\n // No-op\n }\n\n /**\n * Default no-op implementation for addMetric.\n * Override if you need to collect metrics.\n */\n addMetric<K extends keyof MetricMap>(\n _metric: K,\n _value: number,\n ..._args: MetricMap[K]\n ): void {\n // No-op\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to track server queries (e.g., ZeroContext, test delegates).\n */\n addServerQuery(_ast: AST, _ttl: TTL, _gotCallback?: GotCallback): () => void {\n return () => {};\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to track custom queries (e.g., ZeroContext, test delegates).\n */\n addCustomQuery(\n _ast: AST,\n _customQueryID: CustomQueryID,\n _ttl: TTL,\n _gotCallback?: GotCallback,\n ): () => void {\n return () => {};\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to handle query updates.\n */\n updateServerQuery(_ast: AST, _ttl: TTL): void {\n // No-op\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to handle custom query updates.\n */\n updateCustomQuery(_customQueryID: CustomQueryID, _ttl: TTL): void {\n // No-op\n }\n\n /**\n * Default no-op implementation.\n * Override if you need to flush query changes.\n */\n flushQueryChanges(): void {\n // No-op\n }\n\n /**\n * Called when a transaction commits. Override to add custom behavior.\n * Default implementation returns a no-op cleanup function.\n */\n onTransactionCommit(_cb: CommitListener): () => void {\n return () => {};\n }\n\n /**\n * Validates run options. Override to add custom validation.\n * Default implementation is a no-op.\n */\n assertValidRunOptions(_options?: RunOptions): void {\n // No-op\n }\n\n abstract readonly defaultQueryComplete: boolean;\n\n /**\n * Default: pipelines can always be built immediately. Override (together\n * with `onPipelinesReady`) to defer pipeline construction.\n */\n get pipelinesReady(): boolean {\n return true;\n }\n\n onPipelinesReady(_cb: () => void): () => void {\n throw new Error(\n 'onPipelinesReady called on a delegate whose pipelines are always ready',\n );\n }\n\n // BuilderDelegate methods - must be implemented\n abstract getSource(name: string): Source | undefined;\n}\n\n// oxlint-disable-next-line require-await\nexport async function runImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n options?: RunOptions,\n): Promise<HumanReadable<TReturn>> {\n delegate.assertValidRunOptions(options);\n const v: TypedView<HumanReadable<TReturn>> = materializeImpl(\n query,\n delegate,\n undefined,\n {\n ttl: options?.ttl,\n },\n );\n if (options?.type === 'complete' || options?.type === 'cached') {\n // 'cached' is satisfied by a result the server confirmed on a previous\n // connection, or by this connection confirming it, whichever comes first.\n const acceptCached = options.type === 'cached';\n return new Promise(resolve => {\n v.addListener((data, type) => {\n if (type === 'complete' || (acceptCached && type === 'cached')) {\n v.destroy();\n resolve(data as HumanReadable<TReturn>);\n } else if (type === 'error') {\n v.destroy();\n resolve(Promise.reject(data));\n }\n });\n });\n }\n\n options?.type satisfies 'unknown' | undefined;\n\n const ret = v.data;\n v.destroy();\n return ret;\n}\n\nexport function preloadImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n options?: PreloadOptions,\n): {\n cleanup: () => void;\n complete: Promise<void>;\n cached: Promise<void>;\n} {\n const qi = asQueryInternals(query);\n const ttl = options?.ttl ?? DEFAULT_PRELOAD_TTL_MS;\n const completeResolver = resolver<void>();\n const cachedResolver = resolver<void>();\n const {promise: complete} = completeResolver;\n const {promise: cached} = cachedResolver;\n // A caller may ignore either promise; a query error must not surface as an\n // unhandled rejection through the one nobody awaits.\n void complete.catch(() => {});\n void cached.catch(() => {});\n const {customQueryID, ast} = qi;\n const gotCallback: GotCallback = (got, error) => {\n if (error) {\n // The query cannot be satisfied; neither waiter should hang.\n cachedResolver.reject(error);\n completeResolver.reject(error);\n return;\n }\n // Only a server confirmation on this connection resolves `complete`;\n // `cached` is also satisfied by one from a previous connection.\n if (got === true) {\n cachedResolver.resolve();\n completeResolver.resolve();\n } else if (got === 'cached') {\n cachedResolver.resolve();\n }\n };\n const cleanup = customQueryID\n ? delegate.addCustomQuery(ast, customQueryID, ttl, gotCallback)\n : delegate.addServerQuery(ast, ttl, gotCallback);\n if (delegate.defaultQueryComplete) {\n // A delegate whose results are complete from the start (a server-side\n // one) has no got callback to drive the waiters.\n cachedResolver.resolve();\n completeResolver.resolve();\n }\n return {\n cleanup,\n complete,\n cached,\n };\n}\n\nexport function materializeImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n T,\n>(\n query: Query<TTable, TSchema, TReturn>,\n delegate: QueryDelegate,\n factory: ViewFactory<\n TTable,\n TSchema,\n TReturn,\n T\n // oxlint-disable-next-line no-explicit-any\n > = arrayViewFactory as any,\n options?: MaterializeOptions,\n): T {\n let ttl: TTL = options?.ttl ?? DEFAULT_TTL_MS;\n\n const qi = asQueryInternals(query);\n const {ast, format, customQueryID} = qi;\n\n const queryID = customQueryID\n ? hashOfNameAndArgs(customQueryID.name, customQueryID.args)\n : hashOfAST(qi.ast);\n const queryCompleteResolver = resolver<true>();\n // When the delegate cannot build pipelines yet, the view starts over an\n // empty DeferredInput and is hydrated later. A view must not report\n // `complete` until it has actually been hydrated, so completion is gated on\n // both the server's \"got\" and the pipeline being attached.\n const deferPipeline = !delegate.pipelinesReady;\n let attached = !deferPipeline;\n // The last got report: `true` once the server confirmed the query on this\n // connection, `'cached'` while the store holds a previous connection's\n // confirmed result, `false` otherwise.\n let got: boolean | 'cached' = delegate.defaultQueryComplete;\n let queryComplete: boolean | ErroredQuery = attached && got === true;\n const updateTTL = customQueryID\n ? (newTTL: TTL) => delegate.updateCustomQuery(customQueryID, newTTL)\n : (newTTL: TTL) => delegate.updateServerQuery(ast, newTTL);\n\n // Completion, and the end-to-end metric, require both the server's \"got\"\n // and the pipeline being attached: until then the view is still empty.\n const maybeResolveComplete = () => {\n if (attached && got === true && queryComplete !== true) {\n delegate.addMetric(\n 'query-materialization-end-to-end',\n performance.now() - t0,\n queryID,\n ast,\n );\n queryComplete = true;\n queryCompleteResolver.resolve(true);\n }\n };\n\n // The view, seen as the optional cached-marking surface. Only views that\n // implement `markCached`/`unmarkCached` (e.g. ArrayView) surface 'cached';\n // for any other factory the optional calls are no-ops. The registration\n // path can report 'cached' synchronously, before the view below exists, so\n // this stays undefined until then and the mark is applied afterwards.\n let viewForCached: CachedMarkableView | undefined;\n\n // Like 'complete', 'cached' is a claim about the rows the view holds, so it\n // waits for the view to exist and its pipeline to be attached. Once the\n // server has confirmed the query on this connection, 'complete' supersedes\n // it and the mark is skipped.\n const maybeMarkCached = () => {\n // Only while the query is still incomplete: 'complete' supersedes the\n // mark, and an error that arrived before attach must not be preceded by\n // a 'cached' notification.\n if (attached && got === 'cached' && queryComplete === false) {\n viewForCached?.markCached?.();\n }\n };\n\n let destroyed = false;\n const gotCallback: GotCallback = (value, error) => {\n if (destroyed) {\n // The delegate may keep this callback registered for a while after\n // destroy (removals are deferred while mutations are pending); a dead\n // view must not be driven, nor its listeners fired.\n return;\n }\n if (error) {\n queryCompleteResolver.reject(error);\n queryComplete = error;\n return;\n }\n\n got = value;\n if (got === 'cached') {\n maybeMarkCached();\n } else if (got === false) {\n // The got key was deleted (eviction) before the server confirmed the\n // query on this connection.\n viewForCached?.unmarkCached?.();\n } else {\n maybeResolveComplete();\n }\n };\n\n let removeCommitObserver: (() => void) | undefined;\n let removePendingAttach: (() => void) | undefined;\n const onDestroy = () => {\n destroyed = true;\n removePendingAttach?.();\n removePendingAttach = undefined;\n input.destroy();\n removeCommitObserver?.();\n removeAddedQuery();\n };\n\n const t0 = performance.now();\n\n const removeAddedQuery = customQueryID\n ? delegate.addCustomQuery(ast, customQueryID, ttl, gotCallback)\n : delegate.addServerQuery(ast, ttl, gotCallback);\n\n const deferred = deferPipeline\n ? newDeferredInput(ast, delegate, queryID)\n : undefined;\n // No type annotation here: annotating this as `Input` widens it enough that\n // the view type loses the pipeline's concrete schema, and `Zero.run` then\n // stops rejecting a query built from a schema with legacy queries enabled\n // (custom.test.ts covers that rejection).\n const input = deferred ?? buildPipeline(ast, delegate, queryID);\n\n const view = delegate.batchViewUpdates(() =>\n (factory ?? arrayViewFactory)(\n query,\n input,\n format,\n onDestroy,\n cb => {\n removeCommitObserver = delegate.onTransactionCommit(cb);\n },\n queryComplete || queryCompleteResolver.promise,\n updateTTL,\n ),\n );\n\n if (!deferred) {\n delegate.addMetric(\n 'query-materialization-client',\n performance.now() - t0,\n queryID,\n );\n } else {\n // Registered after the factory ran so a throwing factory leaves nothing\n // behind.\n removePendingAttach = delegate.onPipelinesReady(() => {\n removePendingAttach = undefined;\n if (deferred.destroyed) {\n return;\n }\n const t1 = performance.now();\n try {\n deferred.attach();\n } catch (e) {\n // Surface the failure on this view and let the delegate decide how\n // to log it. Other pending pipelines are unaffected.\n const error: ErroredQuery = {\n error: 'app',\n id: queryID,\n name: customQueryID?.name ?? '',\n message: e instanceof Error ? e.message : String(e),\n };\n queryComplete = error;\n queryCompleteResolver.reject(error);\n throw e;\n }\n attached = true;\n delegate.addMetric(\n 'query-materialization-client',\n performance.now() - t1,\n queryID,\n );\n maybeResolveComplete();\n maybeMarkCached();\n });\n }\n\n viewForCached = view as CachedMarkableView;\n maybeMarkCached();\n\n return view as T;\n}\n\n/**\n * Creates the placeholder input for a query whose pipeline cannot be built yet.\n *\n * `Input.getSchema()` is unconditional, so the placeholder needs the schema up\n * front. It is captured by building a pipeline and immediately destroying it:\n * building only connects to the sources, while the indexes and rows -- the\n * expensive part this deferral exists to postpone -- are read on the first\n * fetch. Measured at ~5us against ~500us for a single 100 row fetch.\n *\n * Building here also means a query that cannot be built at all (an unknown\n * table, `not(exists())` on the client) still throws from `materialize()`,\n * as it did before hydration was deferred.\n */\nfunction newDeferredInput(\n ast: AST,\n delegate: QueryDelegate,\n queryID: string,\n): DeferredInput {\n const build = () => buildPipeline(ast, delegate, queryID);\n const probe = build();\n try {\n return new DeferredInput(probe.getSchema(), build);\n } finally {\n probe.destroy();\n }\n}\n\n/**\n * The optional surface a view exposes to be marked 'cached'. Views that do\n * not implement it (custom factories) simply never surface the state.\n */\ntype CachedMarkableView = {\n markCached?: (() => void) | undefined;\n unmarkCached?: (() => void) | undefined;\n};\n\nfunction arrayViewFactory<\n TTable extends string,\n TSchema extends Schema,\n TReturn,\n>(\n _query: QueryInternals<TTable, TSchema, TReturn>,\n input: Input,\n format: Format,\n onDestroy: () => void,\n onTransactionCommit: (cb: () => void) => void,\n queryComplete: true | ErroredQuery | Promise<true>,\n updateTTL: (ttl: TTL) => void,\n): TypedView<HumanReadable<TReturn>> {\n const v = new ArrayView<HumanReadable<TReturn>>(\n input,\n format,\n queryComplete,\n updateTTL,\n );\n v.onDestroy = onDestroy;\n onTransactionCommit(() => v.flush());\n return v;\n}\n"],"mappings":"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"}
|
|
@@ -9,7 +9,16 @@ import type { HumanReadable, MaterializeOptions, PreloadOptions, Query, RunOptio
|
|
|
9
9
|
import type { TTL } from './ttl.ts';
|
|
10
10
|
import type { TypedView } from './typed-view.ts';
|
|
11
11
|
export type CommitListener = () => void;
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* `got` reports what the client knows about the query's server result:
|
|
14
|
+
* - `true`: the server confirmed the complete result on this connection.
|
|
15
|
+
* - `false`: the result is not (or no longer) known to be complete.
|
|
16
|
+
* - `'cached'`: the store holds the server-confirmed complete result from a
|
|
17
|
+
* previous session (the persisted got-queries key exists and the server has
|
|
18
|
+
* not yet reconciled the got set on this connection). Never satisfies
|
|
19
|
+
* complete-waiters — freshness stays a promise only the connection can keep.
|
|
20
|
+
*/
|
|
21
|
+
export type GotCallback = (got: boolean | 'cached', error?: ErroredQuery) => void;
|
|
13
22
|
export interface NewQueryDelegate {
|
|
14
23
|
newQuery<TTable extends keyof TSchema['tables'] & string, TSchema extends Schema, TReturn>(schema: TSchema, table: TTable, ast: AST, format: Format): Query<TTable, TSchema, TReturn>;
|
|
15
24
|
}
|
|
@@ -83,6 +92,7 @@ export interface QueryDelegate extends BuilderDelegate, MetricsDelegate {
|
|
|
83
92
|
preload<TTable extends keyof TSchema['tables'] & string, TSchema extends Schema, TReturn>(query: Query<TTable, TSchema, TReturn>, options?: PreloadOptions): {
|
|
84
93
|
cleanup: () => void;
|
|
85
94
|
complete: Promise<void>;
|
|
95
|
+
cached: Promise<void>;
|
|
86
96
|
};
|
|
87
97
|
}
|
|
88
98
|
//# sourceMappingURL=query-delegate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-delegate.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-delegate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,8CAA8C,CAAC;AAC/E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAC9D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,KAAK,EACL,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE/C,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC;AACxC,MAAM,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"query-delegate.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ export declare class QueryImpl<TTable extends keyof TSchema['tables'] & string,
|
|
|
31
31
|
preload(_options?: PreloadOptions): {
|
|
32
32
|
cleanup: () => void;
|
|
33
33
|
complete: Promise<void>;
|
|
34
|
+
cached: Promise<void>;
|
|
34
35
|
};
|
|
35
36
|
materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;
|
|
36
37
|
materialize<T>(factory: ViewFactory<TTable, TSchema, TReturn, T>, ttl?: TTL): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-impl.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-impl.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"query-impl.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query-impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-impl.js","names":["#schema","#tableName","#ast","#system","#currentJunction","#newQuery","#transitions","#record","#parent","#derive","#hash","#canonicalize","#byHash","#sameAs","#deriveBounded","#expressionBuilder","#exists"],"sources":["../../../../../zql/src/query/query-impl.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\nimport {assert} from '../../../shared/src/asserts.ts';\nimport {\n deepEqual,\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n} from '../../../shared/src/json.ts';\nimport {\n type AST,\n type CompoundKey,\n type Condition,\n type NormalizedAST,\n type Parameter,\n type LiteralValue,\n type SimpleCondition,\n type SimpleOperator,\n type System,\n insertRelated,\n normalizeAST,\n normalizeCondition,\n normalizedRelated,\n SUBQ_PREFIX,\n tableAST,\n} from '../../../zero-protocol/src/ast.ts';\nimport {hashOfQueryInternals} from '../../../zero-protocol/src/query-hash-visitor.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {NotImplementedError} from '../error.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport {\n type ExpressionFactory,\n ExpressionBuilder,\n and,\n cmp,\n simplifyCondition,\n} from './expression.ts';\nimport type {CustomQueryID} from './named.ts';\nimport {type QueryInternals, queryInternalsTag} from './query-internals.ts';\nimport {\n HashIndex,\n Transitions,\n type Delta,\n type TransitionValue,\n} from './query-transitions.ts';\nimport type {\n AnyQuery,\n ExistsOptions,\n GetFilterType,\n HumanReadable,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\ntype GetFilterTypeAny = GetFilterType<any, any, any>;\n\ntype NewQueryFunction<TSchema extends Schema> = <\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n>(\n this: unknown,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n) => QueryImpl<TTable, TSchema, TReturn>;\n\nexport function newQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(schema: TSchema, table: TTable): Query<TTable, TSchema> {\n return newQueryInternal(\n schema,\n table,\n tableAST(table),\n defaultFormat,\n 'client',\n );\n}\n\nexport function newQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System,\n): QueryImpl<TTable, TSchema, TReturn> {\n // This is the entry point for ASTs that were not built by QueryImpl, so\n // normalize it here to establish the invariant that #ast is normalized.\n return newQueryInternal(schema, tableName, normalizeAST(ast), format, system);\n}\n\n/**\n * Root queries are interned per schema so that two `createBuilder(schema)` calls\n * hand out the same starting point, and therefore share the whole transition\n * tree below it. Only cleared entries accumulate here, at most one per\n * system/table pair, so no sweeping is needed.\n */\nconst rootsBySchema = new WeakMap<\n Schema,\n Map<string, WeakRef<QueryImpl<any, any, any>>>\n>();\n\n/**\n * Whether this is the AST `tableAST(tableName)` produces -- the whole table,\n * nothing else. A normalized AST carries every field, so this cannot be a key\n * count; each one has to be checked.\n */\nfunction isRootAST(ast: NormalizedAST, tableName: string): boolean {\n return (\n ast.table === tableName &&\n ast.schema === undefined &&\n ast.alias === undefined &&\n ast.where === undefined &&\n ast.related === undefined &&\n ast.start === undefined &&\n ast.limit === undefined &&\n ast.orderBy === undefined\n );\n}\n\nfunction newQueryInternal<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n system: System,\n): QueryImpl<TTable, TSchema, TReturn> {\n // Callers that hand in a pre-built AST -- benchmarks and the integration-test\n // harnesses -- are not roots and are not interned.\n const interned = format === defaultFormat && isRootAST(ast, tableName);\n const key = `${system}:${tableName}`;\n let roots: Map<string, WeakRef<QueryImpl<any, any, any>>> | undefined;\n\n if (interned) {\n roots = rootsBySchema.get(schema);\n const existing = roots?.get(key)?.deref();\n if (existing) {\n return existing as QueryImpl<TTable, TSchema, TReturn>;\n }\n }\n\n const inner: NewQueryFunction<TSchema> = (\n tableName,\n ast,\n format,\n customQueryID,\n currentJunction,\n ) =>\n new QueryImpl(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n inner,\n );\n\n const created = inner<TTable, TReturn>(\n tableName,\n ast,\n format,\n undefined,\n undefined,\n );\n\n if (interned) {\n if (!roots) {\n roots = new Map();\n rootsBySchema.set(schema, roots);\n }\n roots.set(key, new WeakRef(created));\n }\n\n return created;\n}\n\n/**\n * The AST of a QueryImpl is always normalized. Each step builds its AST in\n * normalized form rather than normalizing afterwards: a normalized AST has\n * every field, so spreading one and replacing a field keeps the field order\n * intact, and only the field a step actually changes needs normalizing (the\n * conditions of a `where`, the position of a new `related`). The ASTs that\n * come in from the outside are normalized by {@link newQueryImpl}, which is\n * what the `NormalizedAST` of the AST it holds stands for.\n */\nexport class QueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n implements\n Query<TTable, TSchema, TReturn>,\n QueryInternals<TTable, TSchema, TReturn>\n{\n readonly [queryInternalsTag] = true;\n\n readonly #schema: TSchema;\n readonly #tableName: TTable;\n readonly #ast: NormalizedAST;\n readonly format: Format;\n #hash: string = '';\n readonly #system: System;\n readonly #currentJunction: string | undefined;\n readonly customQueryID: CustomQueryID | undefined;\n readonly #newQuery: NewQueryFunction<TSchema>;\n\n /**\n * The query this one was derived from, held *strongly*, and the queries\n * derived from this one, held *weakly*. This is the arrangement V8 uses for\n * hidden-class transitions, and it is what makes interning stable: as long as\n * a query is reachable its whole ancestor spine is too, so re-deriving it from\n * the root yields the same instance. See `query-transitions.ts`.\n */\n #parent: QueryImpl<any, any, any> | undefined;\n #transitions: Transitions<QueryImpl<any, any, any>> | undefined;\n\n /**\n * The second level of interning, keyed by hash; see `HashIndex`. Set on the\n * root only, which is what scopes it to one schema and one delegate.\n */\n #byHash: HashIndex<QueryImpl<any, any, any>> | undefined;\n\n /**\n * Memoized because a query is interned: the same node serves every rebuild of\n * a chain, so building this once rather than per `where(fn)` call takes the\n * whole thing -- the builder and the bound `#exists` -- off the repeat path.\n */\n #expressionBuilder: ExpressionBuilder<TTable, TSchema> | undefined;\n\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n system: System,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n newQuery: NewQueryFunction<TSchema>,\n ) {\n this.#schema = schema;\n this.#tableName = tableName;\n this.#ast = ast;\n this.format = format;\n this.#system = system;\n this.#currentJunction = currentJunction;\n this.customQueryID = customQueryID;\n this.#newQuery = newQuery;\n }\n\n /**\n * Interns a transition whose key space is finite and schema-derived; see\n * {@linkcode Transitions.storeBounded}. Used for the base sub-query handed to\n * a `related`/`exists` callback, which is determined entirely by the\n * relationship name.\n */\n #deriveBounded<T>(key: string, build: () => T): T {\n const existing = this.#transitions?.lookupBounded(key);\n if (existing !== undefined) {\n return existing as T;\n }\n return this.#record(key, undefined, undefined, build(), true);\n }\n\n /**\n * Interns the result of applying a builder operation to this query.\n *\n * `key` names the operation and `value` carries its varying argument, kept\n * apart so the key stays a string V8 has already hashed. When the two do not\n * settle it, `delta` carries the rest and is compared with `deepEqual`. Only\n * the delta is compared, never the whole AST: this query is already canonical,\n * so two of its children are equal exactly when the operations that produced\n * them are.\n *\n * `T` is deliberately unconstrained so that the contextual return type at each\n * call site still drives `#newQuery`'s inference, exactly as it did when the\n * call sites returned `this.#newQuery(...)` directly.\n */\n #derive<T>(\n key: string,\n value: TransitionValue,\n delta: Delta,\n build: () => T,\n ): T {\n const existing = this.#transitions?.lookup(key, value, delta);\n if (existing !== undefined) {\n return existing as T;\n }\n return this.#record(key, value, delta, build(), false);\n }\n\n #record<T>(\n key: string,\n value: TransitionValue,\n delta: Delta,\n created: T,\n bounded: boolean,\n ): T {\n const q = created as unknown as QueryImpl<any, any, any>;\n q.#parent = this;\n const transitions = (this.#transitions ??= new Transitions());\n if (bounded) {\n transitions.storeBounded(key, q);\n } else {\n transitions.store(key, value, delta, q);\n }\n return created;\n }\n\n run(_options?: RunOptions): Promise<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n preload(_options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n throwQueryNotRunnable();\n }\n\n materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n materialize<T>(\n _factoryOrTTL?: ViewFactory<TTable, TSchema, TReturn, T> | TTL,\n _ttl?: TTL,\n ): T | TypedView<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn> {\n return this.#derive('nameAndArgs', name, args, () =>\n this.#newQuery(\n this.#tableName,\n this.#ast,\n this.format,\n {\n name,\n args,\n },\n this.#currentJunction,\n ),\n );\n }\n\n hash(): string {\n if (!this.#hash) {\n this.#hash = hashOfQueryInternals(\n this.#ast,\n this.format,\n this.#system,\n this.#currentJunction,\n this.customQueryID?.name,\n this.customQueryID?.args,\n );\n this.#canonicalize();\n }\n return this.#hash;\n }\n\n /**\n * Folds this query into its root's hash index, now that its hash is known.\n *\n * If an equal query is already indexed, the transition that produced this\n * one is re-pointed at it, so the next rebuild along this path yields that\n * instance rather than a second copy. This query itself is left alone: its\n * identity has already been handed out. Content is verified with `#sameAs`\n * before anything is redirected, so a hash collision costs nothing worse\n * than a missed unification.\n */\n #canonicalize(): void {\n const parent = this.#parent;\n if (parent === undefined) {\n // A root has no path to redirect and is its own canonical form.\n return;\n }\n let root = parent;\n while (root.#parent !== undefined) {\n root = root.#parent;\n }\n const index = (root.#byHash ??= new HashIndex());\n const existing = index.get(this.#hash);\n if (existing === undefined) {\n index.set(this.#hash, this);\n } else if (existing !== this && this.#sameAs(existing)) {\n parent.#transitions?.replace(this, existing);\n }\n }\n\n /**\n * Whether `other` is interchangeable with this query: everything `hash()`\n * covers, compared structurally. Schema and delegate are not compared. Both\n * are fixed by the root, and this only ever compares queries under one root.\n */\n #sameAs(other: QueryImpl<any, any, any>): boolean {\n return (\n this.#system === other.#system &&\n this.#currentJunction === other.#currentJunction &&\n this.customQueryID?.name === other.customQueryID?.name &&\n deepEqual(this.customQueryID?.args, other.customQueryID?.args) &&\n deepEqual(this.format, other.format) &&\n deepEqual(this.#ast, other.#ast)\n );\n }\n\n one(): Query<TTable, TSchema, TReturn | undefined> {\n return this.#derive('one', undefined, undefined, () =>\n this.#newQuery(\n this.#tableName,\n {...this.#ast, limit: 1},\n {\n ...this.format,\n singular: true,\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n whereExists(\n relationship: string,\n cbOrOptions?: ((q: AnyQuery) => AnyQuery) | ExistsOptions,\n options?: ExistsOptions,\n ): Query<TTable, TSchema, TReturn> {\n const cb = typeof cbOrOptions === 'function' ? cbOrOptions : undefined;\n const opts = typeof cbOrOptions === 'function' ? options : cbOrOptions;\n return this.where(({exists}) => exists(relationship, cb, opts)) as Query<\n TTable,\n TSchema,\n TReturn\n >;\n }\n\n related(\n relationship: string,\n cb?: (q: AnyQuery) => AnyQuery,\n ): Query<TTable, TSchema, any> {\n if (relationship.startsWith(SUBQ_PREFIX)) {\n throw new Error(\n `Relationship names may not start with \"${SUBQ_PREFIX}\". That is a reserved prefix.`,\n );\n }\n cb = cb ?? (q => q);\n\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n if (isOneHop(related)) {\n const {destSchema, destField, sourceField, cardinality} = related[0];\n // Intern the base handed to the callback too. A deterministic callback\n // then walks the same interned chain and hands back the *same* sub-query,\n // which makes the comparison below a pointer compare.\n const q: AnyQuery = this.#deriveBounded(\n `relatedBase:${relationship}`,\n () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, relationship),\n {\n relationships: {},\n singular: cardinality === 'one',\n },\n this.customQueryID,\n undefined,\n ),\n ) as AnyQuery;\n // Intentionally not setting to `one` as it is a perf degradation\n // and the user should not be making the mistake of setting cardinality to\n // `one` when it is actually not.\n // if (cardinality === 'one') {\n // q = q.one();\n // }\n const subQuery = asQueryImpl(cb(q));\n assert(\n isCompoundKey(sourceField),\n 'The source of a relationship must specify at last 1 field',\n );\n assert(\n isCompoundKey(destField),\n 'The destination of a relationship must specify at last 1 field',\n );\n assert(\n sourceField.length === destField.length,\n 'The source and destination of a relationship must have the same number of fields',\n );\n\n // Keyed by the sub-query's identity. Each query owns its AST object, so\n // this distinguishes even `q.one()` from `q.limit(1)`, whose ASTs are\n // structurally equal but whose formats differ. Comparing them as a delta\n // instead would put every sibling under one key and scan.\n return this.#derive(\n relatedKey(relationship),\n astID(subQuery.#ast),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: insertRelated(this.#ast.related, {\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n system: this.#system,\n }),\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: subQuery.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n ) as AnyQuery;\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const sq = asQueryImpl(\n cb(\n this.#deriveBounded(`relatedBase:${relationship}`, () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, relationship),\n {\n relationships: {},\n singular: secondRelation.cardinality === 'one',\n },\n this.customQueryID,\n relationship,\n ),\n ) as AnyQuery,\n ),\n );\n\n // Bound to consts so the `isCompoundKey` narrowing survives into the\n // closure below; TypeScript drops narrowing of property accesses there.\n const {sourceField: firstSource, destField: firstDest} = firstRelation;\n const {sourceField: secondSource, destField: secondDest} = secondRelation;\n assert(isCompoundKey(firstSource), 'Invalid relationship');\n assert(isCompoundKey(firstDest), 'Invalid relationship');\n assert(isCompoundKey(secondSource), 'Invalid relationship');\n assert(isCompoundKey(secondDest), 'Invalid relationship');\n\n return this.#derive(\n relatedKey(relationship),\n astID(sq.#ast),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: insertRelated(this.#ast.related, {\n correlation: {\n parentField: firstSource,\n childField: firstDest,\n },\n hidden: true,\n subquery: {\n ...tableAST(junctionSchema, relationship),\n // A single subquery is sorted.\n related: [\n normalizedRelated({\n correlation: {\n parentField: secondSource,\n childField: secondDest,\n },\n subquery: sq.#ast,\n system: this.#system,\n }),\n ],\n },\n system: this.#system,\n }),\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: sq.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n ) as AnyQuery;\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n }\n\n // The declared return is the *bottom* of the pinned dimension, which is\n // assignable to every `where` overload's declared return. The overloads\n // refine `TPinned` for callers only; a single non-generic implementation\n // signature cannot express that refinement.\n where(\n fieldOrExpressionFactory: string | ExpressionFactory<TTable, TSchema>,\n opOrValue?: SimpleOperator | GetFilterTypeAny | Parameter,\n value?: GetFilterTypeAny | Parameter,\n ): Query<TTable, TSchema, TReturn, any> {\n let cond: Condition;\n\n if (typeof fieldOrExpressionFactory === 'function') {\n cond = fieldOrExpressionFactory(this.expressionBuilder());\n } else {\n assert(arguments.length >= 2, 'Invalid condition. Too few arguments.');\n // Distinguish between 2-arg form (field, value) and 3-arg form (field, op, value)\n // using arguments.length to allow explicit undefined in 3-arg form.\n const twoArg = arguments.length === 2;\n const op = (twoArg ? '=' : opOrValue) as SimpleOperator;\n const raw = twoArg ? opOrValue : value;\n\n // Comparing a column to a primitive is by far the most common thing anyone\n // does with a query, and the transition it names is fully determined by\n // (column, op, value) -- so check for it before building anything. On a hit\n // this returns without allocating the `Condition` at all. Objects are\n // excluded, which covers both parameter references and `IN` arrays; `cmp`\n // maps a missing value to null, so this must too.\n if (raw === null || typeof raw !== 'object') {\n const hit = this.#transitions?.lookup(\n whereKey(fieldOrExpressionFactory, op),\n (raw ?? null) as TransitionValue,\n undefined,\n );\n if (hit !== undefined) {\n return hit as unknown as Query<TTable, TSchema, TReturn, any>;\n }\n }\n\n cond = twoArg\n ? cmp(fieldOrExpressionFactory, opOrValue)\n : cmp(fieldOrExpressionFactory, opOrValue, value);\n }\n\n // The delta is the condition as built here, *before* it is merged with the\n // existing where and normalized. Both steps are deterministic and the\n // existing where is fixed by this query, so an equal `cond` always produces\n // an equal result.\n //\n // A simple comparison against a column splits cleanly: the column and\n // operator come from a small fixed set and give a memoized, stable key,\n // while the compared value -- the part that varies per call -- is handed\n // through as the transition value and never concatenated into a string.\n let key: string;\n let tValue: TransitionValue;\n let delta: Delta = cond;\n if (cond.type === 'simple' && cond.left.type === 'column') {\n key = whereKey(cond.left.name, cond.op);\n const right = cond.right;\n tValue =\n right.type === 'literal' && isPrimitive(right.value)\n ? right.value\n : rightTag(right);\n delta = undefined;\n } else {\n // A sub-query an `exists` correlates to is itself interned, so its\n // identity settles that part of the tree without walking it.\n const exact = condKey(cond);\n if (exact === undefined) {\n key = treeKey(cond);\n } else {\n key = 'where:tree';\n tValue = exact;\n delta = undefined;\n }\n }\n\n return this.#derive(key, tValue, delta, () => {\n const existingWhere = this.#ast.where;\n const merged = existingWhere ? and(existingWhere, cond) : cond;\n return this.#newQuery(\n this.#tableName,\n {...this.#ast, where: normalizeCondition(simplifyCondition(merged))},\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n }) as unknown as Query<TTable, TSchema, TReturn, any>;\n }\n\n start(\n row: Partial<Record<string, ReadonlyJSONValue | undefined>>,\n opts?: {inclusive: boolean},\n ): Query<TTable, TSchema, TReturn> {\n // The row is an object, so it is encoded to a string to serve as the\n // lookup key. Property order is part of that string.\n return this.#derive(\n opts?.inclusive ? 'start:inclusive' : 'start:exclusive',\n valueTag(row as ReadonlyJSONValue),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n start: {\n row,\n exclusive: !opts?.inclusive,\n },\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n limit(limit: number): Query<TTable, TSchema, TReturn> {\n if (limit < 0) {\n throw new Error('Limit must be non-negative');\n }\n if ((limit | 0) !== limit) {\n throw new Error('Limit must be an integer');\n }\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Limit is not supported in junction relationships yet. Junction relationship being limited: ' +\n this.#currentJunction,\n );\n }\n\n return this.#derive('limit', limit, undefined, () =>\n this.#newQuery(\n this.#tableName,\n {...this.#ast, limit},\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n orderBy<TSelector extends keyof TSchema['tables'][TTable]['columns']>(\n field: TSelector,\n direction: 'asc' | 'desc',\n ): Query<TTable, TSchema, TReturn> {\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Order by is not supported in junction relationships yet. Junction relationship being ordered: ' +\n this.#currentJunction,\n );\n }\n return this.#derive(\n direction === 'asc' ? 'orderBy:asc' : 'orderBy:desc',\n field as string,\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n orderBy: [\n ...(this.#ast.orderBy ?? []),\n [field as string, direction],\n ],\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n #exists(\n relationship: string,\n cb: ((query: AnyQuery) => AnyQuery) | undefined,\n options?: ExistsOptions,\n ): Condition {\n cb = cb ?? (q => q);\n const flip = options?.flip;\n const scalar = options?.scalar;\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n\n if (isOneHop(related)) {\n const {destSchema: destTableName, sourceField, destField} = related[0];\n assert(isCompoundKey(sourceField), 'Invalid relationship');\n assert(isCompoundKey(destField), 'Invalid relationship');\n\n const subQuery = asQueryImpl(\n cb(\n this.#deriveBounded(`existsBase:${relationship}`, () =>\n this.#newQuery(\n destTableName,\n tableAST(destTableName, `${SUBQ_PREFIX}${relationship}`),\n defaultFormat,\n this.customQueryID,\n undefined,\n ),\n ) as AnyQuery,\n ),\n );\n // Give the sub-query's AST an id so the enclosing `where` can key on it\n // exactly rather than comparing the sub-tree.\n astID(subQuery.#ast);\n // Unlike the entries of `related`, the correlated subqueries of a\n // condition keep the order their fields are written in: normalization\n // does not reorder them either.\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n };\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(firstRelation.destField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.destField), 'Invalid relationship');\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const queryToDest = cb(\n this.#deriveBounded(`existsJunctionBase:${relationship}`, () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, `${SUBQ_PREFIX}zhidden_${relationship}`),\n defaultFormat,\n this.customQueryID,\n relationship,\n ),\n ) as AnyQuery,\n );\n\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: firstRelation.sourceField,\n childField: firstRelation.destField,\n },\n subquery: {\n ...tableAST(junctionSchema, `${SUBQ_PREFIX}${relationship}`),\n // A single condition needs no flattening or sorting, but the node\n // itself still has to be rebuilt into the canonical field order.\n where: normalizeCondition({\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: secondRelation.sourceField,\n childField: secondRelation.destField,\n },\n subquery: asQueryImpl(queryToDest).#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n }),\n },\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n };\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n }\n\n get ast(): NormalizedAST {\n return this.#ast;\n }\n\n expressionBuilder(): ExpressionBuilder<TTable, TSchema> {\n // Built on demand rather than held as an eagerly initialized field: a field\n // would cost a closure on every query constructed, where this costs one only\n // for queries that actually use an expression factory.\n return (this.#expressionBuilder ??= new ExpressionBuilder<TTable, TSchema>(\n this.#exists.bind(this) as ConstructorParameters<\n typeof ExpressionBuilder<TTable, TSchema>\n >[0],\n ));\n }\n}\n\nexport function asQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(q: Query<TTable, TSchema, TReturn>): QueryImpl<TTable, TSchema, TReturn> {\n assert(q instanceof QueryImpl, 'Expected QueryImpl instance');\n return q;\n}\n\n/**\n * A stable id per query AST.\n *\n * Every `QueryImpl` allocates its own AST object, so these are one-to-one with\n * queries, and interning makes the object identity stable across rebuilds. That\n * lets a `related` or `exists` transition key on *which* sub-query it points at\n * rather than comparing the sub-tree.\n *\n * Assigned only where it is needed. A `WeakMap.set` costs on the order of a\n * hundred nanoseconds, so doing this for every query rather than for the few\n * that are sub-queries was one of the largest single costs of building a query\n * from cold. ASTs that never pass through here -- including the junction AST a\n * two-hop `exists` builds inline -- are absent, and fall back to a delta.\n */\nconst astIDs = new WeakMap<AST, number>();\nlet nextASTID = 0;\n\nfunction astID(ast: AST): number {\n let id = astIDs.get(ast);\n if (id === undefined) {\n id = ++nextASTID;\n astIDs.set(ast, id);\n }\n return id;\n}\n\n/**\n * Memoized transition keys.\n *\n * A transition key must be a string V8 has already hashed, or the `Map` lookup\n * has to hash it from scratch -- measured at ~148ns against ~10ns, which dwarfs\n * everything else a lookup does. Both tables are keyed by schema-derived names,\n * so they are bounded by the schema.\n */\nconst whereKeys = new Map<string, Map<string, string>>();\n\nfunction whereKey(column: string, op: string): string {\n let byOp = whereKeys.get(column);\n if (byOp === undefined) {\n byOp = new Map();\n whereKeys.set(column, byOp);\n }\n let key = byOp.get(op);\n if (key === undefined) {\n key = `where:${column}:${op}`;\n byOp.set(op, key);\n }\n return key;\n}\n\nconst relatedKeys = new Map<string, string>();\n\nfunction relatedKey(relationship: string): string {\n let key = relatedKeys.get(relationship);\n if (key === undefined) {\n key = `related:${relationship}`;\n relatedKeys.set(relationship, key);\n }\n return key;\n}\n\nfunction isPrimitive(v: LiteralValue): v is string | number | boolean | null {\n return v === null || typeof v !== 'object';\n}\n\n/**\n * Folds a JSON value into a self-delimiting token: a string is\n * length-prefixed, a number is terminated, an array or object is\n * count-prefixed and encodes its members recursively, and the rest are fixed\n * width. Tokens can therefore be concatenated into a key with no way for one\n * to run into the next, and the leading tag keeps `'1'` and `1` apart.\n *\n * Not `JSON.stringify`: it writes `Infinity`, `NaN` and `null` all as `null`,\n * and this token is trusted as exact, so a nested value that serialized like\n * another's would hand back a query with the wrong value in its AST. Numbers\n * are written the way `String` writes them, which keeps those apart. An\n * `undefined` property is skipped, as `deepEqual` would skip it; property\n * order is part of the encoding, so an object spelled in another order\n * interns separately.\n */\nfunction valueTag(v: ReadonlyJSONValue): string {\n switch (typeof v) {\n case 'string':\n return `:s${enc(v)}`;\n case 'number':\n return `:n${v};`;\n case 'boolean':\n return v ? ':t' : ':f';\n default: {\n if (v === null) {\n return ':z';\n }\n if (Array.isArray(v)) {\n let out = `:a${v.length}:`;\n for (const e of v) {\n out += valueTag(e);\n }\n return out;\n }\n // `Array.isArray` does not narrow a readonly array out of the union.\n const o = v as ReadonlyJSONObject;\n let body = '';\n let n = 0;\n for (const key in o) {\n const e = o[key];\n if (e !== undefined && Object.hasOwn(o, key)) {\n body += enc(key) + valueTag(e);\n n++;\n }\n }\n return `:o${n}:${body}`;\n }\n }\n}\n\n/**\n * Folds the right-hand side of a simple condition into a transition value, so\n * that the transition is exact and the lookup needs no comparison at all.\n *\n * Arrays (`IN`) and parameter references are encoded in full: that is one\n * pass over a small value, where leaving them in the delta would instead cost\n * a `deepEqual` over the whole condition for every sibling a lookup walks\n * past.\n */\nfunction rightTag(right: SimpleCondition['right']): string {\n if (right.type !== 'literal') {\n return `:p${valueTag(right as unknown as ReadonlyJSONValue)}`;\n }\n return valueTag(right.value);\n}\n\n/**\n * Length-prefixes a free-form string so it can be concatenated into a key\n * without a separator being ambiguous with the content.\n */\nfunction enc(s: string): string {\n return `${s.length}:${s}`;\n}\n\n/** Encodes an optional boolean without collapsing `undefined` into `false`. */\nfunction tri(b: boolean | undefined): string {\n return b === undefined ? '-' : b ? 't' : 'f';\n}\n\n/**\n * An exact key for a whole condition tree, or `undefined` for a shape we cannot\n * encode (which falls back to {@linkcode treeKey} plus a delta).\n *\n * Everything variable-length is length-prefixed, so distinct trees cannot\n * produce the same string and the key needs no `deepEqual` to back it up. That\n * matters because the alternative -- one coarse bucket per shape -- turns N\n * sibling conditions off the same parent into an N-deep scan of tree\n * comparisons, which measured far slower than not interning at all.\n */\nfunction condKey(cond: Condition): string | undefined {\n switch (cond.type) {\n case 'simple': {\n if (cond.left.type !== 'column') {\n return undefined;\n }\n return `S${enc(cond.left.name)}${enc(cond.op)}${rightTag(cond.right)}`;\n }\n case 'correlatedSubquery': {\n const id = astIDs.get(cond.related.subquery);\n return id === undefined\n ? undefined\n : `E${id}:${enc(cond.op)}${tri(cond.flip)}${tri(cond.scalar)}`;\n }\n case 'and':\n case 'or': {\n let out = `${cond.type === 'and' ? 'A' : 'O'}${cond.conditions.length}:`;\n for (const c of cond.conditions) {\n const k = condKey(c);\n if (k === undefined) {\n return undefined;\n }\n out += k;\n }\n return out;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * A coarse bucket key for the conditions {@linkcode condKey} cannot encode --\n * a two-hop `exists`, whose junction AST is built inline and so has no identity\n * of its own. Reads only the top of the tree, so it is cheap; the delta tells\n * apart what shares it.\n */\nfunction treeKey(cond: Condition): string {\n switch (cond.type) {\n case 'correlatedSubquery':\n return `where:e:${cond.related.subquery.alias}:${cond.op}`;\n case 'and':\n case 'or':\n return `where:${cond.type}:${cond.conditions.length}`;\n default:\n return 'where:*';\n }\n}\n\nfunction throwQueryNotRunnable(): never {\n throw new Error('Query is not runnable');\n}\n\nfunction isCompoundKey(field: readonly string[]): field is CompoundKey {\n return Array.isArray(field) && field.length >= 1;\n}\n\nfunction isOneHop<T>(r: readonly T[]): r is readonly [T] {\n return r.length === 1;\n}\n\nfunction isTwoHop<T>(r: readonly T[]): r is readonly [T, T] {\n return r.length === 2;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-impl.js","names":["#schema","#tableName","#ast","#system","#currentJunction","#newQuery","#transitions","#record","#parent","#derive","#hash","#canonicalize","#byHash","#sameAs","#deriveBounded","#expressionBuilder","#exists"],"sources":["../../../../../zql/src/query/query-impl.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\nimport {assert} from '../../../shared/src/asserts.ts';\nimport {\n deepEqual,\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n} from '../../../shared/src/json.ts';\nimport {\n type AST,\n type CompoundKey,\n type Condition,\n type NormalizedAST,\n type Parameter,\n type LiteralValue,\n type SimpleCondition,\n type SimpleOperator,\n type System,\n insertRelated,\n normalizeAST,\n normalizeCondition,\n normalizedRelated,\n SUBQ_PREFIX,\n tableAST,\n} from '../../../zero-protocol/src/ast.ts';\nimport {hashOfQueryInternals} from '../../../zero-protocol/src/query-hash-visitor.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {NotImplementedError} from '../error.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport {\n type ExpressionFactory,\n ExpressionBuilder,\n and,\n cmp,\n simplifyCondition,\n} from './expression.ts';\nimport type {CustomQueryID} from './named.ts';\nimport {type QueryInternals, queryInternalsTag} from './query-internals.ts';\nimport {\n HashIndex,\n Transitions,\n type Delta,\n type TransitionValue,\n} from './query-transitions.ts';\nimport type {\n AnyQuery,\n ExistsOptions,\n GetFilterType,\n HumanReadable,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\ntype GetFilterTypeAny = GetFilterType<any, any, any>;\n\ntype NewQueryFunction<TSchema extends Schema> = <\n TTable extends keyof TSchema['tables'] & string,\n TReturn,\n>(\n this: unknown,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n) => QueryImpl<TTable, TSchema, TReturn>;\n\nexport function newQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(schema: TSchema, table: TTable): Query<TTable, TSchema> {\n return newQueryInternal(\n schema,\n table,\n tableAST(table),\n defaultFormat,\n 'client',\n );\n}\n\nexport function newQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(\n schema: TSchema,\n tableName: TTable,\n ast: AST,\n format: Format,\n system: System,\n): QueryImpl<TTable, TSchema, TReturn> {\n // This is the entry point for ASTs that were not built by QueryImpl, so\n // normalize it here to establish the invariant that #ast is normalized.\n return newQueryInternal(schema, tableName, normalizeAST(ast), format, system);\n}\n\n/**\n * Root queries are interned per schema so that two `createBuilder(schema)` calls\n * hand out the same starting point, and therefore share the whole transition\n * tree below it. Only cleared entries accumulate here, at most one per\n * system/table pair, so no sweeping is needed.\n */\nconst rootsBySchema = new WeakMap<\n Schema,\n Map<string, WeakRef<QueryImpl<any, any, any>>>\n>();\n\n/**\n * Whether this is the AST `tableAST(tableName)` produces -- the whole table,\n * nothing else. A normalized AST carries every field, so this cannot be a key\n * count; each one has to be checked.\n */\nfunction isRootAST(ast: NormalizedAST, tableName: string): boolean {\n return (\n ast.table === tableName &&\n ast.schema === undefined &&\n ast.alias === undefined &&\n ast.where === undefined &&\n ast.related === undefined &&\n ast.start === undefined &&\n ast.limit === undefined &&\n ast.orderBy === undefined\n );\n}\n\nfunction newQueryInternal<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>(\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n system: System,\n): QueryImpl<TTable, TSchema, TReturn> {\n // Callers that hand in a pre-built AST -- benchmarks and the integration-test\n // harnesses -- are not roots and are not interned.\n const interned = format === defaultFormat && isRootAST(ast, tableName);\n const key = `${system}:${tableName}`;\n let roots: Map<string, WeakRef<QueryImpl<any, any, any>>> | undefined;\n\n if (interned) {\n roots = rootsBySchema.get(schema);\n const existing = roots?.get(key)?.deref();\n if (existing) {\n return existing as QueryImpl<TTable, TSchema, TReturn>;\n }\n }\n\n const inner: NewQueryFunction<TSchema> = (\n tableName,\n ast,\n format,\n customQueryID,\n currentJunction,\n ) =>\n new QueryImpl(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n inner,\n );\n\n const created = inner<TTable, TReturn>(\n tableName,\n ast,\n format,\n undefined,\n undefined,\n );\n\n if (interned) {\n if (!roots) {\n roots = new Map();\n rootsBySchema.set(schema, roots);\n }\n roots.set(key, new WeakRef(created));\n }\n\n return created;\n}\n\n/**\n * The AST of a QueryImpl is always normalized. Each step builds its AST in\n * normalized form rather than normalizing afterwards: a normalized AST has\n * every field, so spreading one and replacing a field keeps the field order\n * intact, and only the field a step actually changes needs normalizing (the\n * conditions of a `where`, the position of a new `related`). The ASTs that\n * come in from the outside are normalized by {@link newQueryImpl}, which is\n * what the `NormalizedAST` of the AST it holds stands for.\n */\nexport class QueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n implements\n Query<TTable, TSchema, TReturn>,\n QueryInternals<TTable, TSchema, TReturn>\n{\n readonly [queryInternalsTag] = true;\n\n readonly #schema: TSchema;\n readonly #tableName: TTable;\n readonly #ast: NormalizedAST;\n readonly format: Format;\n #hash: string = '';\n readonly #system: System;\n readonly #currentJunction: string | undefined;\n readonly customQueryID: CustomQueryID | undefined;\n readonly #newQuery: NewQueryFunction<TSchema>;\n\n /**\n * The query this one was derived from, held *strongly*, and the queries\n * derived from this one, held *weakly*. This is the arrangement V8 uses for\n * hidden-class transitions, and it is what makes interning stable: as long as\n * a query is reachable its whole ancestor spine is too, so re-deriving it from\n * the root yields the same instance. See `query-transitions.ts`.\n */\n #parent: QueryImpl<any, any, any> | undefined;\n #transitions: Transitions<QueryImpl<any, any, any>> | undefined;\n\n /**\n * The second level of interning, keyed by hash; see `HashIndex`. Set on the\n * root only, which is what scopes it to one schema and one delegate.\n */\n #byHash: HashIndex<QueryImpl<any, any, any>> | undefined;\n\n /**\n * Memoized because a query is interned: the same node serves every rebuild of\n * a chain, so building this once rather than per `where(fn)` call takes the\n * whole thing -- the builder and the bound `#exists` -- off the repeat path.\n */\n #expressionBuilder: ExpressionBuilder<TTable, TSchema> | undefined;\n\n constructor(\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST,\n format: Format,\n system: System,\n customQueryID: CustomQueryID | undefined,\n currentJunction: string | undefined,\n newQuery: NewQueryFunction<TSchema>,\n ) {\n this.#schema = schema;\n this.#tableName = tableName;\n this.#ast = ast;\n this.format = format;\n this.#system = system;\n this.#currentJunction = currentJunction;\n this.customQueryID = customQueryID;\n this.#newQuery = newQuery;\n }\n\n /**\n * Interns a transition whose key space is finite and schema-derived; see\n * {@linkcode Transitions.storeBounded}. Used for the base sub-query handed to\n * a `related`/`exists` callback, which is determined entirely by the\n * relationship name.\n */\n #deriveBounded<T>(key: string, build: () => T): T {\n const existing = this.#transitions?.lookupBounded(key);\n if (existing !== undefined) {\n return existing as T;\n }\n return this.#record(key, undefined, undefined, build(), true);\n }\n\n /**\n * Interns the result of applying a builder operation to this query.\n *\n * `key` names the operation and `value` carries its varying argument, kept\n * apart so the key stays a string V8 has already hashed. When the two do not\n * settle it, `delta` carries the rest and is compared with `deepEqual`. Only\n * the delta is compared, never the whole AST: this query is already canonical,\n * so two of its children are equal exactly when the operations that produced\n * them are.\n *\n * `T` is deliberately unconstrained so that the contextual return type at each\n * call site still drives `#newQuery`'s inference, exactly as it did when the\n * call sites returned `this.#newQuery(...)` directly.\n */\n #derive<T>(\n key: string,\n value: TransitionValue,\n delta: Delta,\n build: () => T,\n ): T {\n const existing = this.#transitions?.lookup(key, value, delta);\n if (existing !== undefined) {\n return existing as T;\n }\n return this.#record(key, value, delta, build(), false);\n }\n\n #record<T>(\n key: string,\n value: TransitionValue,\n delta: Delta,\n created: T,\n bounded: boolean,\n ): T {\n const q = created as unknown as QueryImpl<any, any, any>;\n q.#parent = this;\n const transitions = (this.#transitions ??= new Transitions());\n if (bounded) {\n transitions.storeBounded(key, q);\n } else {\n transitions.store(key, value, delta, q);\n }\n return created;\n }\n\n run(_options?: RunOptions): Promise<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n preload(_options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n cached: Promise<void>;\n } {\n throwQueryNotRunnable();\n }\n\n materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n materialize<T>(\n _factoryOrTTL?: ViewFactory<TTable, TSchema, TReturn, T> | TTL,\n _ttl?: TTL,\n ): T | TypedView<HumanReadable<TReturn>> {\n throwQueryNotRunnable();\n }\n\n nameAndArgs(\n name: string,\n args: ReadonlyArray<ReadonlyJSONValue>,\n ): Query<TTable, TSchema, TReturn> {\n return this.#derive('nameAndArgs', name, args, () =>\n this.#newQuery(\n this.#tableName,\n this.#ast,\n this.format,\n {\n name,\n args,\n },\n this.#currentJunction,\n ),\n );\n }\n\n hash(): string {\n if (!this.#hash) {\n this.#hash = hashOfQueryInternals(\n this.#ast,\n this.format,\n this.#system,\n this.#currentJunction,\n this.customQueryID?.name,\n this.customQueryID?.args,\n );\n this.#canonicalize();\n }\n return this.#hash;\n }\n\n /**\n * Folds this query into its root's hash index, now that its hash is known.\n *\n * If an equal query is already indexed, the transition that produced this\n * one is re-pointed at it, so the next rebuild along this path yields that\n * instance rather than a second copy. This query itself is left alone: its\n * identity has already been handed out. Content is verified with `#sameAs`\n * before anything is redirected, so a hash collision costs nothing worse\n * than a missed unification.\n */\n #canonicalize(): void {\n const parent = this.#parent;\n if (parent === undefined) {\n // A root has no path to redirect and is its own canonical form.\n return;\n }\n let root = parent;\n while (root.#parent !== undefined) {\n root = root.#parent;\n }\n const index = (root.#byHash ??= new HashIndex());\n const existing = index.get(this.#hash);\n if (existing === undefined) {\n index.set(this.#hash, this);\n } else if (existing !== this && this.#sameAs(existing)) {\n parent.#transitions?.replace(this, existing);\n }\n }\n\n /**\n * Whether `other` is interchangeable with this query: everything `hash()`\n * covers, compared structurally. Schema and delegate are not compared. Both\n * are fixed by the root, and this only ever compares queries under one root.\n */\n #sameAs(other: QueryImpl<any, any, any>): boolean {\n return (\n this.#system === other.#system &&\n this.#currentJunction === other.#currentJunction &&\n this.customQueryID?.name === other.customQueryID?.name &&\n deepEqual(this.customQueryID?.args, other.customQueryID?.args) &&\n deepEqual(this.format, other.format) &&\n deepEqual(this.#ast, other.#ast)\n );\n }\n\n one(): Query<TTable, TSchema, TReturn | undefined> {\n return this.#derive('one', undefined, undefined, () =>\n this.#newQuery(\n this.#tableName,\n {...this.#ast, limit: 1},\n {\n ...this.format,\n singular: true,\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n whereExists(\n relationship: string,\n cbOrOptions?: ((q: AnyQuery) => AnyQuery) | ExistsOptions,\n options?: ExistsOptions,\n ): Query<TTable, TSchema, TReturn> {\n const cb = typeof cbOrOptions === 'function' ? cbOrOptions : undefined;\n const opts = typeof cbOrOptions === 'function' ? options : cbOrOptions;\n return this.where(({exists}) => exists(relationship, cb, opts)) as Query<\n TTable,\n TSchema,\n TReturn\n >;\n }\n\n related(\n relationship: string,\n cb?: (q: AnyQuery) => AnyQuery,\n ): Query<TTable, TSchema, any> {\n if (relationship.startsWith(SUBQ_PREFIX)) {\n throw new Error(\n `Relationship names may not start with \"${SUBQ_PREFIX}\". That is a reserved prefix.`,\n );\n }\n cb = cb ?? (q => q);\n\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n if (isOneHop(related)) {\n const {destSchema, destField, sourceField, cardinality} = related[0];\n // Intern the base handed to the callback too. A deterministic callback\n // then walks the same interned chain and hands back the *same* sub-query,\n // which makes the comparison below a pointer compare.\n const q: AnyQuery = this.#deriveBounded(\n `relatedBase:${relationship}`,\n () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, relationship),\n {\n relationships: {},\n singular: cardinality === 'one',\n },\n this.customQueryID,\n undefined,\n ),\n ) as AnyQuery;\n // Intentionally not setting to `one` as it is a perf degradation\n // and the user should not be making the mistake of setting cardinality to\n // `one` when it is actually not.\n // if (cardinality === 'one') {\n // q = q.one();\n // }\n const subQuery = asQueryImpl(cb(q));\n assert(\n isCompoundKey(sourceField),\n 'The source of a relationship must specify at last 1 field',\n );\n assert(\n isCompoundKey(destField),\n 'The destination of a relationship must specify at last 1 field',\n );\n assert(\n sourceField.length === destField.length,\n 'The source and destination of a relationship must have the same number of fields',\n );\n\n // Keyed by the sub-query's identity. Each query owns its AST object, so\n // this distinguishes even `q.one()` from `q.limit(1)`, whose ASTs are\n // structurally equal but whose formats differ. Comparing them as a delta\n // instead would put every sibling under one key and scan.\n return this.#derive(\n relatedKey(relationship),\n astID(subQuery.#ast),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: insertRelated(this.#ast.related, {\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n system: this.#system,\n }),\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: subQuery.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n ) as AnyQuery;\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const sq = asQueryImpl(\n cb(\n this.#deriveBounded(`relatedBase:${relationship}`, () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, relationship),\n {\n relationships: {},\n singular: secondRelation.cardinality === 'one',\n },\n this.customQueryID,\n relationship,\n ),\n ) as AnyQuery,\n ),\n );\n\n // Bound to consts so the `isCompoundKey` narrowing survives into the\n // closure below; TypeScript drops narrowing of property accesses there.\n const {sourceField: firstSource, destField: firstDest} = firstRelation;\n const {sourceField: secondSource, destField: secondDest} = secondRelation;\n assert(isCompoundKey(firstSource), 'Invalid relationship');\n assert(isCompoundKey(firstDest), 'Invalid relationship');\n assert(isCompoundKey(secondSource), 'Invalid relationship');\n assert(isCompoundKey(secondDest), 'Invalid relationship');\n\n return this.#derive(\n relatedKey(relationship),\n astID(sq.#ast),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n related: insertRelated(this.#ast.related, {\n correlation: {\n parentField: firstSource,\n childField: firstDest,\n },\n hidden: true,\n subquery: {\n ...tableAST(junctionSchema, relationship),\n // A single subquery is sorted.\n related: [\n normalizedRelated({\n correlation: {\n parentField: secondSource,\n childField: secondDest,\n },\n subquery: sq.#ast,\n system: this.#system,\n }),\n ],\n },\n system: this.#system,\n }),\n },\n {\n ...this.format,\n relationships: {\n ...this.format.relationships,\n [relationship]: sq.format,\n },\n },\n this.customQueryID,\n this.#currentJunction,\n ),\n ) as AnyQuery;\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n }\n\n // The declared return is the *bottom* of the pinned dimension, which is\n // assignable to every `where` overload's declared return. The overloads\n // refine `TPinned` for callers only; a single non-generic implementation\n // signature cannot express that refinement.\n where(\n fieldOrExpressionFactory: string | ExpressionFactory<TTable, TSchema>,\n opOrValue?: SimpleOperator | GetFilterTypeAny | Parameter,\n value?: GetFilterTypeAny | Parameter,\n ): Query<TTable, TSchema, TReturn, any> {\n let cond: Condition;\n\n if (typeof fieldOrExpressionFactory === 'function') {\n cond = fieldOrExpressionFactory(this.expressionBuilder());\n } else {\n assert(arguments.length >= 2, 'Invalid condition. Too few arguments.');\n // Distinguish between 2-arg form (field, value) and 3-arg form (field, op, value)\n // using arguments.length to allow explicit undefined in 3-arg form.\n const twoArg = arguments.length === 2;\n const op = (twoArg ? '=' : opOrValue) as SimpleOperator;\n const raw = twoArg ? opOrValue : value;\n\n // Comparing a column to a primitive is by far the most common thing anyone\n // does with a query, and the transition it names is fully determined by\n // (column, op, value) -- so check for it before building anything. On a hit\n // this returns without allocating the `Condition` at all. Objects are\n // excluded, which covers both parameter references and `IN` arrays; `cmp`\n // maps a missing value to null, so this must too.\n if (raw === null || typeof raw !== 'object') {\n const hit = this.#transitions?.lookup(\n whereKey(fieldOrExpressionFactory, op),\n (raw ?? null) as TransitionValue,\n undefined,\n );\n if (hit !== undefined) {\n return hit as unknown as Query<TTable, TSchema, TReturn, any>;\n }\n }\n\n cond = twoArg\n ? cmp(fieldOrExpressionFactory, opOrValue)\n : cmp(fieldOrExpressionFactory, opOrValue, value);\n }\n\n // The delta is the condition as built here, *before* it is merged with the\n // existing where and normalized. Both steps are deterministic and the\n // existing where is fixed by this query, so an equal `cond` always produces\n // an equal result.\n //\n // A simple comparison against a column splits cleanly: the column and\n // operator come from a small fixed set and give a memoized, stable key,\n // while the compared value -- the part that varies per call -- is handed\n // through as the transition value and never concatenated into a string.\n let key: string;\n let tValue: TransitionValue;\n let delta: Delta = cond;\n if (cond.type === 'simple' && cond.left.type === 'column') {\n key = whereKey(cond.left.name, cond.op);\n const right = cond.right;\n tValue =\n right.type === 'literal' && isPrimitive(right.value)\n ? right.value\n : rightTag(right);\n delta = undefined;\n } else {\n // A sub-query an `exists` correlates to is itself interned, so its\n // identity settles that part of the tree without walking it.\n const exact = condKey(cond);\n if (exact === undefined) {\n key = treeKey(cond);\n } else {\n key = 'where:tree';\n tValue = exact;\n delta = undefined;\n }\n }\n\n return this.#derive(key, tValue, delta, () => {\n const existingWhere = this.#ast.where;\n const merged = existingWhere ? and(existingWhere, cond) : cond;\n return this.#newQuery(\n this.#tableName,\n {...this.#ast, where: normalizeCondition(simplifyCondition(merged))},\n this.format,\n this.customQueryID,\n this.#currentJunction,\n );\n }) as unknown as Query<TTable, TSchema, TReturn, any>;\n }\n\n start(\n row: Partial<Record<string, ReadonlyJSONValue | undefined>>,\n opts?: {inclusive: boolean},\n ): Query<TTable, TSchema, TReturn> {\n // The row is an object, so it is encoded to a string to serve as the\n // lookup key. Property order is part of that string.\n return this.#derive(\n opts?.inclusive ? 'start:inclusive' : 'start:exclusive',\n valueTag(row as ReadonlyJSONValue),\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n start: {\n row,\n exclusive: !opts?.inclusive,\n },\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n limit(limit: number): Query<TTable, TSchema, TReturn> {\n if (limit < 0) {\n throw new Error('Limit must be non-negative');\n }\n if ((limit | 0) !== limit) {\n throw new Error('Limit must be an integer');\n }\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Limit is not supported in junction relationships yet. Junction relationship being limited: ' +\n this.#currentJunction,\n );\n }\n\n return this.#derive('limit', limit, undefined, () =>\n this.#newQuery(\n this.#tableName,\n {...this.#ast, limit},\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n orderBy<TSelector extends keyof TSchema['tables'][TTable]['columns']>(\n field: TSelector,\n direction: 'asc' | 'desc',\n ): Query<TTable, TSchema, TReturn> {\n if (this.#currentJunction) {\n throw new NotImplementedError(\n 'Order by is not supported in junction relationships yet. Junction relationship being ordered: ' +\n this.#currentJunction,\n );\n }\n return this.#derive(\n direction === 'asc' ? 'orderBy:asc' : 'orderBy:desc',\n field as string,\n undefined,\n () =>\n this.#newQuery(\n this.#tableName,\n {\n ...this.#ast,\n orderBy: [\n ...(this.#ast.orderBy ?? []),\n [field as string, direction],\n ],\n },\n this.format,\n this.customQueryID,\n this.#currentJunction,\n ),\n );\n }\n\n #exists(\n relationship: string,\n cb: ((query: AnyQuery) => AnyQuery) | undefined,\n options?: ExistsOptions,\n ): Condition {\n cb = cb ?? (q => q);\n const flip = options?.flip;\n const scalar = options?.scalar;\n const related = this.#schema.relationships[this.#tableName][relationship];\n assert(related, 'Invalid relationship');\n\n if (isOneHop(related)) {\n const {destSchema: destTableName, sourceField, destField} = related[0];\n assert(isCompoundKey(sourceField), 'Invalid relationship');\n assert(isCompoundKey(destField), 'Invalid relationship');\n\n const subQuery = asQueryImpl(\n cb(\n this.#deriveBounded(`existsBase:${relationship}`, () =>\n this.#newQuery(\n destTableName,\n tableAST(destTableName, `${SUBQ_PREFIX}${relationship}`),\n defaultFormat,\n this.customQueryID,\n undefined,\n ),\n ) as AnyQuery,\n ),\n );\n // Give the sub-query's AST an id so the enclosing `where` can key on it\n // exactly rather than comparing the sub-tree.\n astID(subQuery.#ast);\n // Unlike the entries of `related`, the correlated subqueries of a\n // condition keep the order their fields are written in: normalization\n // does not reorder them either.\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: sourceField,\n childField: destField,\n },\n subquery: subQuery.#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n };\n }\n\n if (isTwoHop(related)) {\n const [firstRelation, secondRelation] = related;\n assert(isCompoundKey(firstRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(firstRelation.destField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.sourceField), 'Invalid relationship');\n assert(isCompoundKey(secondRelation.destField), 'Invalid relationship');\n const {destSchema} = secondRelation;\n const junctionSchema = firstRelation.destSchema;\n const queryToDest = cb(\n this.#deriveBounded(`existsJunctionBase:${relationship}`, () =>\n this.#newQuery(\n destSchema,\n tableAST(destSchema, `${SUBQ_PREFIX}zhidden_${relationship}`),\n defaultFormat,\n this.customQueryID,\n relationship,\n ),\n ) as AnyQuery,\n );\n\n return {\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: firstRelation.sourceField,\n childField: firstRelation.destField,\n },\n subquery: {\n ...tableAST(junctionSchema, `${SUBQ_PREFIX}${relationship}`),\n // A single condition needs no flattening or sorting, but the node\n // itself still has to be rebuilt into the canonical field order.\n where: normalizeCondition({\n type: 'correlatedSubquery',\n related: {\n system: this.#system,\n correlation: {\n parentField: secondRelation.sourceField,\n childField: secondRelation.destField,\n },\n subquery: asQueryImpl(queryToDest).#ast,\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n ...(scalar !== undefined ? {scalar} : {}),\n }),\n },\n },\n op: 'EXISTS',\n ...(flip !== undefined ? {flip} : {}),\n };\n }\n\n throw new Error(`Invalid relationship ${relationship}`);\n }\n\n get ast(): NormalizedAST {\n return this.#ast;\n }\n\n expressionBuilder(): ExpressionBuilder<TTable, TSchema> {\n // Built on demand rather than held as an eagerly initialized field: a field\n // would cost a closure on every query constructed, where this costs one only\n // for queries that actually use an expression factory.\n return (this.#expressionBuilder ??= new ExpressionBuilder<TTable, TSchema>(\n this.#exists.bind(this) as ConstructorParameters<\n typeof ExpressionBuilder<TTable, TSchema>\n >[0],\n ));\n }\n}\n\nexport function asQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n>(q: Query<TTable, TSchema, TReturn>): QueryImpl<TTable, TSchema, TReturn> {\n assert(q instanceof QueryImpl, 'Expected QueryImpl instance');\n return q;\n}\n\n/**\n * A stable id per query AST.\n *\n * Every `QueryImpl` allocates its own AST object, so these are one-to-one with\n * queries, and interning makes the object identity stable across rebuilds. That\n * lets a `related` or `exists` transition key on *which* sub-query it points at\n * rather than comparing the sub-tree.\n *\n * Assigned only where it is needed. A `WeakMap.set` costs on the order of a\n * hundred nanoseconds, so doing this for every query rather than for the few\n * that are sub-queries was one of the largest single costs of building a query\n * from cold. ASTs that never pass through here -- including the junction AST a\n * two-hop `exists` builds inline -- are absent, and fall back to a delta.\n */\nconst astIDs = new WeakMap<AST, number>();\nlet nextASTID = 0;\n\nfunction astID(ast: AST): number {\n let id = astIDs.get(ast);\n if (id === undefined) {\n id = ++nextASTID;\n astIDs.set(ast, id);\n }\n return id;\n}\n\n/**\n * Memoized transition keys.\n *\n * A transition key must be a string V8 has already hashed, or the `Map` lookup\n * has to hash it from scratch -- measured at ~148ns against ~10ns, which dwarfs\n * everything else a lookup does. Both tables are keyed by schema-derived names,\n * so they are bounded by the schema.\n */\nconst whereKeys = new Map<string, Map<string, string>>();\n\nfunction whereKey(column: string, op: string): string {\n let byOp = whereKeys.get(column);\n if (byOp === undefined) {\n byOp = new Map();\n whereKeys.set(column, byOp);\n }\n let key = byOp.get(op);\n if (key === undefined) {\n key = `where:${column}:${op}`;\n byOp.set(op, key);\n }\n return key;\n}\n\nconst relatedKeys = new Map<string, string>();\n\nfunction relatedKey(relationship: string): string {\n let key = relatedKeys.get(relationship);\n if (key === undefined) {\n key = `related:${relationship}`;\n relatedKeys.set(relationship, key);\n }\n return key;\n}\n\nfunction isPrimitive(v: LiteralValue): v is string | number | boolean | null {\n return v === null || typeof v !== 'object';\n}\n\n/**\n * Folds a JSON value into a self-delimiting token: a string is\n * length-prefixed, a number is terminated, an array or object is\n * count-prefixed and encodes its members recursively, and the rest are fixed\n * width. Tokens can therefore be concatenated into a key with no way for one\n * to run into the next, and the leading tag keeps `'1'` and `1` apart.\n *\n * Not `JSON.stringify`: it writes `Infinity`, `NaN` and `null` all as `null`,\n * and this token is trusted as exact, so a nested value that serialized like\n * another's would hand back a query with the wrong value in its AST. Numbers\n * are written the way `String` writes them, which keeps those apart. An\n * `undefined` property is skipped, as `deepEqual` would skip it; property\n * order is part of the encoding, so an object spelled in another order\n * interns separately.\n */\nfunction valueTag(v: ReadonlyJSONValue): string {\n switch (typeof v) {\n case 'string':\n return `:s${enc(v)}`;\n case 'number':\n return `:n${v};`;\n case 'boolean':\n return v ? ':t' : ':f';\n default: {\n if (v === null) {\n return ':z';\n }\n if (Array.isArray(v)) {\n let out = `:a${v.length}:`;\n for (const e of v) {\n out += valueTag(e);\n }\n return out;\n }\n // `Array.isArray` does not narrow a readonly array out of the union.\n const o = v as ReadonlyJSONObject;\n let body = '';\n let n = 0;\n for (const key in o) {\n const e = o[key];\n if (e !== undefined && Object.hasOwn(o, key)) {\n body += enc(key) + valueTag(e);\n n++;\n }\n }\n return `:o${n}:${body}`;\n }\n }\n}\n\n/**\n * Folds the right-hand side of a simple condition into a transition value, so\n * that the transition is exact and the lookup needs no comparison at all.\n *\n * Arrays (`IN`) and parameter references are encoded in full: that is one\n * pass over a small value, where leaving them in the delta would instead cost\n * a `deepEqual` over the whole condition for every sibling a lookup walks\n * past.\n */\nfunction rightTag(right: SimpleCondition['right']): string {\n if (right.type !== 'literal') {\n return `:p${valueTag(right as unknown as ReadonlyJSONValue)}`;\n }\n return valueTag(right.value);\n}\n\n/**\n * Length-prefixes a free-form string so it can be concatenated into a key\n * without a separator being ambiguous with the content.\n */\nfunction enc(s: string): string {\n return `${s.length}:${s}`;\n}\n\n/** Encodes an optional boolean without collapsing `undefined` into `false`. */\nfunction tri(b: boolean | undefined): string {\n return b === undefined ? '-' : b ? 't' : 'f';\n}\n\n/**\n * An exact key for a whole condition tree, or `undefined` for a shape we cannot\n * encode (which falls back to {@linkcode treeKey} plus a delta).\n *\n * Everything variable-length is length-prefixed, so distinct trees cannot\n * produce the same string and the key needs no `deepEqual` to back it up. That\n * matters because the alternative -- one coarse bucket per shape -- turns N\n * sibling conditions off the same parent into an N-deep scan of tree\n * comparisons, which measured far slower than not interning at all.\n */\nfunction condKey(cond: Condition): string | undefined {\n switch (cond.type) {\n case 'simple': {\n if (cond.left.type !== 'column') {\n return undefined;\n }\n return `S${enc(cond.left.name)}${enc(cond.op)}${rightTag(cond.right)}`;\n }\n case 'correlatedSubquery': {\n const id = astIDs.get(cond.related.subquery);\n return id === undefined\n ? undefined\n : `E${id}:${enc(cond.op)}${tri(cond.flip)}${tri(cond.scalar)}`;\n }\n case 'and':\n case 'or': {\n let out = `${cond.type === 'and' ? 'A' : 'O'}${cond.conditions.length}:`;\n for (const c of cond.conditions) {\n const k = condKey(c);\n if (k === undefined) {\n return undefined;\n }\n out += k;\n }\n return out;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * A coarse bucket key for the conditions {@linkcode condKey} cannot encode --\n * a two-hop `exists`, whose junction AST is built inline and so has no identity\n * of its own. Reads only the top of the tree, so it is cheap; the delta tells\n * apart what shares it.\n */\nfunction treeKey(cond: Condition): string {\n switch (cond.type) {\n case 'correlatedSubquery':\n return `where:e:${cond.related.subquery.alias}:${cond.op}`;\n case 'and':\n case 'or':\n return `where:${cond.type}:${cond.conditions.length}`;\n default:\n return 'where:*';\n }\n}\n\nfunction throwQueryNotRunnable(): never {\n throw new Error('Query is not runnable');\n}\n\nfunction isCompoundKey(field: readonly string[]): field is CompoundKey {\n return Array.isArray(field) && field.length >= 1;\n}\n\nfunction isOneHop<T>(r: readonly T[]): r is readonly [T] {\n return r.length === 1;\n}\n\nfunction isTwoHop<T>(r: readonly T[]): r is readonly [T, T] {\n return r.length === 2;\n}\n"],"mappings":"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"}
|
|
@@ -205,6 +205,7 @@ export interface Query<TTable extends keyof TSchema['tables'] & string, TSchema
|
|
|
205
205
|
preload(options?: PreloadOptions): {
|
|
206
206
|
cleanup: () => void;
|
|
207
207
|
complete: Promise<void>;
|
|
208
|
+
cached: Promise<void>;
|
|
208
209
|
};
|
|
209
210
|
/**
|
|
210
211
|
* @deprecated Use {@linkcode MaterializeOptions} with {@linkcode zero.materialize} instead.
|
|
@@ -237,6 +238,11 @@ export type HumanReadableRecursive<T> = undefined extends T ? ExpandRecursive<T>
|
|
|
237
238
|
* `unknown` means we don't want to wait for the server to return results. The result is a
|
|
238
239
|
* snapshot of the data at the time the query was run.
|
|
239
240
|
*
|
|
241
|
+
* `cached` means we want a result the server has confirmed, but one confirmed by a previous
|
|
242
|
+
* connection is fine: it resolves as soon as the result is `cached` or `complete`. Use it
|
|
243
|
+
* on the launch path when the client may be offline and the store holds last session's
|
|
244
|
+
* complete result for this query. If nothing is cached it waits like `complete`.
|
|
245
|
+
*
|
|
240
246
|
* `complete` means we want to ensure that we have the latest result from the server. The
|
|
241
247
|
* result is a complete and up-to-date view of the data. In some cases this means that we
|
|
242
248
|
* have to wait for the server to return results. To ensure that we have the result for
|
|
@@ -248,7 +254,7 @@ export type HumanReadableRecursive<T> = undefined extends T ? ExpandRecursive<T>
|
|
|
248
254
|
* time to keep the rows associated with this query after the promise has resolved.
|
|
249
255
|
*/
|
|
250
256
|
export type RunOptions = {
|
|
251
|
-
type: 'unknown' | 'complete';
|
|
257
|
+
type: 'unknown' | 'cached' | 'complete';
|
|
252
258
|
ttl?: TTL | undefined;
|
|
253
259
|
};
|
|
254
260
|
export declare const DEFAULT_RUN_OPTIONS_UNKNOWN: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export declare class RunnableQueryImpl<TTable extends keyof TSchema['tables'] &
|
|
|
15
15
|
preload(options?: PreloadOptions): {
|
|
16
16
|
cleanup: () => void;
|
|
17
17
|
complete: Promise<void>;
|
|
18
|
+
cached: Promise<void>;
|
|
18
19
|
};
|
|
19
20
|
materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;
|
|
20
21
|
materialize<T>(factory: ViewFactory<TTable, TSchema, TReturn, T>, ttl?: TTL): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runnable-query-impl.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAE9D,OAAO,KAAK,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,OAAO,EACP,KAAK,EACL,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAa/C,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EAEtB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CA2BxB;AAED,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EACtB,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAElC,SAAQ,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAC1C,YAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;;IAI1C,YACE,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,aAAmC,EACxC,MAAM,GAAE,MAAsB,EAC9B,MAAM,GAAE,MAAiB,EACzB,aAAa,CAAC,EAAE,aAAa,EAC7B,eAAe,CAAC,EAAE,MAAM,EAuBzB;IAEQ,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAQlE;IAEQ,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG;QAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runnable-query-impl.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,MAAM,EACZ,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAE9D,OAAO,KAAK,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,OAAO,EACP,KAAK,EACL,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAa/C,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EAEtB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CA2BxB;AAED,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAC/C,OAAO,SAAS,MAAM,EACtB,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAElC,SAAQ,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAC1C,YAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;;IAI1C,YACE,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,aAAmC,EACxC,MAAM,GAAE,MAAsB,EAC9B,MAAM,GAAE,MAAiB,EACzB,aAAa,CAAC,EAAE,aAAa,EAC7B,eAAe,CAAC,EAAE,MAAM,EAuBzB;IAEQ,GAAG,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAQlE;IAEQ,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG;QAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;KACvB,CAEA;IAEQ,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,WAAW,CAAC,CAAC,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EACjD,GAAG,CAAC,EAAE,GAAG,GACR,CAAC,CAAC;CAsBN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runnable-query-impl.js","names":["#delegate"],"sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"sourcesContent":["import {\n tableAST,\n type NormalizedAST,\n type System,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {QueryDelegate} from './query-delegate.ts';\nimport {QueryImpl} from './query-impl.ts';\nimport type {\n HumanReadable,\n MaterializeOptions,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\n/**\n * Runnable roots are interned per delegate *and* schema -- a query is only\n * interchangeable with another if it would run against the same delegate. See\n * `query-transitions.ts` for why roots need to be shared at all.\n */\nconst rootsByDelegate = new WeakMap<\n QueryDelegate,\n // oxlint-disable-next-line no-explicit-any\n WeakMap<Schema, Map<string, WeakRef<RunnableQueryImpl<any, any, any>>>>\n>();\n\nexport function newRunnableQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(\n delegate: QueryDelegate,\n schema: TSchema,\n table: TTable,\n): Query<TTable, TSchema> {\n let bySchema = rootsByDelegate.get(delegate);\n if (!bySchema) {\n bySchema = new WeakMap();\n rootsByDelegate.set(delegate, bySchema);\n }\n let roots = bySchema.get(schema);\n if (!roots) {\n roots = new Map();\n bySchema.set(schema, roots);\n }\n\n const existing = roots.get(table)?.deref();\n if (existing) {\n return existing as RunnableQueryImpl<TTable, TSchema>;\n }\n\n const created = new RunnableQueryImpl<TTable, TSchema>(\n delegate,\n schema,\n table,\n tableAST(table),\n defaultFormat,\n undefined,\n );\n roots.set(table, new WeakRef(created));\n return created;\n}\n\nexport class RunnableQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n extends QueryImpl<TTable, TSchema, TReturn>\n implements Query<TTable, TSchema, TReturn>\n{\n readonly #delegate: QueryDelegate;\n\n constructor(\n delegate: QueryDelegate,\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST = tableAST(tableName),\n format: Format = defaultFormat,\n system: System = 'client',\n customQueryID?: CustomQueryID,\n currentJunction?: string,\n ) {\n super(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n (tableName, ast, format, customQueryID, currentJunction) =>\n new RunnableQueryImpl(\n delegate,\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n ),\n );\n this.#delegate = delegate;\n }\n\n override run(options?: RunOptions): Promise<HumanReadable<TReturn>> {\n // The type arguments on the delegate calls in this class are written out\n // because tsc 7.0.2 fails to infer them in some program layouts (the\n // packages/zero declaration build, apps/zero-throughput): inference\n // collapses TSchema to its constraint and the call misreports as a\n // TS2345 assignability error. Explicit arguments are inert where\n // inference works and correct where it does not.\n return this.#delegate.run<TTable, TSchema, TReturn>(this, options);\n }\n\n override preload(options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n } {\n return this.#delegate.preload<TTable, TSchema, TReturn>(this, options);\n }\n\n override materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n override materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n override materialize<T>(\n factory?: unknown,\n ttl?: unknown,\n ): T | TypedView<HumanReadable<TReturn>> {\n let actualFactory: ViewFactory<TTable, TSchema, TReturn, T> | undefined;\n let options: MaterializeOptions | undefined;\n\n if (typeof factory === 'function') {\n actualFactory = factory as ViewFactory<TTable, TSchema, TReturn, T>;\n options = {ttl: ttl as TTL | undefined};\n } else {\n actualFactory = undefined;\n options = {ttl: factory as TTL | undefined};\n }\n\n return this.#delegate.materialize<TTable, TSchema, TReturn, T>(\n this,\n actualFactory,\n options,\n );\n }\n}\n"],"mappings":";;;;;;;;;AA2BA,IAAM,kCAAkB,IAAI,QAI1B;AAEF,SAAgB,iBAId,UACA,QACA,OACwB;CACxB,IAAI,WAAW,gBAAgB,IAAI,QAAQ;CAC3C,IAAI,CAAC,UAAU;EACb,2BAAW,IAAI,QAAQ;EACvB,gBAAgB,IAAI,UAAU,QAAQ;CACxC;CACA,IAAI,QAAQ,SAAS,IAAI,MAAM;CAC/B,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,SAAS,IAAI,QAAQ,KAAK;CAC5B;CAEA,MAAM,WAAW,MAAM,IAAI,KAAK,GAAG,MAAM;CACzC,IAAI,UACF,OAAO;CAGT,MAAM,UAAU,IAAI,kBAClB,UACA,QACA,OACA,SAAS,KAAK,GACd,eACA,KAAA,CACF;CACA,MAAM,IAAI,OAAO,IAAI,QAAQ,OAAO,CAAC;CACrC,OAAO;AACT;AAEA,IAAa,oBAAb,MAAa,0BAKH,UAEV;CACE;CAEA,YACE,UACA,QACA,WACA,MAAqB,SAAS,SAAS,GACvC,SAAiB,eACjB,SAAiB,UACjB,eACA,iBACA;EACA,MACE,QACA,WACA,KACA,QACA,QACA,eACA,kBACC,WAAW,KAAK,QAAQ,eAAe,oBACtC,IAAI,kBACF,UACA,QACA,WACA,KACA,QACA,QACA,eACA,eACF,CACJ;EACA,KAAKA,YAAY;CACnB;CAEA,IAAa,SAAuD;EAOlE,OAAO,KAAKA,UAAU,IAA8B,MAAM,OAAO;CACnE;CAEA,QAAiB,
|
|
1
|
+
{"version":3,"file":"runnable-query-impl.js","names":["#delegate"],"sources":["../../../../../zql/src/query/runnable-query-impl.ts"],"sourcesContent":["import {\n tableAST,\n type NormalizedAST,\n type System,\n} from '../../../zero-protocol/src/ast.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {defaultFormat} from '../ivm/default-format.ts';\nimport type {Format, ViewFactory} from '../ivm/view.ts';\nimport type {CustomQueryID} from './named.ts';\nimport type {QueryDelegate} from './query-delegate.ts';\nimport {QueryImpl} from './query-impl.ts';\nimport type {\n HumanReadable,\n MaterializeOptions,\n PreloadOptions,\n PullRow,\n Query,\n RunOptions,\n} from './query.ts';\nimport type {TTL} from './ttl.ts';\nimport type {TypedView} from './typed-view.ts';\n\n/**\n * Runnable roots are interned per delegate *and* schema -- a query is only\n * interchangeable with another if it would run against the same delegate. See\n * `query-transitions.ts` for why roots need to be shared at all.\n */\nconst rootsByDelegate = new WeakMap<\n QueryDelegate,\n // oxlint-disable-next-line no-explicit-any\n WeakMap<Schema, Map<string, WeakRef<RunnableQueryImpl<any, any, any>>>>\n>();\n\nexport function newRunnableQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n>(\n delegate: QueryDelegate,\n schema: TSchema,\n table: TTable,\n): Query<TTable, TSchema> {\n let bySchema = rootsByDelegate.get(delegate);\n if (!bySchema) {\n bySchema = new WeakMap();\n rootsByDelegate.set(delegate, bySchema);\n }\n let roots = bySchema.get(schema);\n if (!roots) {\n roots = new Map();\n bySchema.set(schema, roots);\n }\n\n const existing = roots.get(table)?.deref();\n if (existing) {\n return existing as RunnableQueryImpl<TTable, TSchema>;\n }\n\n const created = new RunnableQueryImpl<TTable, TSchema>(\n delegate,\n schema,\n table,\n tableAST(table),\n defaultFormat,\n undefined,\n );\n roots.set(table, new WeakRef(created));\n return created;\n}\n\nexport class RunnableQueryImpl<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn = PullRow<TTable, TSchema>,\n>\n extends QueryImpl<TTable, TSchema, TReturn>\n implements Query<TTable, TSchema, TReturn>\n{\n readonly #delegate: QueryDelegate;\n\n constructor(\n delegate: QueryDelegate,\n schema: TSchema,\n tableName: TTable,\n ast: NormalizedAST = tableAST(tableName),\n format: Format = defaultFormat,\n system: System = 'client',\n customQueryID?: CustomQueryID,\n currentJunction?: string,\n ) {\n super(\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n (tableName, ast, format, customQueryID, currentJunction) =>\n new RunnableQueryImpl(\n delegate,\n schema,\n tableName,\n ast,\n format,\n system,\n customQueryID,\n currentJunction,\n ),\n );\n this.#delegate = delegate;\n }\n\n override run(options?: RunOptions): Promise<HumanReadable<TReturn>> {\n // The type arguments on the delegate calls in this class are written out\n // because tsc 7.0.2 fails to infer them in some program layouts (the\n // packages/zero declaration build, apps/zero-throughput): inference\n // collapses TSchema to its constraint and the call misreports as a\n // TS2345 assignability error. Explicit arguments are inert where\n // inference works and correct where it does not.\n return this.#delegate.run<TTable, TSchema, TReturn>(this, options);\n }\n\n override preload(options?: PreloadOptions): {\n cleanup: () => void;\n complete: Promise<void>;\n cached: Promise<void>;\n } {\n return this.#delegate.preload<TTable, TSchema, TReturn>(this, options);\n }\n\n override materialize(ttl?: TTL): TypedView<HumanReadable<TReturn>>;\n override materialize<T>(\n factory: ViewFactory<TTable, TSchema, TReturn, T>,\n ttl?: TTL,\n ): T;\n override materialize<T>(\n factory?: unknown,\n ttl?: unknown,\n ): T | TypedView<HumanReadable<TReturn>> {\n let actualFactory: ViewFactory<TTable, TSchema, TReturn, T> | undefined;\n let options: MaterializeOptions | undefined;\n\n if (typeof factory === 'function') {\n actualFactory = factory as ViewFactory<TTable, TSchema, TReturn, T>;\n options = {ttl: ttl as TTL | undefined};\n } else {\n actualFactory = undefined;\n options = {ttl: factory as TTL | undefined};\n }\n\n return this.#delegate.materialize<TTable, TSchema, TReturn, T>(\n this,\n actualFactory,\n options,\n );\n }\n}\n"],"mappings":";;;;;;;;;AA2BA,IAAM,kCAAkB,IAAI,QAI1B;AAEF,SAAgB,iBAId,UACA,QACA,OACwB;CACxB,IAAI,WAAW,gBAAgB,IAAI,QAAQ;CAC3C,IAAI,CAAC,UAAU;EACb,2BAAW,IAAI,QAAQ;EACvB,gBAAgB,IAAI,UAAU,QAAQ;CACxC;CACA,IAAI,QAAQ,SAAS,IAAI,MAAM;CAC/B,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,SAAS,IAAI,QAAQ,KAAK;CAC5B;CAEA,MAAM,WAAW,MAAM,IAAI,KAAK,GAAG,MAAM;CACzC,IAAI,UACF,OAAO;CAGT,MAAM,UAAU,IAAI,kBAClB,UACA,QACA,OACA,SAAS,KAAK,GACd,eACA,KAAA,CACF;CACA,MAAM,IAAI,OAAO,IAAI,QAAQ,OAAO,CAAC;CACrC,OAAO;AACT;AAEA,IAAa,oBAAb,MAAa,0BAKH,UAEV;CACE;CAEA,YACE,UACA,QACA,WACA,MAAqB,SAAS,SAAS,GACvC,SAAiB,eACjB,SAAiB,UACjB,eACA,iBACA;EACA,MACE,QACA,WACA,KACA,QACA,QACA,eACA,kBACC,WAAW,KAAK,QAAQ,eAAe,oBACtC,IAAI,kBACF,UACA,QACA,WACA,KACA,QACA,QACA,eACA,eACF,CACJ;EACA,KAAKA,YAAY;CACnB;CAEA,IAAa,SAAuD;EAOlE,OAAO,KAAKA,UAAU,IAA8B,MAAM,OAAO;CACnE;CAEA,QAAiB,SAIf;EACA,OAAO,KAAKA,UAAU,QAAkC,MAAM,OAAO;CACvE;CAOA,YACE,SACA,KACuC;EACvC,IAAI;EACJ,IAAI;EAEJ,IAAI,OAAO,YAAY,YAAY;GACjC,gBAAgB;GAChB,UAAU,EAAM,IAAsB;EACxC,OAAO;GACL,gBAAgB,KAAA;GAChB,UAAU,EAAC,KAAK,QAA0B;EAC5C;EAEA,OAAO,KAAKA,UAAU,YACpB,MACA,eACA,OACF;CACF;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Immutable } from '../../../shared/src/immutable.ts';
|
|
2
2
|
import type { ErroredQuery } from '../../../zero-protocol/src/custom-queries.ts';
|
|
3
3
|
import type { TTL } from './ttl.ts';
|
|
4
|
-
export type ResultType = 'unknown' | 'complete' | 'error';
|
|
4
|
+
export type ResultType = 'unknown' | 'cached' | 'complete' | 'error';
|
|
5
5
|
/**
|
|
6
6
|
* Called when the view changes. The received data should be considered
|
|
7
7
|
* immutable. Caller must not modify it. Passed data is valid until next
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-view.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/typed-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,8CAA8C,CAAC;AAC/E,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAElC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"typed-view.d.ts","sourceRoot":"","sources":["../../../../../zql/src/query/typed-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,8CAA8C,CAAC;AAC/E,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAElC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAErE;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CACxB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAClB,UAAU,EAAE,UAAU,EACtB,KAAK,CAAC,EAAE,YAAY,KACjB,IAAI,CAAC;AAEV,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;IAChB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB,CAAC"}
|