@dotdo/postgres 0.1.0
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/README.md +868 -0
- package/dist/cdc/change-stream.d.ts +44 -0
- package/dist/cdc/change-stream.d.ts.map +1 -0
- package/dist/cdc/change-stream.js +95 -0
- package/dist/cdc/change-stream.js.map +1 -0
- package/dist/cdc/filter.d.ts +58 -0
- package/dist/cdc/filter.d.ts.map +1 -0
- package/dist/cdc/filter.js +520 -0
- package/dist/cdc/filter.js.map +1 -0
- package/dist/cdc/index.d.ts +47 -0
- package/dist/cdc/index.d.ts.map +1 -0
- package/dist/cdc/index.js +50 -0
- package/dist/cdc/index.js.map +1 -0
- package/dist/cdc/resume-token.d.ts +60 -0
- package/dist/cdc/resume-token.d.ts.map +1 -0
- package/dist/cdc/resume-token.js +228 -0
- package/dist/cdc/resume-token.js.map +1 -0
- package/dist/cdc/transport/index.d.ts +7 -0
- package/dist/cdc/transport/index.d.ts.map +1 -0
- package/dist/cdc/transport/index.js +7 -0
- package/dist/cdc/transport/index.js.map +1 -0
- package/dist/cdc/transport/sse.d.ts +120 -0
- package/dist/cdc/transport/sse.d.ts.map +1 -0
- package/dist/cdc/transport/sse.js +590 -0
- package/dist/cdc/transport/sse.js.map +1 -0
- package/dist/cdc/transport/websocket.d.ts +130 -0
- package/dist/cdc/transport/websocket.d.ts.map +1 -0
- package/dist/cdc/transport/websocket.js +688 -0
- package/dist/cdc/transport/websocket.js.map +1 -0
- package/dist/cdc/types.d.ts +306 -0
- package/dist/cdc/types.d.ts.map +1 -0
- package/dist/cdc/types.js +8 -0
- package/dist/cdc/types.js.map +1 -0
- package/dist/config/index.d.ts +25 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +25 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/memory.d.ts +139 -0
- package/dist/config/memory.d.ts.map +1 -0
- package/dist/config/memory.js +157 -0
- package/dist/config/memory.js.map +1 -0
- package/dist/config/storage.d.ts +157 -0
- package/dist/config/storage.d.ts.map +1 -0
- package/dist/config/storage.js +178 -0
- package/dist/config/storage.js.map +1 -0
- package/dist/config/streaming.d.ts +117 -0
- package/dist/config/streaming.d.ts.map +1 -0
- package/dist/config/streaming.js +132 -0
- package/dist/config/streaming.js.map +1 -0
- package/dist/config/timeouts.d.ts +168 -0
- package/dist/config/timeouts.d.ts.map +1 -0
- package/dist/config/timeouts.js +192 -0
- package/dist/config/timeouts.js.map +1 -0
- package/dist/extensions/config.d.ts +89 -0
- package/dist/extensions/config.d.ts.map +1 -0
- package/dist/extensions/config.js +216 -0
- package/dist/extensions/config.js.map +1 -0
- package/dist/extensions/geo.d.ts +452 -0
- package/dist/extensions/geo.d.ts.map +1 -0
- package/dist/extensions/geo.js +583 -0
- package/dist/extensions/geo.js.map +1 -0
- package/dist/extensions/index.d.ts +167 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +99 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +226 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +456 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/pgmq-lite.d.ts +330 -0
- package/dist/extensions/pgmq-lite.d.ts.map +1 -0
- package/dist/extensions/pgmq-lite.js +648 -0
- package/dist/extensions/pgmq-lite.js.map +1 -0
- package/dist/extensions/plugins.d.ts +260 -0
- package/dist/extensions/plugins.d.ts.map +1 -0
- package/dist/extensions/plugins.js +535 -0
- package/dist/extensions/plugins.js.map +1 -0
- package/dist/extensions/registry.d.ts +93 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +182 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/vector.d.ts +106 -0
- package/dist/extensions/vector.d.ts.map +1 -0
- package/dist/extensions/vector.js +129 -0
- package/dist/extensions/vector.js.map +1 -0
- package/dist/iceberg/analytics.d.ts +279 -0
- package/dist/iceberg/analytics.d.ts.map +1 -0
- package/dist/iceberg/analytics.js +448 -0
- package/dist/iceberg/analytics.js.map +1 -0
- package/dist/iceberg/catalog-api.d.ts +39 -0
- package/dist/iceberg/catalog-api.d.ts.map +1 -0
- package/dist/iceberg/catalog-api.js +388 -0
- package/dist/iceberg/catalog-api.js.map +1 -0
- package/dist/iceberg/catalog.d.ts +401 -0
- package/dist/iceberg/catalog.d.ts.map +1 -0
- package/dist/iceberg/catalog.js +677 -0
- package/dist/iceberg/catalog.js.map +1 -0
- package/dist/iceberg/duckdb-wasm.d.ts +447 -0
- package/dist/iceberg/duckdb-wasm.d.ts.map +1 -0
- package/dist/iceberg/duckdb-wasm.js +600 -0
- package/dist/iceberg/duckdb-wasm.js.map +1 -0
- package/dist/iceberg/index.d.ts +92 -0
- package/dist/iceberg/index.d.ts.map +1 -0
- package/dist/iceberg/index.js +119 -0
- package/dist/iceberg/index.js.map +1 -0
- package/dist/iceberg/metadata.d.ts +214 -0
- package/dist/iceberg/metadata.d.ts.map +1 -0
- package/dist/iceberg/metadata.js +535 -0
- package/dist/iceberg/metadata.js.map +1 -0
- package/dist/iceberg/optimizer.d.ts +296 -0
- package/dist/iceberg/optimizer.d.ts.map +1 -0
- package/dist/iceberg/optimizer.js +889 -0
- package/dist/iceberg/optimizer.js.map +1 -0
- package/dist/iceberg/parquet.d.ts +447 -0
- package/dist/iceberg/parquet.d.ts.map +1 -0
- package/dist/iceberg/parquet.js +1225 -0
- package/dist/iceberg/parquet.js.map +1 -0
- package/dist/iceberg/r2-organization.d.ts +422 -0
- package/dist/iceberg/r2-organization.d.ts.map +1 -0
- package/dist/iceberg/r2-organization.js +672 -0
- package/dist/iceberg/r2-organization.js.map +1 -0
- package/dist/iceberg/scheduler-do-example.d.ts +158 -0
- package/dist/iceberg/scheduler-do-example.d.ts.map +1 -0
- package/dist/iceberg/scheduler-do-example.js +261 -0
- package/dist/iceberg/scheduler-do-example.js.map +1 -0
- package/dist/iceberg/scheduler.d.ts +434 -0
- package/dist/iceberg/scheduler.d.ts.map +1 -0
- package/dist/iceberg/scheduler.js +818 -0
- package/dist/iceberg/scheduler.js.map +1 -0
- package/dist/iceberg/schema.d.ts +149 -0
- package/dist/iceberg/schema.d.ts.map +1 -0
- package/dist/iceberg/schema.js +525 -0
- package/dist/iceberg/schema.js.map +1 -0
- package/dist/iceberg/snapshot-manager.d.ts +406 -0
- package/dist/iceberg/snapshot-manager.d.ts.map +1 -0
- package/dist/iceberg/snapshot-manager.js +934 -0
- package/dist/iceberg/snapshot-manager.js.map +1 -0
- package/dist/iceberg/sql-router.d.ts +194 -0
- package/dist/iceberg/sql-router.d.ts.map +1 -0
- package/dist/iceberg/sql-router.js +180 -0
- package/dist/iceberg/sql-router.js.map +1 -0
- package/dist/iceberg/test-fixtures.d.ts +151 -0
- package/dist/iceberg/test-fixtures.d.ts.map +1 -0
- package/dist/iceberg/test-fixtures.js +446 -0
- package/dist/iceberg/test-fixtures.js.map +1 -0
- package/dist/iceberg/time-travel-api.d.ts +102 -0
- package/dist/iceberg/time-travel-api.d.ts.map +1 -0
- package/dist/iceberg/time-travel-api.js +437 -0
- package/dist/iceberg/time-travel-api.js.map +1 -0
- package/dist/iceberg/time-travel.d.ts +293 -0
- package/dist/iceberg/time-travel.d.ts.map +1 -0
- package/dist/iceberg/time-travel.js +689 -0
- package/dist/iceberg/time-travel.js.map +1 -0
- package/dist/iceberg/transformer.d.ts +356 -0
- package/dist/iceberg/transformer.d.ts.map +1 -0
- package/dist/iceberg/transformer.js +770 -0
- package/dist/iceberg/transformer.js.map +1 -0
- package/dist/iceberg/types.d.ts +318 -0
- package/dist/iceberg/types.d.ts.map +1 -0
- package/dist/iceberg/types.js +9 -0
- package/dist/iceberg/types.js.map +1 -0
- package/dist/iceberg/writer.d.ts +144 -0
- package/dist/iceberg/writer.d.ts.map +1 -0
- package/dist/iceberg/writer.js +452 -0
- package/dist/iceberg/writer.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/lineage/index.d.ts +11 -0
- package/dist/lineage/index.d.ts.map +1 -0
- package/dist/lineage/index.js +11 -0
- package/dist/lineage/index.js.map +1 -0
- package/dist/lineage/integration.d.ts +134 -0
- package/dist/lineage/integration.d.ts.map +1 -0
- package/dist/lineage/integration.js +258 -0
- package/dist/lineage/integration.js.map +1 -0
- package/dist/lineage/tracker.d.ts +189 -0
- package/dist/lineage/tracker.d.ts.map +1 -0
- package/dist/lineage/tracker.js +1352 -0
- package/dist/lineage/tracker.js.map +1 -0
- package/dist/lineage/types.d.ts +318 -0
- package/dist/lineage/types.d.ts.map +1 -0
- package/dist/lineage/types.js +9 -0
- package/dist/lineage/types.js.map +1 -0
- package/dist/middleware/index.d.ts +11 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +16 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +397 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +507 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/migration-tooling/external-migration.d.ts +601 -0
- package/dist/migration-tooling/external-migration.d.ts.map +1 -0
- package/dist/migration-tooling/external-migration.js +1612 -0
- package/dist/migration-tooling/external-migration.js.map +1 -0
- package/dist/migration-tooling/index.d.ts +19 -0
- package/dist/migration-tooling/index.d.ts.map +1 -0
- package/dist/migration-tooling/index.js +19 -0
- package/dist/migration-tooling/index.js.map +1 -0
- package/dist/migrations/auto-migrator.d.ts +289 -0
- package/dist/migrations/auto-migrator.d.ts.map +1 -0
- package/dist/migrations/auto-migrator.js +396 -0
- package/dist/migrations/auto-migrator.js.map +1 -0
- package/dist/migrations/bulk-orchestrator.d.ts +403 -0
- package/dist/migrations/bulk-orchestrator.d.ts.map +1 -0
- package/dist/migrations/bulk-orchestrator.js +646 -0
- package/dist/migrations/bulk-orchestrator.js.map +1 -0
- package/dist/migrations/compatibility.d.ts +216 -0
- package/dist/migrations/compatibility.d.ts.map +1 -0
- package/dist/migrations/compatibility.js +651 -0
- package/dist/migrations/compatibility.js.map +1 -0
- package/dist/migrations/do-migrations.d.ts +101 -0
- package/dist/migrations/do-migrations.d.ts.map +1 -0
- package/dist/migrations/do-migrations.js +1060 -0
- package/dist/migrations/do-migrations.js.map +1 -0
- package/dist/migrations/do-migrations.types.d.ts +550 -0
- package/dist/migrations/do-migrations.types.d.ts.map +1 -0
- package/dist/migrations/do-migrations.types.js +15 -0
- package/dist/migrations/do-migrations.types.js.map +1 -0
- package/dist/migrations/drizzle-compat.d.ts +163 -0
- package/dist/migrations/drizzle-compat.d.ts.map +1 -0
- package/dist/migrations/drizzle-compat.js +273 -0
- package/dist/migrations/drizzle-compat.js.map +1 -0
- package/dist/migrations/index.d.ts +109 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +127 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/migration-api.d.ts +161 -0
- package/dist/migrations/migration-api.d.ts.map +1 -0
- package/dist/migrations/migration-api.js +499 -0
- package/dist/migrations/migration-api.js.map +1 -0
- package/dist/migrations/progress-tracker-do.d.ts +195 -0
- package/dist/migrations/progress-tracker-do.d.ts.map +1 -0
- package/dist/migrations/progress-tracker-do.js +339 -0
- package/dist/migrations/progress-tracker-do.js.map +1 -0
- package/dist/migrations/progress-tracker-kv.d.ts +103 -0
- package/dist/migrations/progress-tracker-kv.d.ts.map +1 -0
- package/dist/migrations/progress-tracker-kv.js +231 -0
- package/dist/migrations/progress-tracker-kv.js.map +1 -0
- package/dist/migrations/progress-tracker.d.ts +320 -0
- package/dist/migrations/progress-tracker.d.ts.map +1 -0
- package/dist/migrations/progress-tracker.js +443 -0
- package/dist/migrations/progress-tracker.js.map +1 -0
- package/dist/migrations/registry.d.ts +231 -0
- package/dist/migrations/registry.d.ts.map +1 -0
- package/dist/migrations/registry.js +376 -0
- package/dist/migrations/registry.js.map +1 -0
- package/dist/migrations/runner.d.ts +197 -0
- package/dist/migrations/runner.d.ts.map +1 -0
- package/dist/migrations/runner.js +1167 -0
- package/dist/migrations/runner.js.map +1 -0
- package/dist/migrations/schema-generator.d.ts +111 -0
- package/dist/migrations/schema-generator.d.ts.map +1 -0
- package/dist/migrations/schema-generator.js +335 -0
- package/dist/migrations/schema-generator.js.map +1 -0
- package/dist/migrations/testing.d.ts +321 -0
- package/dist/migrations/testing.d.ts.map +1 -0
- package/dist/migrations/testing.js +645 -0
- package/dist/migrations/testing.js.map +1 -0
- package/dist/migrations/types.d.ts +503 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations/types.js +11 -0
- package/dist/migrations/types.js.map +1 -0
- package/dist/migrations/validator.d.ts +215 -0
- package/dist/migrations/validator.d.ts.map +1 -0
- package/dist/migrations/validator.js +494 -0
- package/dist/migrations/validator.js.map +1 -0
- package/dist/observability/alerting.d.ts +116 -0
- package/dist/observability/alerting.d.ts.map +1 -0
- package/dist/observability/alerting.js +353 -0
- package/dist/observability/alerting.js.map +1 -0
- package/dist/observability/analytics-engine.d.ts +357 -0
- package/dist/observability/analytics-engine.d.ts.map +1 -0
- package/dist/observability/analytics-engine.js +430 -0
- package/dist/observability/analytics-engine.js.map +1 -0
- package/dist/observability/cost-metrics.d.ts +269 -0
- package/dist/observability/cost-metrics.d.ts.map +1 -0
- package/dist/observability/cost-metrics.js +560 -0
- package/dist/observability/cost-metrics.js.map +1 -0
- package/dist/observability/cross-do-tracing.d.ts +305 -0
- package/dist/observability/cross-do-tracing.d.ts.map +1 -0
- package/dist/observability/cross-do-tracing.js +431 -0
- package/dist/observability/cross-do-tracing.js.map +1 -0
- package/dist/observability/error-rate-collector.d.ts +163 -0
- package/dist/observability/error-rate-collector.d.ts.map +1 -0
- package/dist/observability/error-rate-collector.js +306 -0
- package/dist/observability/error-rate-collector.js.map +1 -0
- package/dist/observability/exporters.d.ts +231 -0
- package/dist/observability/exporters.d.ts.map +1 -0
- package/dist/observability/exporters.js +479 -0
- package/dist/observability/exporters.js.map +1 -0
- package/dist/observability/health-check.d.ts +106 -0
- package/dist/observability/health-check.d.ts.map +1 -0
- package/dist/observability/health-check.js +243 -0
- package/dist/observability/health-check.js.map +1 -0
- package/dist/observability/index.d.ts +297 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +455 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/instrumentation.d.ts +222 -0
- package/dist/observability/instrumentation.d.ts.map +1 -0
- package/dist/observability/instrumentation.js +532 -0
- package/dist/observability/instrumentation.js.map +1 -0
- package/dist/observability/memory-metrics.d.ts +227 -0
- package/dist/observability/memory-metrics.d.ts.map +1 -0
- package/dist/observability/memory-metrics.js +688 -0
- package/dist/observability/memory-metrics.js.map +1 -0
- package/dist/observability/metrics-endpoint.d.ts +91 -0
- package/dist/observability/metrics-endpoint.d.ts.map +1 -0
- package/dist/observability/metrics-endpoint.js +246 -0
- package/dist/observability/metrics-endpoint.js.map +1 -0
- package/dist/observability/metrics.d.ts +88 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +253 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/observability-features.d.ts +488 -0
- package/dist/observability/observability-features.d.ts.map +1 -0
- package/dist/observability/observability-features.js +773 -0
- package/dist/observability/observability-features.js.map +1 -0
- package/dist/observability/prometheus.d.ts +39 -0
- package/dist/observability/prometheus.d.ts.map +1 -0
- package/dist/observability/prometheus.js +120 -0
- package/dist/observability/prometheus.js.map +1 -0
- package/dist/observability/propagation.d.ts +126 -0
- package/dist/observability/propagation.d.ts.map +1 -0
- package/dist/observability/propagation.js +234 -0
- package/dist/observability/propagation.js.map +1 -0
- package/dist/observability/query-latency.d.ts +243 -0
- package/dist/observability/query-latency.d.ts.map +1 -0
- package/dist/observability/query-latency.js +292 -0
- package/dist/observability/query-latency.js.map +1 -0
- package/dist/observability/query-performance.d.ts +169 -0
- package/dist/observability/query-performance.d.ts.map +1 -0
- package/dist/observability/query-performance.js +290 -0
- package/dist/observability/query-performance.js.map +1 -0
- package/dist/observability/storage-tier-metrics.d.ts +174 -0
- package/dist/observability/storage-tier-metrics.d.ts.map +1 -0
- package/dist/observability/storage-tier-metrics.js +306 -0
- package/dist/observability/storage-tier-metrics.js.map +1 -0
- package/dist/observability/tier-cost-optimizer.d.ts +155 -0
- package/dist/observability/tier-cost-optimizer.d.ts.map +1 -0
- package/dist/observability/tier-cost-optimizer.js +536 -0
- package/dist/observability/tier-cost-optimizer.js.map +1 -0
- package/dist/observability/tracer.d.ts +149 -0
- package/dist/observability/tracer.d.ts.map +1 -0
- package/dist/observability/tracer.js +435 -0
- package/dist/observability/tracer.js.map +1 -0
- package/dist/observability/types.d.ts +402 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +103 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/pglite/workers-pglite.d.ts +138 -0
- package/dist/pglite/workers-pglite.d.ts.map +1 -0
- package/dist/pglite/workers-pglite.js +143 -0
- package/dist/pglite/workers-pglite.js.map +1 -0
- package/dist/pglite-assets/pglite.data +0 -0
- package/dist/pglite-assets/pglite.wasm +0 -0
- package/dist/playground/index.d.ts +52 -0
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/index.js +55 -0
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/keyboard-shortcuts.d.ts +116 -0
- package/dist/playground/keyboard-shortcuts.d.ts.map +1 -0
- package/dist/playground/keyboard-shortcuts.js +588 -0
- package/dist/playground/keyboard-shortcuts.js.map +1 -0
- package/dist/playground/playground.d.ts +82 -0
- package/dist/playground/playground.d.ts.map +1 -0
- package/dist/playground/playground.js +271 -0
- package/dist/playground/playground.js.map +1 -0
- package/dist/playground/query-executor.d.ts +115 -0
- package/dist/playground/query-executor.d.ts.map +1 -0
- package/dist/playground/query-executor.js +558 -0
- package/dist/playground/query-executor.js.map +1 -0
- package/dist/playground/query-history.d.ts +92 -0
- package/dist/playground/query-history.d.ts.map +1 -0
- package/dist/playground/query-history.js +259 -0
- package/dist/playground/query-history.js.map +1 -0
- package/dist/playground/result-formatter.d.ts +59 -0
- package/dist/playground/result-formatter.d.ts.map +1 -0
- package/dist/playground/result-formatter.js +341 -0
- package/dist/playground/result-formatter.js.map +1 -0
- package/dist/playground/sample-datasets.d.ts +77 -0
- package/dist/playground/sample-datasets.d.ts.map +1 -0
- package/dist/playground/sample-datasets.js +641 -0
- package/dist/playground/sample-datasets.js.map +1 -0
- package/dist/playground/sample-queries.d.ts +73 -0
- package/dist/playground/sample-queries.d.ts.map +1 -0
- package/dist/playground/sample-queries.js +1095 -0
- package/dist/playground/sample-queries.js.map +1 -0
- package/dist/playground/schema-explorer.d.ts +55 -0
- package/dist/playground/schema-explorer.d.ts.map +1 -0
- package/dist/playground/schema-explorer.js +473 -0
- package/dist/playground/schema-explorer.js.map +1 -0
- package/dist/playground/types.d.ts +430 -0
- package/dist/playground/types.d.ts.map +1 -0
- package/dist/playground/types.js +10 -0
- package/dist/playground/types.js.map +1 -0
- package/dist/readonly/cache-reader.d.ts +145 -0
- package/dist/readonly/cache-reader.d.ts.map +1 -0
- package/dist/readonly/cache-reader.js +198 -0
- package/dist/readonly/cache-reader.js.map +1 -0
- package/dist/readonly/config.d.ts +74 -0
- package/dist/readonly/config.d.ts.map +1 -0
- package/dist/readonly/config.js +67 -0
- package/dist/readonly/config.js.map +1 -0
- package/dist/readonly/index.d.ts +22 -0
- package/dist/readonly/index.d.ts.map +1 -0
- package/dist/readonly/index.js +17 -0
- package/dist/readonly/index.js.map +1 -0
- package/dist/readonly/pglite-wrapper.d.ts +82 -0
- package/dist/readonly/pglite-wrapper.d.ts.map +1 -0
- package/dist/readonly/pglite-wrapper.js +123 -0
- package/dist/readonly/pglite-wrapper.js.map +1 -0
- package/dist/readonly/worker.d.ts +142 -0
- package/dist/readonly/worker.d.ts.map +1 -0
- package/dist/readonly/worker.js +187 -0
- package/dist/readonly/worker.js.map +1 -0
- package/dist/readonly/write-blocker.d.ts +47 -0
- package/dist/readonly/write-blocker.d.ts.map +1 -0
- package/dist/readonly/write-blocker.js +136 -0
- package/dist/readonly/write-blocker.js.map +1 -0
- package/dist/recovery/disaster-recovery.d.ts +326 -0
- package/dist/recovery/disaster-recovery.d.ts.map +1 -0
- package/dist/recovery/disaster-recovery.js +799 -0
- package/dist/recovery/disaster-recovery.js.map +1 -0
- package/dist/recovery/index.d.ts +12 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +12 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/recovery/parquet-parser.d.ts +321 -0
- package/dist/recovery/parquet-parser.d.ts.map +1 -0
- package/dist/recovery/parquet-parser.js +797 -0
- package/dist/recovery/parquet-parser.js.map +1 -0
- package/dist/retention/index.d.ts +50 -0
- package/dist/retention/index.d.ts.map +1 -0
- package/dist/retention/index.js +50 -0
- package/dist/retention/index.js.map +1 -0
- package/dist/retention/policy.d.ts +344 -0
- package/dist/retention/policy.d.ts.map +1 -0
- package/dist/retention/policy.js +472 -0
- package/dist/retention/policy.js.map +1 -0
- package/dist/retention/purger.d.ts +187 -0
- package/dist/retention/purger.d.ts.map +1 -0
- package/dist/retention/purger.js +411 -0
- package/dist/retention/purger.js.map +1 -0
- package/dist/rls/auth-integration.d.ts +280 -0
- package/dist/rls/auth-integration.d.ts.map +1 -0
- package/dist/rls/auth-integration.js +399 -0
- package/dist/rls/auth-integration.js.map +1 -0
- package/dist/rls/generator.d.ts +249 -0
- package/dist/rls/generator.d.ts.map +1 -0
- package/dist/rls/generator.js +495 -0
- package/dist/rls/generator.js.map +1 -0
- package/dist/rls/index.d.ts +26 -0
- package/dist/rls/index.d.ts.map +1 -0
- package/dist/rls/index.js +58 -0
- package/dist/rls/index.js.map +1 -0
- package/dist/rls/policy.d.ts +116 -0
- package/dist/rls/policy.d.ts.map +1 -0
- package/dist/rls/policy.js +77 -0
- package/dist/rls/policy.js.map +1 -0
- package/dist/rls/validator.d.ts +155 -0
- package/dist/rls/validator.d.ts.map +1 -0
- package/dist/rls/validator.js +792 -0
- package/dist/rls/validator.js.map +1 -0
- package/dist/routing/adaptive-router.d.ts +317 -0
- package/dist/routing/adaptive-router.d.ts.map +1 -0
- package/dist/routing/adaptive-router.js +554 -0
- package/dist/routing/adaptive-router.js.map +1 -0
- package/dist/routing/circuit-breaker.d.ts +339 -0
- package/dist/routing/circuit-breaker.d.ts.map +1 -0
- package/dist/routing/circuit-breaker.js +620 -0
- package/dist/routing/circuit-breaker.js.map +1 -0
- package/dist/routing/cost-metrics.d.ts +133 -0
- package/dist/routing/cost-metrics.d.ts.map +1 -0
- package/dist/routing/cost-metrics.js +259 -0
- package/dist/routing/cost-metrics.js.map +1 -0
- package/dist/routing/do-connection-pool.d.ts +243 -0
- package/dist/routing/do-connection-pool.d.ts.map +1 -0
- package/dist/routing/do-connection-pool.js +572 -0
- package/dist/routing/do-connection-pool.js.map +1 -0
- package/dist/routing/index.d.ts +59 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +59 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/query-complexity-estimator.d.ts +73 -0
- package/dist/routing/query-complexity-estimator.d.ts.map +1 -0
- package/dist/routing/query-complexity-estimator.js +327 -0
- package/dist/routing/query-complexity-estimator.js.map +1 -0
- package/dist/routing/request-coalescing.d.ts +178 -0
- package/dist/routing/request-coalescing.d.ts.map +1 -0
- package/dist/routing/request-coalescing.js +325 -0
- package/dist/routing/request-coalescing.js.map +1 -0
- package/dist/routing/runtime-router.d.ts +107 -0
- package/dist/routing/runtime-router.d.ts.map +1 -0
- package/dist/routing/runtime-router.js +246 -0
- package/dist/routing/runtime-router.js.map +1 -0
- package/dist/routing/tenant-router.d.ts +848 -0
- package/dist/routing/tenant-router.d.ts.map +1 -0
- package/dist/routing/tenant-router.js +1056 -0
- package/dist/routing/tenant-router.js.map +1 -0
- package/dist/routing/websocket-pool.d.ts +119 -0
- package/dist/routing/websocket-pool.d.ts.map +1 -0
- package/dist/routing/websocket-pool.js +436 -0
- package/dist/routing/websocket-pool.js.map +1 -0
- package/dist/storage/cache-layer.d.ts +159 -0
- package/dist/storage/cache-layer.d.ts.map +1 -0
- package/dist/storage/cache-layer.js +245 -0
- package/dist/storage/cache-layer.js.map +1 -0
- package/dist/storage/cost-aware-tiering.d.ts +258 -0
- package/dist/storage/cost-aware-tiering.d.ts.map +1 -0
- package/dist/storage/cost-aware-tiering.js +526 -0
- package/dist/storage/cost-aware-tiering.js.map +1 -0
- package/dist/storage/index.d.ts +87 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +78 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interfaces.d.ts +856 -0
- package/dist/storage/interfaces.d.ts.map +1 -0
- package/dist/storage/interfaces.js +69 -0
- package/dist/storage/interfaces.js.map +1 -0
- package/dist/storage/r2-layer.d.ts +226 -0
- package/dist/storage/r2-layer.d.ts.map +1 -0
- package/dist/storage/r2-layer.js +307 -0
- package/dist/storage/r2-layer.js.map +1 -0
- package/dist/storage/r2-overflow.d.ts +344 -0
- package/dist/storage/r2-overflow.d.ts.map +1 -0
- package/dist/storage/r2-overflow.js +730 -0
- package/dist/storage/r2-overflow.js.map +1 -0
- package/dist/storage/r2-page-vfs.d.ts +374 -0
- package/dist/storage/r2-page-vfs.d.ts.map +1 -0
- package/dist/storage/r2-page-vfs.js +754 -0
- package/dist/storage/r2-page-vfs.js.map +1 -0
- package/dist/storage/swr-cache.d.ts +181 -0
- package/dist/storage/swr-cache.d.ts.map +1 -0
- package/dist/storage/swr-cache.js +295 -0
- package/dist/storage/swr-cache.js.map +1 -0
- package/dist/storage/tiered-orchestrator.d.ts +951 -0
- package/dist/storage/tiered-orchestrator.d.ts.map +1 -0
- package/dist/storage/tiered-orchestrator.js +1731 -0
- package/dist/storage/tiered-orchestrator.js.map +1 -0
- package/dist/storage/tiered-vfs-swr.d.ts +279 -0
- package/dist/storage/tiered-vfs-swr.d.ts.map +1 -0
- package/dist/storage/tiered-vfs-swr.js +584 -0
- package/dist/storage/tiered-vfs-swr.js.map +1 -0
- package/dist/storage/tiered-vfs.d.ts +405 -0
- package/dist/storage/tiered-vfs.d.ts.map +1 -0
- package/dist/storage/tiered-vfs.js +833 -0
- package/dist/storage/tiered-vfs.js.map +1 -0
- package/dist/streaming/backpressure-controller.d.ts +173 -0
- package/dist/streaming/backpressure-controller.d.ts.map +1 -0
- package/dist/streaming/backpressure-controller.js +344 -0
- package/dist/streaming/backpressure-controller.js.map +1 -0
- package/dist/streaming/buffer-pool.d.ts +241 -0
- package/dist/streaming/buffer-pool.d.ts.map +1 -0
- package/dist/streaming/buffer-pool.js +381 -0
- package/dist/streaming/buffer-pool.js.map +1 -0
- package/dist/streaming/cdc-iceberg-connector.d.ts +272 -0
- package/dist/streaming/cdc-iceberg-connector.d.ts.map +1 -0
- package/dist/streaming/cdc-iceberg-connector.js +408 -0
- package/dist/streaming/cdc-iceberg-connector.js.map +1 -0
- package/dist/streaming/index.d.ts +111 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +128 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/live-cdc-stream.d.ts +400 -0
- package/dist/streaming/live-cdc-stream.d.ts.map +1 -0
- package/dist/streaming/live-cdc-stream.js +703 -0
- package/dist/streaming/live-cdc-stream.js.map +1 -0
- package/dist/streaming/memory-bounded-stream.d.ts +207 -0
- package/dist/streaming/memory-bounded-stream.d.ts.map +1 -0
- package/dist/streaming/memory-bounded-stream.js +340 -0
- package/dist/streaming/memory-bounded-stream.js.map +1 -0
- package/dist/streaming/query-streamer.d.ts +379 -0
- package/dist/streaming/query-streamer.d.ts.map +1 -0
- package/dist/streaming/query-streamer.js +495 -0
- package/dist/streaming/query-streamer.js.map +1 -0
- package/dist/streaming/response-streaming.d.ts +203 -0
- package/dist/streaming/response-streaming.d.ts.map +1 -0
- package/dist/streaming/response-streaming.js +449 -0
- package/dist/streaming/response-streaming.js.map +1 -0
- package/dist/types/branded.d.ts +859 -0
- package/dist/types/branded.d.ts.map +1 -0
- package/dist/types/branded.js +891 -0
- package/dist/types/branded.js.map +1 -0
- package/dist/types/utilities.d.ts +757 -0
- package/dist/types/utilities.d.ts.map +1 -0
- package/dist/types/utilities.js +447 -0
- package/dist/types/utilities.js.map +1 -0
- package/dist/wal/replay-engine.d.ts +344 -0
- package/dist/wal/replay-engine.d.ts.map +1 -0
- package/dist/wal/replay-engine.js +975 -0
- package/dist/wal/replay-engine.js.map +1 -0
- package/dist/worker/__mocks__/capnweb.d.ts +13 -0
- package/dist/worker/__mocks__/capnweb.d.ts.map +1 -0
- package/dist/worker/__mocks__/capnweb.js +15 -0
- package/dist/worker/__mocks__/capnweb.js.map +1 -0
- package/dist/worker/__mocks__/cloudflare-workers.d.ts +31 -0
- package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +1 -0
- package/dist/worker/__mocks__/cloudflare-workers.js +33 -0
- package/dist/worker/__mocks__/cloudflare-workers.js.map +1 -0
- package/dist/worker/__mocks__/pglite.data.d.ts +3 -0
- package/dist/worker/__mocks__/pglite.data.d.ts.map +1 -0
- package/dist/worker/__mocks__/pglite.data.js +20 -0
- package/dist/worker/__mocks__/pglite.data.js.map +1 -0
- package/dist/worker/__mocks__/pglite.wasm.d.ts +3 -0
- package/dist/worker/__mocks__/pglite.wasm.d.ts.map +1 -0
- package/dist/worker/__mocks__/pglite.wasm.js +30 -0
- package/dist/worker/__mocks__/pglite.wasm.js.map +1 -0
- package/dist/worker/auth-rate-limiter.d.ts +270 -0
- package/dist/worker/auth-rate-limiter.d.ts.map +1 -0
- package/dist/worker/auth-rate-limiter.js +332 -0
- package/dist/worker/auth-rate-limiter.js.map +1 -0
- package/dist/worker/auth.d.ts +345 -0
- package/dist/worker/auth.d.ts.map +1 -0
- package/dist/worker/auth.js +837 -0
- package/dist/worker/auth.js.map +1 -0
- package/dist/worker/cdc-backpressure.d.ts +338 -0
- package/dist/worker/cdc-backpressure.d.ts.map +1 -0
- package/dist/worker/cdc-backpressure.js +619 -0
- package/dist/worker/cdc-backpressure.js.map +1 -0
- package/dist/worker/cdc-sse.d.ts +277 -0
- package/dist/worker/cdc-sse.d.ts.map +1 -0
- package/dist/worker/cdc-sse.js +528 -0
- package/dist/worker/cdc-sse.js.map +1 -0
- package/dist/worker/cdc-websocket.d.ts +252 -0
- package/dist/worker/cdc-websocket.d.ts.map +1 -0
- package/dist/worker/cdc-websocket.js +940 -0
- package/dist/worker/cdc-websocket.js.map +1 -0
- package/dist/worker/cdc.d.ts +95 -0
- package/dist/worker/cdc.d.ts.map +1 -0
- package/dist/worker/cdc.js +211 -0
- package/dist/worker/cdc.js.map +1 -0
- package/dist/worker/concerns/auth-concern.d.ts +50 -0
- package/dist/worker/concerns/auth-concern.d.ts.map +1 -0
- package/dist/worker/concerns/auth-concern.js +131 -0
- package/dist/worker/concerns/auth-concern.js.map +1 -0
- package/dist/worker/concerns/cdc-concern.d.ts +99 -0
- package/dist/worker/concerns/cdc-concern.d.ts.map +1 -0
- package/dist/worker/concerns/cdc-concern.js +137 -0
- package/dist/worker/concerns/cdc-concern.js.map +1 -0
- package/dist/worker/concerns/index.d.ts +22 -0
- package/dist/worker/concerns/index.d.ts.map +1 -0
- package/dist/worker/concerns/index.js +13 -0
- package/dist/worker/concerns/index.js.map +1 -0
- package/dist/worker/concerns/query-execution-concern.d.ts +104 -0
- package/dist/worker/concerns/query-execution-concern.d.ts.map +1 -0
- package/dist/worker/concerns/query-execution-concern.js +95 -0
- package/dist/worker/concerns/query-execution-concern.js.map +1 -0
- package/dist/worker/concerns/storage-orchestration-concern.d.ts +78 -0
- package/dist/worker/concerns/storage-orchestration-concern.d.ts.map +1 -0
- package/dist/worker/concerns/storage-orchestration-concern.js +240 -0
- package/dist/worker/concerns/storage-orchestration-concern.js.map +1 -0
- package/dist/worker/do-auth-manager.d.ts +108 -0
- package/dist/worker/do-auth-manager.d.ts.map +1 -0
- package/dist/worker/do-auth-manager.js +212 -0
- package/dist/worker/do-auth-manager.js.map +1 -0
- package/dist/worker/do-pglite-manager.d.ts +137 -0
- package/dist/worker/do-pglite-manager.d.ts.map +1 -0
- package/dist/worker/do-pglite-manager.js +228 -0
- package/dist/worker/do-pglite-manager.js.map +1 -0
- package/dist/worker/do.d.ts +556 -0
- package/dist/worker/do.d.ts.map +1 -0
- package/dist/worker/do.js +1441 -0
- package/dist/worker/do.js.map +1 -0
- package/dist/worker/entry.d.ts +23 -0
- package/dist/worker/entry.d.ts.map +1 -0
- package/dist/worker/entry.js +362 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker/errors.d.ts +106 -0
- package/dist/worker/errors.d.ts.map +1 -0
- package/dist/worker/errors.js +178 -0
- package/dist/worker/errors.js.map +1 -0
- package/dist/worker/health-check-manager.d.ts +141 -0
- package/dist/worker/health-check-manager.d.ts.map +1 -0
- package/dist/worker/health-check-manager.js +145 -0
- package/dist/worker/health-check-manager.js.map +1 -0
- package/dist/worker/index.d.ts +60 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +67 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/memory-pressure.d.ts +892 -0
- package/dist/worker/memory-pressure.d.ts.map +1 -0
- package/dist/worker/memory-pressure.js +1990 -0
- package/dist/worker/memory-pressure.js.map +1 -0
- package/dist/worker/migration-manager.d.ts +153 -0
- package/dist/worker/migration-manager.d.ts.map +1 -0
- package/dist/worker/migration-manager.js +461 -0
- package/dist/worker/migration-manager.js.map +1 -0
- package/dist/worker/plugin-manager.d.ts +147 -0
- package/dist/worker/plugin-manager.d.ts.map +1 -0
- package/dist/worker/plugin-manager.js +408 -0
- package/dist/worker/plugin-manager.js.map +1 -0
- package/dist/worker/proxy.d.ts +330 -0
- package/dist/worker/proxy.d.ts.map +1 -0
- package/dist/worker/proxy.js +504 -0
- package/dist/worker/proxy.js.map +1 -0
- package/dist/worker/query-execution-manager.d.ts +107 -0
- package/dist/worker/query-execution-manager.d.ts.map +1 -0
- package/dist/worker/query-execution-manager.js +155 -0
- package/dist/worker/query-execution-manager.js.map +1 -0
- package/dist/worker/query-executor.d.ts +163 -0
- package/dist/worker/query-executor.d.ts.map +1 -0
- package/dist/worker/query-executor.js +413 -0
- package/dist/worker/query-executor.js.map +1 -0
- package/dist/worker/query-stats-manager.d.ts +117 -0
- package/dist/worker/query-stats-manager.d.ts.map +1 -0
- package/dist/worker/query-stats-manager.js +162 -0
- package/dist/worker/query-stats-manager.js.map +1 -0
- package/dist/worker/result-handler.d.ts +192 -0
- package/dist/worker/result-handler.d.ts.map +1 -0
- package/dist/worker/result-handler.js +346 -0
- package/dist/worker/result-handler.js.map +1 -0
- package/dist/worker/routes.d.ts +135 -0
- package/dist/worker/routes.d.ts.map +1 -0
- package/dist/worker/routes.js +460 -0
- package/dist/worker/routes.js.map +1 -0
- package/dist/worker/rpc-methods-manager.d.ts +142 -0
- package/dist/worker/rpc-methods-manager.d.ts.map +1 -0
- package/dist/worker/rpc-methods-manager.js +195 -0
- package/dist/worker/rpc-methods-manager.js.map +1 -0
- package/dist/worker/rpc.d.ts +259 -0
- package/dist/worker/rpc.d.ts.map +1 -0
- package/dist/worker/rpc.js +398 -0
- package/dist/worker/rpc.js.map +1 -0
- package/dist/worker/schema-version.d.ts +209 -0
- package/dist/worker/schema-version.d.ts.map +1 -0
- package/dist/worker/schema-version.js +450 -0
- package/dist/worker/schema-version.js.map +1 -0
- package/dist/worker/session-manager.d.ts +282 -0
- package/dist/worker/session-manager.d.ts.map +1 -0
- package/dist/worker/session-manager.js +523 -0
- package/dist/worker/session-manager.js.map +1 -0
- package/dist/worker/shutdown-manager.d.ts +188 -0
- package/dist/worker/shutdown-manager.d.ts.map +1 -0
- package/dist/worker/shutdown-manager.js +347 -0
- package/dist/worker/shutdown-manager.js.map +1 -0
- package/dist/worker/sql-transform.d.ts +61 -0
- package/dist/worker/sql-transform.d.ts.map +1 -0
- package/dist/worker/sql-transform.js +312 -0
- package/dist/worker/sql-transform.js.map +1 -0
- package/dist/worker/types.d.ts +738 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +6 -0
- package/dist/worker/types.js.map +1 -0
- package/dist/worker/user-routes.d.ts +76 -0
- package/dist/worker/user-routes.d.ts.map +1 -0
- package/dist/worker/user-routes.js +188 -0
- package/dist/worker/user-routes.js.map +1 -0
- package/dist/worker/wal-facade.d.ts +138 -0
- package/dist/worker/wal-facade.d.ts.map +1 -0
- package/dist/worker/wal-facade.js +184 -0
- package/dist/worker/wal-facade.js.map +1 -0
- package/dist/worker/wal-r2.d.ts +271 -0
- package/dist/worker/wal-r2.d.ts.map +1 -0
- package/dist/worker/wal-r2.js +689 -0
- package/dist/worker/wal-r2.js.map +1 -0
- package/dist/worker/wal-replay.d.ts +361 -0
- package/dist/worker/wal-replay.d.ts.map +1 -0
- package/dist/worker/wal-replay.js +628 -0
- package/dist/worker/wal-replay.js.map +1 -0
- package/dist/worker/wal-retention.d.ts +389 -0
- package/dist/worker/wal-retention.d.ts.map +1 -0
- package/dist/worker/wal-retention.js +763 -0
- package/dist/worker/wal-retention.js.map +1 -0
- package/dist/worker/wal.d.ts +278 -0
- package/dist/worker/wal.d.ts.map +1 -0
- package/dist/worker/wal.js +467 -0
- package/dist/worker/wal.js.map +1 -0
- package/dist/worker/websocket.d.ts +85 -0
- package/dist/worker/websocket.d.ts.map +1 -0
- package/dist/worker/websocket.js +227 -0
- package/dist/worker/websocket.js.map +1 -0
- package/package.json +108 -0
- package/src/cdc/change-stream.ts +137 -0
- package/src/cdc/filter.ts +646 -0
- package/src/cdc/index.ts +112 -0
- package/src/cdc/resume-token.ts +280 -0
- package/src/cdc/transport/index.ts +7 -0
- package/src/cdc/transport/sse.ts +723 -0
- package/src/cdc/transport/websocket.ts +873 -0
- package/src/cdc/types.ts +346 -0
- package/src/config/index.ts +25 -0
- package/src/config/memory.ts +177 -0
- package/src/config/storage.ts +204 -0
- package/src/config/streaming.ts +147 -0
- package/src/config/timeouts.ts +221 -0
- package/src/extensions/config.test.ts +187 -0
- package/src/extensions/config.ts +278 -0
- package/src/extensions/geo.test.ts +455 -0
- package/src/extensions/geo.ts +858 -0
- package/src/extensions/index.test.ts +259 -0
- package/src/extensions/index.ts +227 -0
- package/src/extensions/loader.test.ts +555 -0
- package/src/extensions/loader.ts +588 -0
- package/src/extensions/pgmq-lite.test.ts +727 -0
- package/src/extensions/pgmq-lite.ts +770 -0
- package/src/extensions/plugins.test.ts +528 -0
- package/src/extensions/plugins.ts +718 -0
- package/src/extensions/registry.test.ts +202 -0
- package/src/extensions/registry.ts +267 -0
- package/src/extensions/vector.test.ts +195 -0
- package/src/extensions/vector.ts +217 -0
- package/src/iceberg/SCHEDULER.md +580 -0
- package/src/iceberg/analytics.test.ts +703 -0
- package/src/iceberg/analytics.ts +727 -0
- package/src/iceberg/catalog-api.test.ts +838 -0
- package/src/iceberg/catalog-api.ts +520 -0
- package/src/iceberg/catalog.test.ts +680 -0
- package/src/iceberg/catalog.ts +1007 -0
- package/src/iceberg/iceberg.test.ts +705 -0
- package/src/iceberg/index.ts +406 -0
- package/src/iceberg/metadata.test.ts +632 -0
- package/src/iceberg/metadata.ts +649 -0
- package/src/iceberg/optimizer.test.ts +868 -0
- package/src/iceberg/optimizer.ts +1287 -0
- package/src/iceberg/parquet.test.ts +899 -0
- package/src/iceberg/parquet.ts +1640 -0
- package/src/iceberg/r2-organization.test.ts +615 -0
- package/src/iceberg/r2-organization.ts +951 -0
- package/src/iceberg/scheduler-do-example.ts +364 -0
- package/src/iceberg/scheduler.test.ts +861 -0
- package/src/iceberg/scheduler.ts +1201 -0
- package/src/iceberg/schema.test.ts +547 -0
- package/src/iceberg/schema.ts +616 -0
- package/src/iceberg/snapshot-manager.test.ts +919 -0
- package/src/iceberg/snapshot-manager.ts +1369 -0
- package/src/iceberg/sql-router.test.ts +334 -0
- package/src/iceberg/sql-router.ts +337 -0
- package/src/iceberg/test-fixtures.ts +605 -0
- package/src/iceberg/time-travel-api.test.ts +1029 -0
- package/src/iceberg/time-travel-api.ts +731 -0
- package/src/iceberg/time-travel.test.ts +1218 -0
- package/src/iceberg/time-travel.ts +1052 -0
- package/src/iceberg/transformer.test.ts +689 -0
- package/src/iceberg/transformer.ts +1029 -0
- package/src/iceberg/types.ts +373 -0
- package/src/iceberg/writer.test.ts +716 -0
- package/src/iceberg/writer.ts +590 -0
- package/src/index.ts +212 -0
- package/src/lineage/index.ts +42 -0
- package/src/lineage/integration.ts +334 -0
- package/src/lineage/tracker.ts +1618 -0
- package/src/lineage/types.ts +354 -0
- package/src/middleware/index.ts +36 -0
- package/src/middleware/rate-limit-concurrent.test.ts +794 -0
- package/src/middleware/rate-limit.test.ts +1568 -0
- package/src/middleware/rate-limit.ts +840 -0
- package/src/migration-tooling/external-migration.test.ts +1864 -0
- package/src/migration-tooling/external-migration.ts +2355 -0
- package/src/migration-tooling/index.ts +19 -0
- package/src/migrations/ARCHITECTURE.md +474 -0
- package/src/migrations/PROGRESS_TRACKING.md +485 -0
- package/src/migrations/auto-migrator.test.ts +732 -0
- package/src/migrations/auto-migrator.ts +531 -0
- package/src/migrations/bulk-orchestrator.test.ts +801 -0
- package/src/migrations/bulk-orchestrator.ts +1039 -0
- package/src/migrations/compatibility.test.ts +958 -0
- package/src/migrations/compatibility.ts +902 -0
- package/src/migrations/do-migrations.test.ts +2620 -0
- package/src/migrations/do-migrations.ts +1289 -0
- package/src/migrations/do-migrations.types.ts +715 -0
- package/src/migrations/drizzle-compat.test.ts +210 -0
- package/src/migrations/drizzle-compat.ts +337 -0
- package/src/migrations/index.ts +334 -0
- package/src/migrations/migration-api.test.ts +438 -0
- package/src/migrations/migration-api.ts +704 -0
- package/src/migrations/progress-tracker-do.ts +518 -0
- package/src/migrations/progress-tracker-kv.ts +305 -0
- package/src/migrations/progress-tracker.test.ts +937 -0
- package/src/migrations/progress-tracker.ts +665 -0
- package/src/migrations/registry.test.ts +331 -0
- package/src/migrations/registry.ts +468 -0
- package/src/migrations/rollback.test.ts +644 -0
- package/src/migrations/runner.test.ts +807 -0
- package/src/migrations/runner.test.ts.backup +759 -0
- package/src/migrations/runner.ts +1459 -0
- package/src/migrations/schema-generator.test.ts +649 -0
- package/src/migrations/schema-generator.ts +513 -0
- package/src/migrations/testing.ts +1037 -0
- package/src/migrations/types.ts +573 -0
- package/src/migrations/validator.test.ts +660 -0
- package/src/migrations/validator.ts +741 -0
- package/src/observability/alerting.test.ts +1133 -0
- package/src/observability/alerting.ts +455 -0
- package/src/observability/analytics-engine.ts +733 -0
- package/src/observability/cost-metrics.ts +804 -0
- package/src/observability/cross-do-tracing.test.ts +516 -0
- package/src/observability/cross-do-tracing.ts +588 -0
- package/src/observability/dashboards/postgres-do-overview.json +1656 -0
- package/src/observability/error-rate-collector.test.ts +977 -0
- package/src/observability/error-rate-collector.ts +518 -0
- package/src/observability/exporters.test.ts +365 -0
- package/src/observability/exporters.ts +650 -0
- package/src/observability/health-check.test.ts +353 -0
- package/src/observability/health-check.ts +341 -0
- package/src/observability/index.test.ts +298 -0
- package/src/observability/index.ts +885 -0
- package/src/observability/instrumentation.test.ts +428 -0
- package/src/observability/instrumentation.ts +788 -0
- package/src/observability/memory-metrics.test.ts +355 -0
- package/src/observability/memory-metrics.ts +990 -0
- package/src/observability/metrics-endpoint.test.ts +402 -0
- package/src/observability/metrics-endpoint.ts +374 -0
- package/src/observability/metrics.test.ts +291 -0
- package/src/observability/metrics.ts +315 -0
- package/src/observability/observability-features.ts +1296 -0
- package/src/observability/prometheus.test.ts +292 -0
- package/src/observability/prometheus.ts +170 -0
- package/src/observability/propagation.test.ts +417 -0
- package/src/observability/propagation.ts +294 -0
- package/src/observability/query-latency.ts +586 -0
- package/src/observability/query-performance.test.ts +406 -0
- package/src/observability/query-performance.ts +491 -0
- package/src/observability/storage-tier-metrics.test.ts +633 -0
- package/src/observability/storage-tier-metrics.ts +570 -0
- package/src/observability/tier-cost-optimizer.ts +740 -0
- package/src/observability/tracer.test.ts +346 -0
- package/src/observability/tracer.ts +585 -0
- package/src/observability/types.test.ts +726 -0
- package/src/observability/types.ts +434 -0
- package/src/pglite/auto-demotion.test.ts +477 -0
- package/src/pglite/auto-demotion.ts +385 -0
- package/src/pglite/auto-promotion.test.ts +824 -0
- package/src/pglite/auto-promotion.ts +547 -0
- package/src/pglite/cache-layer.test.ts +469 -0
- package/src/pglite/cache-layer.ts +271 -0
- package/src/pglite/cold-start-manager.ts +1260 -0
- package/src/pglite/cold-start-optimizer.test.ts +937 -0
- package/src/pglite/cold-start-optimizer.ts +1895 -0
- package/src/pglite/dovfs-adapter.ts +1122 -0
- package/src/pglite/dovfs.ts +1258 -0
- package/src/pglite/etag-cache.test.ts +844 -0
- package/src/pglite/etag-cache.ts +526 -0
- package/src/pglite/index.ts +442 -0
- package/src/pglite/init.test.ts +455 -0
- package/src/pglite/init.ts +574 -0
- package/src/pglite/lifecycle.test.ts +599 -0
- package/src/pglite/lifecycle.ts +704 -0
- package/src/pglite/parallel-loader.test.ts +586 -0
- package/src/pglite/parallel-loader.ts +481 -0
- package/src/pglite/production-pglite.test.ts +666 -0
- package/src/pglite/production-pglite.ts +537 -0
- package/src/pglite/query-executor.ts +614 -0
- package/src/pglite/r2-layer.test.ts +501 -0
- package/src/pglite/r2-layer.ts +322 -0
- package/src/pglite/tiered-init.test.ts +725 -0
- package/src/pglite/tiered-init.ts +556 -0
- package/src/pglite/tiered-vfs.test.ts +726 -0
- package/src/pglite/tiered-vfs.ts +33 -0
- package/src/pglite/tiering-stats.test.ts +531 -0
- package/src/pglite/tiering-stats.ts +407 -0
- package/src/pglite/transaction-hooks.ts +343 -0
- package/src/pglite/warm-loader.test.ts +1701 -0
- package/src/pglite/warm-loader.ts +528 -0
- package/src/pglite/workers-pglite.ts +224 -0
- package/src/pglite-assets/pglite.data +0 -0
- package/src/pglite-assets/pglite.wasm +0 -0
- package/src/pglite.d.ts +47 -0
- package/src/playground/index.ts +137 -0
- package/src/playground/keyboard-shortcuts.ts +677 -0
- package/src/playground/playground.ts +323 -0
- package/src/playground/query-executor.ts +669 -0
- package/src/playground/query-history.ts +328 -0
- package/src/playground/result-formatter.ts +420 -0
- package/src/playground/sample-datasets.ts +674 -0
- package/src/playground/sample-queries.ts +1168 -0
- package/src/playground/schema-explorer.ts +558 -0
- package/src/playground/types.ts +518 -0
- package/src/readonly/cache-reader.test.ts +460 -0
- package/src/readonly/cache-reader.ts +313 -0
- package/src/readonly/config.test.ts +187 -0
- package/src/readonly/config.ts +128 -0
- package/src/readonly/index.ts +50 -0
- package/src/readonly/pglite-wrapper.test.ts +278 -0
- package/src/readonly/pglite-wrapper.ts +184 -0
- package/src/readonly/worker.test.ts +533 -0
- package/src/readonly/worker.ts +341 -0
- package/src/readonly/write-blocker.test.ts +459 -0
- package/src/readonly/write-blocker.ts +175 -0
- package/src/recovery/disaster-recovery.test.ts +618 -0
- package/src/recovery/disaster-recovery.ts +1181 -0
- package/src/recovery/index.ts +43 -0
- package/src/recovery/parquet-parser.ts +974 -0
- package/src/retention/index.ts +74 -0
- package/src/retention/policy.test.ts +571 -0
- package/src/retention/policy.ts +774 -0
- package/src/retention/purger.test.ts +465 -0
- package/src/retention/purger.ts +558 -0
- package/src/rls/auth-integration.test.ts +752 -0
- package/src/rls/auth-integration.ts +533 -0
- package/src/rls/generator.test.ts +829 -0
- package/src/rls/generator.ts +573 -0
- package/src/rls/index.ts +128 -0
- package/src/rls/policy.ts +208 -0
- package/src/rls/rls.test.ts +1071 -0
- package/src/rls/validator.test.ts +930 -0
- package/src/rls/validator.ts +895 -0
- package/src/routing/adaptive-router.test.ts +884 -0
- package/src/routing/adaptive-router.ts +845 -0
- package/src/routing/circuit-breaker.test.ts +1505 -0
- package/src/routing/circuit-breaker.ts +852 -0
- package/src/routing/cost-metrics.test.ts +565 -0
- package/src/routing/cost-metrics.ts +408 -0
- package/src/routing/do-connection-pool.test.ts +1109 -0
- package/src/routing/do-connection-pool.ts +828 -0
- package/src/routing/index.ts +158 -0
- package/src/routing/query-complexity-estimator.test.ts +356 -0
- package/src/routing/query-complexity-estimator.ts +444 -0
- package/src/routing/request-coalescing.test.ts +738 -0
- package/src/routing/request-coalescing.ts +475 -0
- package/src/routing/runtime-router.test.ts +436 -0
- package/src/routing/runtime-router.ts +357 -0
- package/src/routing/tenant-router.test.ts +2493 -0
- package/src/routing/tenant-router.ts +1908 -0
- package/src/routing/websocket-pool.test.ts +551 -0
- package/src/routing/websocket-pool.ts +577 -0
- package/src/storage/access-pattern-tracker.test.ts +874 -0
- package/src/storage/cache-layer.test.ts +560 -0
- package/src/storage/cache-layer.ts +328 -0
- package/src/storage/cost-aware-tiering.test.ts +652 -0
- package/src/storage/cost-aware-tiering.ts +794 -0
- package/src/storage/do-sqlite-blobs.test.ts +937 -0
- package/src/storage/index.ts +272 -0
- package/src/storage/interfaces.ts +974 -0
- package/src/storage/r2-layer.test.ts +653 -0
- package/src/storage/r2-layer.ts +434 -0
- package/src/storage/r2-overflow.ts +920 -0
- package/src/storage/r2-page-vfs.test.ts +2348 -0
- package/src/storage/r2-page-vfs.ts +1054 -0
- package/src/storage/swr-cache.test.ts +832 -0
- package/src/storage/swr-cache.ts +398 -0
- package/src/storage/swr-tiered-integration.test.ts +617 -0
- package/src/storage/tiered-orchestrator.test.ts +2441 -0
- package/src/storage/tiered-orchestrator.ts +2081 -0
- package/src/storage/tiered-vfs-swr.test.ts +736 -0
- package/src/storage/tiered-vfs-swr.ts +735 -0
- package/src/storage/tiered-vfs.test.ts +793 -0
- package/src/storage/tiered-vfs.ts +1082 -0
- package/src/streaming/backpressure-controller.ts +452 -0
- package/src/streaming/buffer-pool.ts +484 -0
- package/src/streaming/cdc-iceberg-connector.ts +605 -0
- package/src/streaming/index.ts +225 -0
- package/src/streaming/live-cdc-stream.ts +985 -0
- package/src/streaming/memory-bounded-stream.ts +443 -0
- package/src/streaming/query-streamer.ts +662 -0
- package/src/streaming/response-streaming.ts +557 -0
- package/src/types/branded.ts +1075 -0
- package/src/types/branded.ts.backup +273 -0
- package/src/types/utilities.ts +1023 -0
- package/src/types/wasm.d.ts +30 -0
- package/src/validation/typed-errors.test.ts +420 -0
- package/src/wal/replay-engine.ts +1264 -0
- package/src/worker/__mocks__/capnweb.ts +15 -0
- package/src/worker/__mocks__/pglite.data.ts +22 -0
- package/src/worker/__mocks__/pglite.wasm.ts +33 -0
- package/src/worker/auth-rate-limiter.test.ts +272 -0
- package/src/worker/auth-rate-limiter.ts +448 -0
- package/src/worker/auth.security-red.test.ts +1236 -0
- package/src/worker/auth.security.test.ts +822 -0
- package/src/worker/auth.test.ts +469 -0
- package/src/worker/auth.ts +1104 -0
- package/src/worker/cdc-backpressure.test.ts +726 -0
- package/src/worker/cdc-backpressure.ts +866 -0
- package/src/worker/cdc-sse.test.ts +780 -0
- package/src/worker/cdc-sse.ts +728 -0
- package/src/worker/cdc-websocket.ts +1229 -0
- package/src/worker/cdc-ws.test.ts +1009 -0
- package/src/worker/cdc.test.ts +327 -0
- package/src/worker/cdc.ts +289 -0
- package/src/worker/concerns/auth-concern.ts +179 -0
- package/src/worker/concerns/cdc-concern.ts +247 -0
- package/src/worker/concerns/index.ts +58 -0
- package/src/worker/concerns/query-execution-concern.ts +194 -0
- package/src/worker/concerns/storage-orchestration-concern.ts +373 -0
- package/src/worker/discriminated-types.test.ts +280 -0
- package/src/worker/do-auth-manager.ts +257 -0
- package/src/worker/do-decomposition.test.ts +1236 -0
- package/src/worker/do-pglite-manager.ts +302 -0
- package/src/worker/do.test.ts +2254 -0
- package/src/worker/do.ts +1878 -0
- package/src/worker/entry.ts +417 -0
- package/src/worker/errors.ts +285 -0
- package/src/worker/health-check-manager.test.ts +261 -0
- package/src/worker/health-check-manager.ts +231 -0
- package/src/worker/index.ts +389 -0
- package/src/worker/memory-pressure.test.ts +1460 -0
- package/src/worker/memory-pressure.ts +2650 -0
- package/src/worker/migration-manager.ts +582 -0
- package/src/worker/neon-compat.test.ts +332 -0
- package/src/worker/plugin-manager.ts +485 -0
- package/src/worker/postgres.do-rpc.d.ts +76 -0
- package/src/worker/proxy.ts +694 -0
- package/src/worker/query-execution-manager.test.ts +303 -0
- package/src/worker/query-execution-manager.ts +219 -0
- package/src/worker/query-executor.test.ts +282 -0
- package/src/worker/query-executor.ts +560 -0
- package/src/worker/query-stats-manager.ts +229 -0
- package/src/worker/result-handler.test.ts +364 -0
- package/src/worker/result-handler.ts +510 -0
- package/src/worker/routes.test.ts +795 -0
- package/src/worker/routes.ts +650 -0
- package/src/worker/rpc-methods-manager.test.ts +326 -0
- package/src/worker/rpc-methods-manager.ts +276 -0
- package/src/worker/rpc.ts +524 -0
- package/src/worker/schema-version.ts +605 -0
- package/src/worker/session-manager.test.ts +506 -0
- package/src/worker/session-manager.ts +732 -0
- package/src/worker/shutdown-manager.ts +469 -0
- package/src/worker/sql-transform.test.ts +286 -0
- package/src/worker/sql-transform.ts +368 -0
- package/src/worker/supabase-compat.test.ts +621 -0
- package/src/worker/types.test.ts +292 -0
- package/src/worker/types.ts +873 -0
- package/src/worker/user-routes.test.ts +703 -0
- package/src/worker/user-routes.ts +303 -0
- package/src/worker/wal-facade.ts +235 -0
- package/src/worker/wal-r2.test.ts +570 -0
- package/src/worker/wal-r2.ts +930 -0
- package/src/worker/wal-replay.test.ts +845 -0
- package/src/worker/wal-replay.ts +897 -0
- package/src/worker/wal-retention.test.ts +758 -0
- package/src/worker/wal-retention.ts +1075 -0
- package/src/worker/wal.test.ts +618 -0
- package/src/worker/wal.ts +697 -0
- package/src/worker/websocket.test.ts +296 -0
- package/src/worker/websocket.ts +284 -0
|
@@ -0,0 +1,845 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adaptive Routing (learn from history)
|
|
3
|
+
*
|
|
4
|
+
* Task: postgres-d6g.10
|
|
5
|
+
*
|
|
6
|
+
* Purpose: Learn from execution history to improve routing decisions.
|
|
7
|
+
* Uses actual CPU time measurements to adjust complexity estimates.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
QueryComplexityEstimator,
|
|
12
|
+
QueryComplexityFactors,
|
|
13
|
+
ConfidenceLevel,
|
|
14
|
+
} from './query-complexity-estimator'
|
|
15
|
+
|
|
16
|
+
export type RuntimeTarget = 'worker' | 'durable-object'
|
|
17
|
+
export type RoutingStrategy = 'primary' | 'alternative'
|
|
18
|
+
|
|
19
|
+
export interface ExecutionOutcome {
|
|
20
|
+
sql: string
|
|
21
|
+
sqlHash: string
|
|
22
|
+
predictedCpuTimeMs: number
|
|
23
|
+
actualCpuTimeMs: number
|
|
24
|
+
runtime: RuntimeTarget
|
|
25
|
+
timestamp: number
|
|
26
|
+
factors?: Partial<QueryComplexityFactors>
|
|
27
|
+
strategy?: RoutingStrategy
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface PredictionResult {
|
|
31
|
+
estimatedMs: number
|
|
32
|
+
confidence: ConfidenceLevel
|
|
33
|
+
source: 'history' | 'model' | 'estimator'
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface RoutingDecision {
|
|
37
|
+
target: RuntimeTarget
|
|
38
|
+
estimatedMs: number
|
|
39
|
+
confidence: ConfidenceLevel
|
|
40
|
+
strategy: RoutingStrategy
|
|
41
|
+
reason: string
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface PredictionAccuracy {
|
|
45
|
+
meanAbsoluteError: number
|
|
46
|
+
meanAbsolutePercentageError: number
|
|
47
|
+
predictionCount: number
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface StrategyStats {
|
|
51
|
+
avgPredictionError: number
|
|
52
|
+
avgActualCpuTimeMs: number
|
|
53
|
+
correctRoutingPercent: number
|
|
54
|
+
sampleCount: number
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface StrategyComparison {
|
|
58
|
+
primary: StrategyStats
|
|
59
|
+
alternative: StrategyStats
|
|
60
|
+
winner: RoutingStrategy | null
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface PerformanceAnomaly {
|
|
64
|
+
timestamp: number
|
|
65
|
+
actualCpuTimeMs: number
|
|
66
|
+
expectedCpuTimeMs: number
|
|
67
|
+
deviationPercent: number
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface LearningModel {
|
|
71
|
+
queryModels: Record<string, { avgCpuTimeMs: number; sampleCount: number; variance: number }>
|
|
72
|
+
adjustedWeights: ComplexityWeights
|
|
73
|
+
strategyOutcomes: Record<RoutingStrategy, ExecutionOutcome[]>
|
|
74
|
+
history: Record<string, ExecutionOutcome[]>
|
|
75
|
+
version: string
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface ComplexityWeights {
|
|
79
|
+
baseQuery: number
|
|
80
|
+
perJoin: number
|
|
81
|
+
perSubquery: number
|
|
82
|
+
perUnion: number
|
|
83
|
+
perCte: number
|
|
84
|
+
perWindowFunction: number
|
|
85
|
+
aggregation: number
|
|
86
|
+
groupBy: number
|
|
87
|
+
having: number
|
|
88
|
+
orderBy: number
|
|
89
|
+
distinct: number
|
|
90
|
+
noLimit: number
|
|
91
|
+
fullTableScan: number
|
|
92
|
+
largeTableMultiplier: number
|
|
93
|
+
transaction: number
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface SeedData {
|
|
97
|
+
sqlHash: string
|
|
98
|
+
avgCpuTimeMs: number
|
|
99
|
+
sampleCount: number
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Configuration options for the AdaptiveRouter.
|
|
104
|
+
*
|
|
105
|
+
* The AdaptiveRouter learns from query execution history to improve routing
|
|
106
|
+
* decisions over time. It routes queries to either Workers (fast queries) or
|
|
107
|
+
* Durable Objects (complex queries) based on predicted CPU time.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const router = new AdaptiveRouter({
|
|
112
|
+
* cpuTimeThresholdMs: 30, // Lower threshold for faster routing
|
|
113
|
+
* complexityWeights: {
|
|
114
|
+
* // Custom weights tuned for your workload
|
|
115
|
+
* baseQuery: 1,
|
|
116
|
+
* perJoin: 20, // Higher if your joins are expensive
|
|
117
|
+
* perSubquery: 25,
|
|
118
|
+
* perWindowFunction: 30,
|
|
119
|
+
* // ... other weights
|
|
120
|
+
* },
|
|
121
|
+
* enableABTesting: true,
|
|
122
|
+
* })
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
export interface AdaptiveConfig {
|
|
126
|
+
/** CPU time threshold for routing decision (default: 50ms) */
|
|
127
|
+
cpuTimeThresholdMs?: number
|
|
128
|
+
|
|
129
|
+
/** Enable A/B testing of routing strategies */
|
|
130
|
+
enableABTesting?: boolean
|
|
131
|
+
|
|
132
|
+
/** Ratio of traffic to send to alternative strategy (0-1) */
|
|
133
|
+
abTestingRatio?: number
|
|
134
|
+
|
|
135
|
+
/** Minimum samples before auto-selecting strategy */
|
|
136
|
+
minSamplesForDecision?: number
|
|
137
|
+
|
|
138
|
+
/** Conservative routing for low confidence predictions */
|
|
139
|
+
conservativeThreshold?: ConfidenceLevel
|
|
140
|
+
|
|
141
|
+
/** Half-life for time-based decay (ms) */
|
|
142
|
+
decayHalfLifeMs?: number
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Partial complexity weight overrides. These values are merged with
|
|
146
|
+
* DEFAULT_WEIGHTS, allowing you to adjust specific weights while
|
|
147
|
+
* keeping defaults for others.
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```typescript
|
|
151
|
+
* initialWeights: {
|
|
152
|
+
* perJoin: 20, // Only override JOIN weight
|
|
153
|
+
* aggregation: 15, // And aggregation weight
|
|
154
|
+
* }
|
|
155
|
+
* ```
|
|
156
|
+
*
|
|
157
|
+
* @see ComplexityWeights for available weight fields
|
|
158
|
+
* @see complexityWeights for full replacement (no merging)
|
|
159
|
+
*/
|
|
160
|
+
initialWeights?: Partial<ComplexityWeights>
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Complete complexity weights replacement. When provided, these weights
|
|
164
|
+
* fully replace the defaults (no merging with DEFAULT_WEIGHTS).
|
|
165
|
+
*
|
|
166
|
+
* Use this when you have a complete set of weights tuned for your
|
|
167
|
+
* specific workload, or when exporting/importing router configurations.
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```typescript
|
|
171
|
+
* complexityWeights: {
|
|
172
|
+
* baseQuery: 1,
|
|
173
|
+
* perJoin: 18,
|
|
174
|
+
* perSubquery: 22,
|
|
175
|
+
* perUnion: 12,
|
|
176
|
+
* perCte: 16,
|
|
177
|
+
* perWindowFunction: 28,
|
|
178
|
+
* aggregation: 12,
|
|
179
|
+
* groupBy: 9,
|
|
180
|
+
* having: 6,
|
|
181
|
+
* orderBy: 9,
|
|
182
|
+
* distinct: 11,
|
|
183
|
+
* noLimit: 17,
|
|
184
|
+
* fullTableScan: 22,
|
|
185
|
+
* largeTableMultiplier: 0.00001,
|
|
186
|
+
* transaction: 6,
|
|
187
|
+
* }
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* @see ComplexityWeights for field descriptions
|
|
191
|
+
* @see initialWeights for partial overrides (merged with defaults)
|
|
192
|
+
*/
|
|
193
|
+
complexityWeights?: ComplexityWeights
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Seed data to bootstrap the router's query models on cold start.
|
|
197
|
+
*
|
|
198
|
+
* Provide pre-computed query statistics to avoid the learning period
|
|
199
|
+
* for known query patterns. Each entry associates a SQL hash with its
|
|
200
|
+
* expected CPU time and sample count, allowing the router to make
|
|
201
|
+
* informed routing decisions immediately.
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* seedData: [
|
|
206
|
+
* { sqlHash: 'sql-abc123', avgCpuTimeMs: 25, sampleCount: 100 },
|
|
207
|
+
* { sqlHash: 'sql-def456', avgCpuTimeMs: 75, sampleCount: 50 },
|
|
208
|
+
* ]
|
|
209
|
+
* ```
|
|
210
|
+
*
|
|
211
|
+
* @see SeedData for the structure of seed entries
|
|
212
|
+
*/
|
|
213
|
+
seedData?: SeedData[]
|
|
214
|
+
|
|
215
|
+
/** Minimum samples to create query-specific model */
|
|
216
|
+
minSamplesForQueryModel?: number
|
|
217
|
+
|
|
218
|
+
/** Maximum number of unique query hashes to track in history (default: 1000) */
|
|
219
|
+
maxHistoryEntries?: number
|
|
220
|
+
|
|
221
|
+
/** Maximum age for history entries in milliseconds (default: 3600000 = 1 hour) */
|
|
222
|
+
maxHistoryAgeMs?: number
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Default complexity weights for SQL query routing decisions.
|
|
227
|
+
*
|
|
228
|
+
* These weights represent **relative complexity units** that estimate CPU time
|
|
229
|
+
* overhead for different SQL operations. They are used by the AdaptiveRouter
|
|
230
|
+
* to predict query execution time and route queries to the appropriate runtime
|
|
231
|
+
* (Worker for fast queries, Durable Object for complex queries).
|
|
232
|
+
*
|
|
233
|
+
* ## Weight Derivation
|
|
234
|
+
*
|
|
235
|
+
* These values were derived from:
|
|
236
|
+
* 1. **PostgreSQL documentation** - Understanding relative costs of operations
|
|
237
|
+
* (e.g., nested loop joins vs hash joins, sequential vs index scans)
|
|
238
|
+
* 2. **Empirical testing** - Benchmarking common query patterns on PGLite/WASM
|
|
239
|
+
* in Cloudflare Workers to measure actual CPU time overhead
|
|
240
|
+
* 3. **Industry best practices** - Referencing query cost models from PostgreSQL's
|
|
241
|
+
* EXPLAIN ANALYZE and similar database query planners
|
|
242
|
+
*
|
|
243
|
+
* ## How Weights Affect Routing
|
|
244
|
+
*
|
|
245
|
+
* The total complexity score is calculated as:
|
|
246
|
+
* score = baseQuery + (joinCount * perJoin) + (subqueryCount * perSubquery) + ...
|
|
247
|
+
*
|
|
248
|
+
* This score is then used to estimate CPU time in milliseconds. Queries with
|
|
249
|
+
* estimated CPU time below `cpuTimeThresholdMs` (default: 50ms) are routed to
|
|
250
|
+
* Workers; those above are routed to Durable Objects.
|
|
251
|
+
*
|
|
252
|
+
* ## Weight Categories
|
|
253
|
+
*
|
|
254
|
+
* - **Structural costs** (perJoin, perSubquery, perUnion, perCte): Increase
|
|
255
|
+
* linearly with each occurrence. Joins and subqueries are expensive due to
|
|
256
|
+
* additional table scans and nested loop processing.
|
|
257
|
+
*
|
|
258
|
+
* - **Operation costs** (aggregation, groupBy, having, orderBy, distinct):
|
|
259
|
+
* Fixed overhead for using these operations. GROUP BY and ORDER BY require
|
|
260
|
+
* sorting; aggregations need accumulator state.
|
|
261
|
+
*
|
|
262
|
+
* - **Scan costs** (noLimit, fullTableScan, largeTableMultiplier): Penalize
|
|
263
|
+
* queries that may process large result sets. The largeTableMultiplier
|
|
264
|
+
* scales with estimated row count (e.g., 100K rows * 0.00001 = 1 unit).
|
|
265
|
+
*
|
|
266
|
+
* - **Compute costs** (perWindowFunction): Window functions are particularly
|
|
267
|
+
* expensive as they require buffering and sorting result sets.
|
|
268
|
+
*
|
|
269
|
+
* ## Adaptive Learning
|
|
270
|
+
*
|
|
271
|
+
* These defaults serve as initial values. The AdaptiveRouter adjusts weights
|
|
272
|
+
* based on actual execution outcomes using online learning. Over time, weights
|
|
273
|
+
* converge to values that minimize prediction error for your specific workload.
|
|
274
|
+
*
|
|
275
|
+
* @see AdaptiveConfig.initialWeights - Override these defaults at construction
|
|
276
|
+
* @see AdaptiveConfig.complexityWeights - Fully replace the weight configuration
|
|
277
|
+
*/
|
|
278
|
+
export const DEFAULT_WEIGHTS: ComplexityWeights = {
|
|
279
|
+
/** Base cost for any query (minimum complexity floor) */
|
|
280
|
+
baseQuery: 1,
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Cost per JOIN clause. JOINs multiply row processing and require
|
|
284
|
+
* matching keys across tables. Nested loops are O(n*m) worst case.
|
|
285
|
+
*/
|
|
286
|
+
perJoin: 15,
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Cost per subquery. Subqueries execute as separate query plans and
|
|
290
|
+
* may be re-evaluated for each outer row (correlated subqueries).
|
|
291
|
+
*/
|
|
292
|
+
perSubquery: 20,
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Cost per UNION/INTERSECT/EXCEPT. Requires executing multiple queries
|
|
296
|
+
* and combining results (with deduplication for UNION/INTERSECT).
|
|
297
|
+
*/
|
|
298
|
+
perUnion: 10,
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Cost per Common Table Expression (CTE/WITH clause). CTEs materialize
|
|
302
|
+
* intermediate results, adding memory overhead.
|
|
303
|
+
*/
|
|
304
|
+
perCte: 15,
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Cost per window function (OVER clause). Window functions buffer the
|
|
308
|
+
* entire partition, sort by ORDER BY, and compute running aggregates.
|
|
309
|
+
* Among the most expensive operations in SQL.
|
|
310
|
+
*/
|
|
311
|
+
perWindowFunction: 25,
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Cost for aggregate functions (COUNT, SUM, AVG, MIN, MAX, etc.).
|
|
315
|
+
* Requires maintaining accumulator state across all rows.
|
|
316
|
+
*/
|
|
317
|
+
aggregation: 10,
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Cost for GROUP BY clause. Requires sorting or hashing rows by
|
|
321
|
+
* grouping keys, then aggregating within each group.
|
|
322
|
+
*/
|
|
323
|
+
groupBy: 8,
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Cost for HAVING clause. Evaluated after GROUP BY, filtering
|
|
327
|
+
* aggregate results. Minor overhead compared to GROUP BY itself.
|
|
328
|
+
*/
|
|
329
|
+
having: 5,
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Cost for ORDER BY clause. Requires sorting the result set,
|
|
333
|
+
* which is O(n log n) in the number of rows.
|
|
334
|
+
*/
|
|
335
|
+
orderBy: 8,
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Cost for DISTINCT keyword. Requires sorting or hashing to
|
|
339
|
+
* eliminate duplicates from the result set.
|
|
340
|
+
*/
|
|
341
|
+
distinct: 10,
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Penalty for queries without LIMIT clause. Unbounded result sets
|
|
345
|
+
* can return arbitrarily large amounts of data.
|
|
346
|
+
*/
|
|
347
|
+
noLimit: 15,
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Penalty for suspected full table scans (queries without WHERE
|
|
351
|
+
* clauses or using non-indexed columns). Processes every row.
|
|
352
|
+
*/
|
|
353
|
+
fullTableScan: 20,
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Multiplier applied to estimated table size. Allows complexity to
|
|
357
|
+
* scale with data volume. Value of 0.00001 means 100K rows = 1 unit.
|
|
358
|
+
*/
|
|
359
|
+
largeTableMultiplier: 0.00001,
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Overhead for transaction boundaries (BEGIN/COMMIT/ROLLBACK).
|
|
363
|
+
* Minor but non-zero cost for transaction state management.
|
|
364
|
+
*/
|
|
365
|
+
transaction: 5,
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
export class AdaptiveRouter {
|
|
369
|
+
private config: Required<AdaptiveConfig>
|
|
370
|
+
private estimator: QueryComplexityEstimator
|
|
371
|
+
private history: Map<string, ExecutionOutcome[]> = new Map()
|
|
372
|
+
private queryModels: Map<string, { avgCpuTimeMs: number; sampleCount: number; variance: number }> = new Map()
|
|
373
|
+
private adjustedWeights: ComplexityWeights
|
|
374
|
+
private strategyOutcomes: Map<RoutingStrategy, ExecutionOutcome[]> = new Map([
|
|
375
|
+
['primary', []],
|
|
376
|
+
['alternative', []],
|
|
377
|
+
])
|
|
378
|
+
private selectedStrategy: RoutingStrategy | null = null
|
|
379
|
+
/** Track last access time for each query hash (for LRU eviction) */
|
|
380
|
+
private lastAccessTime: Map<string, number> = new Map()
|
|
381
|
+
|
|
382
|
+
constructor(config: AdaptiveConfig = {}) {
|
|
383
|
+
// Check if complexityWeights was explicitly provided (not defaulted)
|
|
384
|
+
const hasExplicitComplexityWeights = config.complexityWeights !== undefined
|
|
385
|
+
|
|
386
|
+
this.config = {
|
|
387
|
+
cpuTimeThresholdMs: config.cpuTimeThresholdMs ?? 50,
|
|
388
|
+
enableABTesting: config.enableABTesting ?? false,
|
|
389
|
+
abTestingRatio: config.abTestingRatio ?? 0.1,
|
|
390
|
+
minSamplesForDecision: config.minSamplesForDecision ?? 100,
|
|
391
|
+
conservativeThreshold: config.conservativeThreshold ?? 'low',
|
|
392
|
+
decayHalfLifeMs: config.decayHalfLifeMs ?? 86400000, // 1 day default
|
|
393
|
+
initialWeights: config.initialWeights ?? {},
|
|
394
|
+
complexityWeights: config.complexityWeights ?? DEFAULT_WEIGHTS,
|
|
395
|
+
seedData: config.seedData ?? [],
|
|
396
|
+
minSamplesForQueryModel: config.minSamplesForQueryModel ?? 10,
|
|
397
|
+
maxHistoryEntries: config.maxHistoryEntries ?? 1000,
|
|
398
|
+
maxHistoryAgeMs: config.maxHistoryAgeMs ?? 3600000, // 1 hour default
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Initialize weights: complexityWeights takes precedence (full replacement),
|
|
402
|
+
// otherwise merge initialWeights with defaults
|
|
403
|
+
if (hasExplicitComplexityWeights) {
|
|
404
|
+
this.adjustedWeights = { ...this.config.complexityWeights }
|
|
405
|
+
} else {
|
|
406
|
+
this.adjustedWeights = { ...DEFAULT_WEIGHTS, ...this.config.initialWeights }
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
this.estimator = new QueryComplexityEstimator({
|
|
410
|
+
cpuTimeThresholdMs: this.config.cpuTimeThresholdMs,
|
|
411
|
+
})
|
|
412
|
+
|
|
413
|
+
// Initialize with seed data
|
|
414
|
+
for (const seed of this.config.seedData) {
|
|
415
|
+
this.queryModels.set(seed.sqlHash, {
|
|
416
|
+
avgCpuTimeMs: seed.avgCpuTimeMs,
|
|
417
|
+
sampleCount: seed.sampleCount,
|
|
418
|
+
variance: 0,
|
|
419
|
+
})
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
async recordOutcome(outcome: ExecutionOutcome): Promise<void> {
|
|
424
|
+
const { sqlHash, strategy } = outcome
|
|
425
|
+
|
|
426
|
+
// Update last access time for LRU tracking (use outcome timestamp for consistency)
|
|
427
|
+
this.lastAccessTime.set(sqlHash, outcome.timestamp)
|
|
428
|
+
|
|
429
|
+
// Enforce maxHistoryEntries limit via LRU eviction
|
|
430
|
+
if (!this.history.has(sqlHash) && this.history.size >= this.config.maxHistoryEntries) {
|
|
431
|
+
this.evictLRUEntry()
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Add to history
|
|
435
|
+
if (!this.history.has(sqlHash)) {
|
|
436
|
+
this.history.set(sqlHash, [])
|
|
437
|
+
}
|
|
438
|
+
this.history.get(sqlHash)!.push(outcome)
|
|
439
|
+
|
|
440
|
+
// Update query model
|
|
441
|
+
this.updateQueryModel(sqlHash, outcome.actualCpuTimeMs)
|
|
442
|
+
|
|
443
|
+
// Update factor weights
|
|
444
|
+
if (outcome.factors) {
|
|
445
|
+
this.updateWeights(outcome)
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Track strategy outcomes
|
|
449
|
+
if (strategy) {
|
|
450
|
+
this.strategyOutcomes.get(strategy)!.push(outcome)
|
|
451
|
+
this.checkStrategySelection()
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Evict the least recently used entry from history
|
|
457
|
+
*/
|
|
458
|
+
private evictLRUEntry(): void {
|
|
459
|
+
let oldestHash: string | null = null
|
|
460
|
+
let oldestTime = Infinity
|
|
461
|
+
|
|
462
|
+
for (const [hash, time] of this.lastAccessTime.entries()) {
|
|
463
|
+
if (time < oldestTime && this.history.has(hash)) {
|
|
464
|
+
oldestTime = time
|
|
465
|
+
oldestHash = hash
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
if (oldestHash) {
|
|
470
|
+
this.history.delete(oldestHash)
|
|
471
|
+
this.lastAccessTime.delete(oldestHash)
|
|
472
|
+
// Also clean up the query model for evicted entries
|
|
473
|
+
this.queryModels.delete(oldestHash)
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
private updateQueryModel(sqlHash: string, actualCpuTimeMs: number): void {
|
|
478
|
+
const existing = this.queryModels.get(sqlHash)
|
|
479
|
+
|
|
480
|
+
if (!existing) {
|
|
481
|
+
this.queryModels.set(sqlHash, {
|
|
482
|
+
avgCpuTimeMs: actualCpuTimeMs,
|
|
483
|
+
sampleCount: 1,
|
|
484
|
+
variance: 0,
|
|
485
|
+
})
|
|
486
|
+
} else {
|
|
487
|
+
const n = existing.sampleCount
|
|
488
|
+
const oldMean = existing.avgCpuTimeMs
|
|
489
|
+
const newMean = oldMean + (actualCpuTimeMs - oldMean) / (n + 1)
|
|
490
|
+
|
|
491
|
+
// Welford's online algorithm for variance
|
|
492
|
+
const delta = actualCpuTimeMs - oldMean
|
|
493
|
+
const delta2 = actualCpuTimeMs - newMean
|
|
494
|
+
const newVariance = (existing.variance * n + delta * delta2) / (n + 1)
|
|
495
|
+
|
|
496
|
+
this.queryModels.set(sqlHash, {
|
|
497
|
+
avgCpuTimeMs: newMean,
|
|
498
|
+
sampleCount: n + 1,
|
|
499
|
+
variance: newVariance,
|
|
500
|
+
})
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
private updateWeights(outcome: ExecutionOutcome): void {
|
|
505
|
+
const error = outcome.actualCpuTimeMs - outcome.predictedCpuTimeMs
|
|
506
|
+
const learningRate = 0.1
|
|
507
|
+
|
|
508
|
+
if (outcome.factors?.joinCount && outcome.factors.joinCount > 0) {
|
|
509
|
+
const adjustment = (error / outcome.factors.joinCount) * learningRate
|
|
510
|
+
this.adjustedWeights.perJoin = Math.max(1, this.adjustedWeights.perJoin + adjustment)
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
if (outcome.factors?.hasAggregation) {
|
|
514
|
+
const adjustment = error * learningRate
|
|
515
|
+
this.adjustedWeights.aggregation = Math.max(1, this.adjustedWeights.aggregation + adjustment)
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
if (outcome.factors?.subqueryCount && outcome.factors.subqueryCount > 0) {
|
|
519
|
+
const adjustment = (error / outcome.factors.subqueryCount) * learningRate
|
|
520
|
+
this.adjustedWeights.perSubquery = Math.max(1, this.adjustedWeights.perSubquery + adjustment)
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
if (outcome.factors?.hasGroupBy) {
|
|
524
|
+
const adjustment = error * learningRate
|
|
525
|
+
this.adjustedWeights.groupBy = Math.max(1, this.adjustedWeights.groupBy + adjustment)
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
private checkStrategySelection(): void {
|
|
530
|
+
if (this.selectedStrategy) return
|
|
531
|
+
|
|
532
|
+
const primary = this.strategyOutcomes.get('primary')!
|
|
533
|
+
const alternative = this.strategyOutcomes.get('alternative')!
|
|
534
|
+
|
|
535
|
+
if (primary.length >= this.config.minSamplesForDecision &&
|
|
536
|
+
alternative.length >= this.config.minSamplesForDecision) {
|
|
537
|
+
const primaryStats = this.calculateStrategyStats(primary)
|
|
538
|
+
const alternativeStats = this.calculateStrategyStats(alternative)
|
|
539
|
+
|
|
540
|
+
// Select strategy with lower average prediction error
|
|
541
|
+
if (primaryStats.avgPredictionError < alternativeStats.avgPredictionError) {
|
|
542
|
+
this.selectedStrategy = 'primary'
|
|
543
|
+
} else {
|
|
544
|
+
this.selectedStrategy = 'alternative'
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
private calculateStrategyStats(outcomes: ExecutionOutcome[]): StrategyStats {
|
|
550
|
+
if (outcomes.length === 0) {
|
|
551
|
+
return {
|
|
552
|
+
avgPredictionError: Infinity,
|
|
553
|
+
avgActualCpuTimeMs: 0,
|
|
554
|
+
correctRoutingPercent: 0,
|
|
555
|
+
sampleCount: 0,
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const totalError = outcomes.reduce((sum, o) => sum + Math.abs(o.actualCpuTimeMs - o.predictedCpuTimeMs), 0)
|
|
560
|
+
const totalActual = outcomes.reduce((sum, o) => sum + o.actualCpuTimeMs, 0)
|
|
561
|
+
const correctRouting = outcomes.filter(o => {
|
|
562
|
+
const shouldBeWorker = o.actualCpuTimeMs < this.config.cpuTimeThresholdMs
|
|
563
|
+
return (o.runtime === 'worker') === shouldBeWorker
|
|
564
|
+
}).length
|
|
565
|
+
|
|
566
|
+
return {
|
|
567
|
+
avgPredictionError: totalError / outcomes.length,
|
|
568
|
+
avgActualCpuTimeMs: totalActual / outcomes.length,
|
|
569
|
+
correctRoutingPercent: (correctRouting / outcomes.length) * 100,
|
|
570
|
+
sampleCount: outcomes.length,
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
getHistory(sqlHash: string): ExecutionOutcome[] {
|
|
575
|
+
return this.history.get(sqlHash) ?? []
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* Get the number of unique query hashes in history
|
|
580
|
+
*/
|
|
581
|
+
getHistorySize(): number {
|
|
582
|
+
return this.history.size
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Get the current configuration
|
|
587
|
+
*/
|
|
588
|
+
getConfig(): Required<AdaptiveConfig> {
|
|
589
|
+
return { ...this.config }
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Get the default complexity weights.
|
|
594
|
+
*
|
|
595
|
+
* Returns a copy of the default weight values used when no custom
|
|
596
|
+
* weights are provided. Useful for inspecting defaults or creating
|
|
597
|
+
* modified weight configurations based on defaults.
|
|
598
|
+
*
|
|
599
|
+
* @example
|
|
600
|
+
* ```typescript
|
|
601
|
+
* const defaults = AdaptiveRouter.getDefaultWeights()
|
|
602
|
+
* const customWeights = {
|
|
603
|
+
* ...defaults,
|
|
604
|
+
* perJoin: defaults.perJoin * 1.5, // 50% higher JOIN cost
|
|
605
|
+
* }
|
|
606
|
+
* const router = new AdaptiveRouter({ complexityWeights: customWeights })
|
|
607
|
+
* ```
|
|
608
|
+
*/
|
|
609
|
+
static getDefaultWeights(): ComplexityWeights {
|
|
610
|
+
return { ...DEFAULT_WEIGHTS }
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Prune entries older than maxHistoryAgeMs
|
|
615
|
+
*/
|
|
616
|
+
pruneOldEntries(): void {
|
|
617
|
+
const now = Date.now()
|
|
618
|
+
const maxAge = this.config.maxHistoryAgeMs
|
|
619
|
+
|
|
620
|
+
for (const [sqlHash, outcomes] of this.history.entries()) {
|
|
621
|
+
// Filter out old outcomes
|
|
622
|
+
const recentOutcomes = outcomes.filter(o => (now - o.timestamp) < maxAge)
|
|
623
|
+
|
|
624
|
+
if (recentOutcomes.length === 0) {
|
|
625
|
+
// Remove entire entry if all outcomes are old
|
|
626
|
+
this.history.delete(sqlHash)
|
|
627
|
+
this.lastAccessTime.delete(sqlHash)
|
|
628
|
+
this.queryModels.delete(sqlHash)
|
|
629
|
+
} else if (recentOutcomes.length < outcomes.length) {
|
|
630
|
+
// Update with only recent outcomes
|
|
631
|
+
this.history.set(sqlHash, recentOutcomes)
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
getPredictionAccuracy(): PredictionAccuracy {
|
|
637
|
+
let totalAbsoluteError = 0
|
|
638
|
+
let totalPercentageError = 0
|
|
639
|
+
let count = 0
|
|
640
|
+
|
|
641
|
+
for (const outcomes of this.history.values()) {
|
|
642
|
+
for (const outcome of outcomes) {
|
|
643
|
+
const absError = Math.abs(outcome.actualCpuTimeMs - outcome.predictedCpuTimeMs)
|
|
644
|
+
totalAbsoluteError += absError
|
|
645
|
+
if (outcome.actualCpuTimeMs > 0) {
|
|
646
|
+
totalPercentageError += (absError / outcome.actualCpuTimeMs) * 100
|
|
647
|
+
}
|
|
648
|
+
count++
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
return {
|
|
653
|
+
meanAbsoluteError: count > 0 ? totalAbsoluteError / count : 0,
|
|
654
|
+
meanAbsolutePercentageError: count > 0 ? totalPercentageError / count : 0,
|
|
655
|
+
predictionCount: count,
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
async predictCpuTime(sql: string, sqlHash: string): Promise<PredictionResult> {
|
|
660
|
+
const queryModel = this.queryModels.get(sqlHash)
|
|
661
|
+
|
|
662
|
+
// Use query-specific model if available with enough samples
|
|
663
|
+
if (queryModel && queryModel.sampleCount >= this.config.minSamplesForQueryModel) {
|
|
664
|
+
const stdDev = Math.sqrt(queryModel.variance)
|
|
665
|
+
const coefficientOfVariation = queryModel.avgCpuTimeMs > 0 ? stdDev / queryModel.avgCpuTimeMs : 1
|
|
666
|
+
|
|
667
|
+
let confidence: ConfidenceLevel = 'high'
|
|
668
|
+
if (coefficientOfVariation > 0.3 || queryModel.sampleCount < 20) {
|
|
669
|
+
confidence = 'medium'
|
|
670
|
+
}
|
|
671
|
+
if (coefficientOfVariation > 0.5 || queryModel.sampleCount < 10) {
|
|
672
|
+
confidence = 'low'
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
return {
|
|
676
|
+
estimatedMs: queryModel.avgCpuTimeMs,
|
|
677
|
+
confidence,
|
|
678
|
+
source: 'history',
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Use history with time-based decay
|
|
683
|
+
const history = this.getHistory(sqlHash)
|
|
684
|
+
if (history.length > 0) {
|
|
685
|
+
const now = Date.now()
|
|
686
|
+
let weightedSum = 0
|
|
687
|
+
let totalWeight = 0
|
|
688
|
+
|
|
689
|
+
for (const outcome of history) {
|
|
690
|
+
const age = now - outcome.timestamp
|
|
691
|
+
const weight = Math.pow(0.5, age / this.config.decayHalfLifeMs)
|
|
692
|
+
weightedSum += outcome.actualCpuTimeMs * weight
|
|
693
|
+
totalWeight += weight
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
if (totalWeight > 0) {
|
|
697
|
+
return {
|
|
698
|
+
estimatedMs: weightedSum / totalWeight,
|
|
699
|
+
confidence: history.length >= 10 ? 'high' : history.length >= 3 ? 'medium' : 'low',
|
|
700
|
+
source: 'history',
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
// Fall back to complexity estimator
|
|
706
|
+
const estimate = this.estimator.estimate(sql)
|
|
707
|
+
return {
|
|
708
|
+
estimatedMs: estimate.estimatedMs,
|
|
709
|
+
confidence: estimate.confidence,
|
|
710
|
+
source: 'estimator',
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
hasQueryModel(sqlHash: string): boolean {
|
|
715
|
+
const model = this.queryModels.get(sqlHash)
|
|
716
|
+
return model !== undefined && model.sampleCount >= this.config.minSamplesForQueryModel
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
getAdjustedWeights(): ComplexityWeights {
|
|
720
|
+
return { ...this.adjustedWeights }
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
async route(sql: string, sqlHash?: string): Promise<RoutingDecision> {
|
|
724
|
+
const hash = sqlHash ?? this.hashSql(sql)
|
|
725
|
+
const prediction = await this.predictCpuTime(sql, hash)
|
|
726
|
+
|
|
727
|
+
// Determine strategy for A/B testing
|
|
728
|
+
let strategy: RoutingStrategy = 'primary'
|
|
729
|
+
if (this.config.enableABTesting && !this.selectedStrategy) {
|
|
730
|
+
strategy = Math.random() < this.config.abTestingRatio ? 'alternative' : 'primary'
|
|
731
|
+
} else if (this.selectedStrategy) {
|
|
732
|
+
strategy = this.selectedStrategy
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// Determine target based on prediction and confidence
|
|
736
|
+
let target: RuntimeTarget
|
|
737
|
+
if (prediction.confidence === this.config.conservativeThreshold) {
|
|
738
|
+
// Conservative: prefer DO for uncertain queries
|
|
739
|
+
target = prediction.estimatedMs >= this.config.cpuTimeThresholdMs * 0.7
|
|
740
|
+
? 'durable-object' : 'worker'
|
|
741
|
+
} else {
|
|
742
|
+
target = prediction.estimatedMs >= this.config.cpuTimeThresholdMs
|
|
743
|
+
? 'durable-object' : 'worker'
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
const reason = prediction.estimatedMs >= this.config.cpuTimeThresholdMs
|
|
747
|
+
? `complex query (estimated ${prediction.estimatedMs.toFixed(1)}ms from ${prediction.source})`
|
|
748
|
+
: `fast query (estimated ${prediction.estimatedMs.toFixed(1)}ms from ${prediction.source})`
|
|
749
|
+
|
|
750
|
+
return {
|
|
751
|
+
target,
|
|
752
|
+
estimatedMs: prediction.estimatedMs,
|
|
753
|
+
confidence: prediction.confidence,
|
|
754
|
+
strategy,
|
|
755
|
+
reason,
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
private hashSql(sql: string): string {
|
|
760
|
+
// Simple hash function
|
|
761
|
+
let hash = 0
|
|
762
|
+
for (let i = 0; i < sql.length; i++) {
|
|
763
|
+
const char = sql.charCodeAt(i)
|
|
764
|
+
hash = ((hash << 5) - hash) + char
|
|
765
|
+
hash = hash & hash
|
|
766
|
+
}
|
|
767
|
+
return `sql-${Math.abs(hash).toString(36)}`
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
compareStrategies(): StrategyComparison {
|
|
771
|
+
const primary = this.strategyOutcomes.get('primary')!
|
|
772
|
+
const alternative = this.strategyOutcomes.get('alternative')!
|
|
773
|
+
|
|
774
|
+
const primaryStats = this.calculateStrategyStats(primary)
|
|
775
|
+
const alternativeStats = this.calculateStrategyStats(alternative)
|
|
776
|
+
|
|
777
|
+
let winner: RoutingStrategy | null = null
|
|
778
|
+
if (primary.length >= this.config.minSamplesForDecision &&
|
|
779
|
+
alternative.length >= this.config.minSamplesForDecision) {
|
|
780
|
+
winner = primaryStats.avgPredictionError < alternativeStats.avgPredictionError
|
|
781
|
+
? 'primary' : 'alternative'
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
return {
|
|
785
|
+
primary: primaryStats,
|
|
786
|
+
alternative: alternativeStats,
|
|
787
|
+
winner,
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
getSelectedStrategy(): RoutingStrategy | null {
|
|
792
|
+
return this.selectedStrategy
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
detectPerformanceAnomalies(sqlHash: string): PerformanceAnomaly[] {
|
|
796
|
+
const history = this.getHistory(sqlHash)
|
|
797
|
+
if (history.length < 5) return []
|
|
798
|
+
|
|
799
|
+
// Calculate mean and std dev
|
|
800
|
+
const values = history.map(h => h.actualCpuTimeMs)
|
|
801
|
+
const mean = values.reduce((a, b) => a + b, 0) / values.length
|
|
802
|
+
const variance = values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / values.length
|
|
803
|
+
const stdDev = Math.sqrt(variance)
|
|
804
|
+
|
|
805
|
+
const anomalies: PerformanceAnomaly[] = []
|
|
806
|
+
const threshold = 3 // 3 standard deviations
|
|
807
|
+
|
|
808
|
+
for (const outcome of history) {
|
|
809
|
+
const deviation = Math.abs(outcome.actualCpuTimeMs - mean)
|
|
810
|
+
if (deviation > threshold * stdDev) {
|
|
811
|
+
anomalies.push({
|
|
812
|
+
timestamp: outcome.timestamp,
|
|
813
|
+
actualCpuTimeMs: outcome.actualCpuTimeMs,
|
|
814
|
+
expectedCpuTimeMs: mean,
|
|
815
|
+
deviationPercent: ((outcome.actualCpuTimeMs - mean) / mean) * 100,
|
|
816
|
+
})
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
return anomalies
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
exportModel(): string {
|
|
824
|
+
const model: LearningModel = {
|
|
825
|
+
queryModels: Object.fromEntries(this.queryModels),
|
|
826
|
+
adjustedWeights: this.adjustedWeights,
|
|
827
|
+
strategyOutcomes: {
|
|
828
|
+
primary: this.strategyOutcomes.get('primary') || [],
|
|
829
|
+
alternative: this.strategyOutcomes.get('alternative') || [],
|
|
830
|
+
},
|
|
831
|
+
history: Object.fromEntries(this.history),
|
|
832
|
+
version: '1.0.0',
|
|
833
|
+
}
|
|
834
|
+
return JSON.stringify(model)
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
importModel(modelJson: string): void {
|
|
838
|
+
const model: LearningModel = JSON.parse(modelJson)
|
|
839
|
+
|
|
840
|
+
this.queryModels = new Map(Object.entries(model.queryModels))
|
|
841
|
+
this.adjustedWeights = model.adjustedWeights
|
|
842
|
+
this.strategyOutcomes = new Map(Object.entries(model.strategyOutcomes) as [RoutingStrategy, ExecutionOutcome[]][])
|
|
843
|
+
this.history = new Map(Object.entries(model.history))
|
|
844
|
+
}
|
|
845
|
+
}
|