@quereus/quereus 2.9.0 → 3.0.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 +224 -222
- package/dist/src/core/database-assertions.d.ts +36 -16
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +222 -118
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +96 -13
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +294 -35
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database-watchers.d.ts +58 -0
- package/dist/src/core/database-watchers.d.ts.map +1 -0
- package/dist/src/core/database-watchers.js +206 -0
- package/dist/src/core/database-watchers.js.map +1 -0
- package/dist/src/core/database.d.ts +78 -5
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +120 -20
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +9 -0
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +29 -0
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/core/table-handle.d.ts +45 -0
- package/dist/src/core/table-handle.d.ts.map +1 -0
- package/dist/src/core/table-handle.js +54 -0
- package/dist/src/core/table-handle.js.map +1 -0
- package/dist/src/func/builtins/conversion.d.ts.map +1 -1
- package/dist/src/func/builtins/conversion.js +12 -1
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +22 -8
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/generation.d.ts.map +1 -1
- package/dist/src/func/builtins/generation.js +26 -1
- package/dist/src/func/builtins/generation.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +5 -1
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
- package/dist/src/func/builtins/json-tvf.js +16 -2
- package/dist/src/func/builtins/json-tvf.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts +4 -0
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +270 -11
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/registration.d.ts +19 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +8 -3
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +12 -4
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.d.ts +71 -0
- package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -0
- package/dist/src/planner/analysis/assertion-classifier.js +286 -0
- package/dist/src/planner/analysis/assertion-classifier.js.map +1 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts +34 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.js +119 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts +58 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.js +110 -0
- package/dist/src/planner/analysis/binding-extractor.js.map +1 -0
- package/dist/src/planner/analysis/change-scope.d.ts +184 -0
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -0
- package/dist/src/planner/analysis/change-scope.js +825 -0
- package/dist/src/planner/analysis/change-scope.js.map +1 -0
- package/dist/src/planner/analysis/check-extraction.d.ts +29 -0
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -0
- package/dist/src/planner/analysis/check-extraction.js +420 -0
- package/dist/src/planner/analysis/check-extraction.js.map +1 -0
- package/dist/src/planner/analysis/constraint-extractor.d.ts +47 -7
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +169 -92
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts +68 -0
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -0
- package/dist/src/planner/analysis/partial-unique-extraction.js +347 -0
- package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -0
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts +14 -0
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-conjuncts.js +31 -0
- package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts +52 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.js +119 -0
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -0
- package/dist/src/planner/analysis/sat-checker.d.ts +43 -0
- package/dist/src/planner/analysis/sat-checker.d.ts.map +1 -0
- package/dist/src/planner/analysis/sat-checker.js +393 -0
- package/dist/src/planner/analysis/sat-checker.js.map +1 -0
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +1 -1
- package/dist/src/planner/building/table.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +10 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +24 -5
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +46 -16
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +0 -9
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +0 -31
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts +25 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +75 -8
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +6 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.js +17 -3
- package/dist/src/planner/nodes/asof-scan-node.js.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.js +19 -9
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +10 -6
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/empty-relation-node.d.ts +27 -0
- package/dist/src/planner/nodes/empty-relation-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/empty-relation-node.js +61 -0
- package/dist/src/planner/nodes/empty-relation-node.js.map +1 -0
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +65 -5
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +8 -6
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +12 -9
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +24 -1
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +86 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +6 -1
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +19 -9
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.js +5 -2
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +1 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +186 -4
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +75 -30
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +24 -2
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +101 -1
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts +9 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +21 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +64 -28
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +1 -0
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +12 -0
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +15 -0
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
- package/dist/src/planner/nodes/single-row.js +3 -1
- package/dist/src/planner/nodes/single-row.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +10 -3
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +8 -8
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +3 -3
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +26 -8
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.d.ts +4 -1
- package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +224 -14
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +9 -2
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +29 -1
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +3 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +187 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +22 -7
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +30 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +116 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +7 -7
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +18 -16
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts +56 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-elimination.js +326 -0
- package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +10 -2
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +20 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +181 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +46 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +156 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts +30 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +60 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +45 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +210 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts +29 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +161 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +39 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +91 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts +35 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +74 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +27 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +103 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +1 -25
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/scopes/global.js +2 -2
- package/dist/src/planner/scopes/global.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +11 -0
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts +245 -0
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -0
- package/dist/src/planner/util/fd-utils.js +1416 -0
- package/dist/src/planner/util/fd-utils.js.map +1 -0
- package/dist/src/planner/util/ind-utils.d.ts +79 -0
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -0
- package/dist/src/planner/util/ind-utils.js +146 -0
- package/dist/src/planner/util/ind-utils.js.map +1 -0
- package/dist/src/planner/util/key-utils.d.ts +75 -14
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +234 -57
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/runtime/delta-executor.d.ts +134 -0
- package/dist/src/runtime/delta-executor.d.ts.map +1 -0
- package/dist/src/runtime/delta-executor.js +382 -0
- package/dist/src/runtime/delta-executor.js.map +1 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +52 -16
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-assertion.js +3 -2
- package/dist/src/runtime/emit/create-assertion.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +40 -13
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +1 -1
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/empty-relation.d.ts +5 -0
- package/dist/src/runtime/emit/empty-relation.d.ts.map +1 -0
- package/dist/src/runtime/emit/empty-relation.js +11 -0
- package/dist/src/runtime/emit/empty-relation.js.map +1 -0
- package/dist/src/runtime/foreign-key-actions.d.ts +16 -0
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +81 -1
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +2 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +8 -0
- package/dist/src/schema/assertion.d.ts.map +1 -1
- package/dist/src/schema/change-events.d.ts +5 -1
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/change-events.js.map +1 -1
- package/dist/src/schema/function.d.ts +65 -1
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js +31 -0
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +33 -0
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +95 -4
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +303 -102
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/table.d.ts +21 -2
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +17 -8
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +32 -0
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/vtab/events.d.ts +9 -0
- package/dist/src/vtab/events.d.ts.map +1 -1
- package/dist/src/vtab/events.js +19 -0
- package/dist/src/vtab/events.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +24 -5
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts +2 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.js +32 -1
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { resolveReferencedColumns } from '../../schema/table.js';
|
|
2
|
+
import { ColumnReferenceNode, ParameterReferenceNode } from '../nodes/reference.js';
|
|
3
|
+
import { LiteralNode } from '../nodes/scalar.js';
|
|
4
|
+
import { isSuperkey } from './fd-utils.js';
|
|
1
5
|
/**
|
|
2
6
|
* Project unique keys through a projection mapping.
|
|
3
7
|
* - sourceKeys: keys defined on the source relation (arrays of column refs by source column index)
|
|
@@ -24,82 +28,235 @@ export function projectKeys(sourceKeys, projectionMap) {
|
|
|
24
28
|
return result;
|
|
25
29
|
}
|
|
26
30
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
31
|
+
* Walk the scalar `expr` collecting:
|
|
32
|
+
* - `attrIds`: the set of unique `ColumnReferenceNode` attribute IDs it depends on,
|
|
33
|
+
* - `allOtherLeavesConstant`: true iff every non-column leaf is a `LiteralNode`
|
|
34
|
+
* or `ParameterReferenceNode`.
|
|
35
|
+
*
|
|
36
|
+
* Early-exits when a non-constant non-column leaf is found.
|
|
30
37
|
*/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
function analyzeProjectionLeaves(expr) {
|
|
39
|
+
const attrIds = new Set();
|
|
40
|
+
let allOtherLeavesConstant = true;
|
|
41
|
+
const stack = [expr];
|
|
42
|
+
while (stack.length > 0) {
|
|
43
|
+
const n = stack.pop();
|
|
44
|
+
if (n instanceof ColumnReferenceNode) {
|
|
45
|
+
attrIds.add(n.attributeId);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const children = n.getChildren();
|
|
49
|
+
if (children.length === 0) {
|
|
50
|
+
// Leaf that is not a column reference: must be a compile-time constant.
|
|
51
|
+
if (!(n instanceof LiteralNode || n instanceof ParameterReferenceNode)) {
|
|
52
|
+
allOtherLeavesConstant = false;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
for (const c of children) {
|
|
58
|
+
// Only descend through scalar children; scalar expressions only have scalar children.
|
|
59
|
+
stack.push(c);
|
|
60
|
+
}
|
|
37
61
|
}
|
|
38
|
-
|
|
39
|
-
|
|
62
|
+
return { attrIds, allOtherLeavesConstant };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build a source→output column mapping that includes BOTH:
|
|
66
|
+
* - direct `ColumnReferenceNode` projections (bare passthrough), and
|
|
67
|
+
* - injective unary projections: the expression references exactly one source
|
|
68
|
+
* attribute `a`, `expr.isInjectiveIn(a).injective === true`, and every other
|
|
69
|
+
* leaf is a compile-time constant (`LiteralNode` / `ParameterReferenceNode`).
|
|
70
|
+
* For those, the output column is treated as a synonym of source column
|
|
71
|
+
* `src(a)`.
|
|
72
|
+
*
|
|
73
|
+
* The bare-column rule wins on collisions: if the same source column is also
|
|
74
|
+
* projected directly, that mapping is preserved (first-occurrence wins, matching
|
|
75
|
+
* the historical behaviour) and the injective entry is recorded in
|
|
76
|
+
* `injectivePairs` instead.
|
|
77
|
+
*/
|
|
78
|
+
export function deriveProjectionColumnMap(sourceAttrs, projections) {
|
|
79
|
+
const map = new Map();
|
|
80
|
+
const injectivePairs = [];
|
|
81
|
+
// Pass 1: bare column references (highest priority for `map`).
|
|
82
|
+
for (const { expr, outIndex } of projections) {
|
|
83
|
+
if (expr instanceof ColumnReferenceNode) {
|
|
84
|
+
const srcIndex = sourceAttrs.findIndex(a => a.id === expr.attributeId);
|
|
85
|
+
if (srcIndex >= 0 && !map.has(srcIndex)) {
|
|
86
|
+
map.set(srcIndex, outIndex);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Pass 2: injectively-derived columns.
|
|
91
|
+
for (const { expr, outIndex } of projections) {
|
|
92
|
+
if (expr instanceof ColumnReferenceNode)
|
|
93
|
+
continue;
|
|
94
|
+
const { attrIds, allOtherLeavesConstant } = analyzeProjectionLeaves(expr);
|
|
95
|
+
if (!allOtherLeavesConstant)
|
|
96
|
+
continue;
|
|
97
|
+
if (attrIds.size !== 1)
|
|
98
|
+
continue;
|
|
99
|
+
const attrId = attrIds.values().next().value;
|
|
100
|
+
if (!expr.isInjectiveIn(attrId).injective)
|
|
101
|
+
continue;
|
|
102
|
+
const srcIndex = sourceAttrs.findIndex(a => a.id === attrId);
|
|
103
|
+
if (srcIndex < 0)
|
|
104
|
+
continue;
|
|
105
|
+
// Map first-occurrence wins; injective entries fill in slots not already
|
|
106
|
+
// claimed by a bare-column projection. The pair is *always* recorded so
|
|
107
|
+
// callers can decide whether to emit the bi-directional FD.
|
|
108
|
+
if (!map.has(srcIndex)) {
|
|
109
|
+
map.set(srcIndex, outIndex);
|
|
110
|
+
}
|
|
111
|
+
injectivePairs.push([srcIndex, outIndex]);
|
|
112
|
+
}
|
|
113
|
+
return { map, injectivePairs };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Test whether any key in `keys` has all of its columns covered by `eqIndices`.
|
|
117
|
+
* A covered key means each row in the source side maps to ≤ 1 row in the join's
|
|
118
|
+
* equi-pair partner, so the partner side's keys survive null-padding (LEFT/RIGHT).
|
|
119
|
+
*/
|
|
120
|
+
function joinPairsCoverKey(keys, eqIndices) {
|
|
121
|
+
return keys.some(k => k.length > 0 && k.every(c => eqIndices.has(c.index)));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Combine unique keys across a join (logical `RelationType.keys` form).
|
|
125
|
+
*
|
|
126
|
+
* - `inner` / `cross`: union of left and right keys (right indices shifted by `leftColumnCount`).
|
|
127
|
+
* - `left`: if `equiPairs` cover any right-side key, return left keys unchanged
|
|
128
|
+
* (each left row matches ≤ 1 right row, so left's keys survive). Otherwise `[]`.
|
|
129
|
+
* - `right`: symmetric — if `equiPairs` cover any left-side key, return right's
|
|
130
|
+
* keys shifted by `leftColumnCount`. Otherwise `[]`.
|
|
131
|
+
* - `full`: `[]` (both sides may be null-padded).
|
|
132
|
+
* - `semi` / `anti`: return left keys (left-only output, no null-padding).
|
|
133
|
+
*
|
|
134
|
+
* `equiPairs` is optional; when omitted, the LEFT/RIGHT branches conservatively
|
|
135
|
+
* return `[]` (the previous behaviour).
|
|
136
|
+
*/
|
|
137
|
+
export function combineJoinKeys(leftKeys, rightKeys, joinType, leftColumnCount, equiPairs) {
|
|
138
|
+
switch (joinType) {
|
|
139
|
+
case 'inner':
|
|
140
|
+
case 'cross': {
|
|
141
|
+
const result = [];
|
|
142
|
+
for (const key of leftKeys) {
|
|
143
|
+
result.push(key.map(c => ({ index: c.index, desc: c.desc })));
|
|
144
|
+
}
|
|
145
|
+
for (const key of rightKeys) {
|
|
146
|
+
result.push(key.map(c => ({ index: c.index + leftColumnCount, desc: c.desc })));
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
case 'left': {
|
|
151
|
+
if (!equiPairs || equiPairs.length === 0)
|
|
152
|
+
return [];
|
|
153
|
+
const rightEqSet = new Set(equiPairs.map(p => p.right));
|
|
154
|
+
if (!joinPairsCoverKey(rightKeys, rightEqSet))
|
|
155
|
+
return [];
|
|
156
|
+
return leftKeys.map(key => key.map(c => ({ index: c.index, desc: c.desc })));
|
|
157
|
+
}
|
|
158
|
+
case 'right': {
|
|
159
|
+
if (!equiPairs || equiPairs.length === 0)
|
|
160
|
+
return [];
|
|
161
|
+
const leftEqSet = new Set(equiPairs.map(p => p.left));
|
|
162
|
+
if (!joinPairsCoverKey(leftKeys, leftEqSet))
|
|
163
|
+
return [];
|
|
164
|
+
return rightKeys.map(key => key.map(c => ({ index: c.index + leftColumnCount, desc: c.desc })));
|
|
165
|
+
}
|
|
166
|
+
case 'semi':
|
|
167
|
+
case 'anti':
|
|
168
|
+
return leftKeys.map(key => key.map(c => ({ index: c.index, desc: c.desc })));
|
|
169
|
+
case 'full':
|
|
170
|
+
default:
|
|
171
|
+
return [];
|
|
40
172
|
}
|
|
41
|
-
return result;
|
|
42
173
|
}
|
|
43
174
|
/**
|
|
44
175
|
* Shared key-coverage analysis for all join node types.
|
|
45
176
|
*
|
|
46
|
-
* Checks whether equi-join pairs cover a unique key on either side (logical
|
|
47
|
-
*
|
|
48
|
-
*
|
|
177
|
+
* Checks whether equi-join pairs cover a unique key on either side (via logical
|
|
178
|
+
* `RelationType.keys` or the FD closure of the side's physical properties). When
|
|
179
|
+
* a key is covered, the other side's unique keys are preserved and
|
|
180
|
+
* estimatedRows is capped at the non-covered side's row count.
|
|
49
181
|
*
|
|
50
182
|
* @param joinType The join type (inner, left, semi, etc.)
|
|
51
183
|
* @param leftPhys Physical properties of the left child
|
|
52
184
|
* @param rightPhys Physical properties of the right child
|
|
53
|
-
* @param leftType Logical type of the left child (for logical keys)
|
|
54
|
-
* @param rightType Logical type of the right child (for logical keys)
|
|
185
|
+
* @param leftType Logical type of the left child (for logical keys + colCount)
|
|
186
|
+
* @param rightType Logical type of the right child (for logical keys + colCount)
|
|
55
187
|
* @param equiPairs Equi-join column index pairs (left index, right index)
|
|
56
188
|
* @param leftRows Estimated rows from left child
|
|
57
189
|
* @param rightRows Estimated rows from right child
|
|
58
190
|
* @param leftColumnCount Number of columns on the left side (for shifting right key indices)
|
|
59
191
|
*/
|
|
60
192
|
export function analyzeJoinKeyCoverage(joinType, leftPhys, rightPhys, leftType, rightType, equiPairs, leftRows, rightRows, leftColumnCount) {
|
|
61
|
-
|
|
62
|
-
|
|
193
|
+
const leftColCount = leftType?.columns.length ?? leftColumnCount;
|
|
194
|
+
const rightColCount = rightType?.columns.length ?? 0;
|
|
195
|
+
// Logical keys on each side, as column-index arrays.
|
|
196
|
+
const leftLogicalKeys = (leftType?.keys ?? []).map(k => k.map(c => c.index));
|
|
197
|
+
const rightLogicalKeys = (rightType?.keys ?? []).map(k => k.map(c => c.index));
|
|
63
198
|
if (joinType === 'semi' || joinType === 'anti') {
|
|
199
|
+
// Left's keys survive (output is the left shape). Preserved-key list mirrors
|
|
200
|
+
// left's logical keys; the propagateJoinFds layer materializes them as FDs.
|
|
64
201
|
return {
|
|
65
202
|
leftKeyCovered: false,
|
|
66
203
|
rightKeyCovered: false,
|
|
67
|
-
|
|
204
|
+
preservedKeys: leftLogicalKeys.map(k => k.slice()),
|
|
68
205
|
estimatedRows: undefined,
|
|
69
206
|
};
|
|
70
207
|
}
|
|
71
|
-
if (joinType
|
|
72
|
-
return { leftKeyCovered: false, rightKeyCovered: false,
|
|
208
|
+
if (joinType === 'full') {
|
|
209
|
+
return { leftKeyCovered: false, rightKeyCovered: false, preservedKeys: [], estimatedRows: undefined };
|
|
73
210
|
}
|
|
74
211
|
const leftEqSet = new Set(equiPairs.map(p => p.left));
|
|
75
212
|
const rightEqSet = new Set(equiPairs.map(p => p.right));
|
|
76
|
-
function
|
|
77
|
-
|
|
78
|
-
return false;
|
|
79
|
-
return keys.some(key => key.length > 0 && key.every(ref => eqSet.has(ref.index)));
|
|
213
|
+
function coversLogicalKey(keys, eqSet) {
|
|
214
|
+
return keys.some(key => key.length > 0 && key.every(idx => eqSet.has(idx)));
|
|
80
215
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
216
|
+
const leftKeyCovered = coversLogicalKey(leftLogicalKeys, leftEqSet) ||
|
|
217
|
+
isSuperkey(leftEqSet, leftPhys?.fds, leftColCount);
|
|
218
|
+
const rightKeyCovered = coversLogicalKey(rightLogicalKeys, rightEqSet) ||
|
|
219
|
+
isSuperkey(rightEqSet, rightPhys?.fds, rightColCount);
|
|
220
|
+
// Surviving "physical" keys on each side: union of logical keys and any
|
|
221
|
+
// non-trivial key sets the FD closure makes apparent. We use logical keys
|
|
222
|
+
// (the schema/type-level claim) — they're the source of truth for "this
|
|
223
|
+
// relation has a key on these columns". Physical FDs may have additional
|
|
224
|
+
// implied keys but enumerating them costs more than it saves here.
|
|
225
|
+
const leftKeys = leftLogicalKeys;
|
|
226
|
+
const rightKeysShifted = rightLogicalKeys.map(k => k.map(i => i + leftColumnCount));
|
|
227
|
+
const preservedKeys = [];
|
|
228
|
+
let estimatedRows = undefined;
|
|
229
|
+
if (joinType === 'inner' || joinType === 'cross') {
|
|
230
|
+
if (rightKeyCovered)
|
|
231
|
+
preservedKeys.push(...leftKeys.map(k => k.slice()));
|
|
232
|
+
if (leftKeyCovered)
|
|
233
|
+
preservedKeys.push(...rightKeysShifted.map(k => k.slice()));
|
|
234
|
+
// Cardinality reduction: when a key is covered, result rows ≤ the other side's rows
|
|
235
|
+
if (rightKeyCovered && typeof leftRows === 'number')
|
|
236
|
+
estimatedRows = leftRows;
|
|
237
|
+
if (leftKeyCovered && typeof rightRows === 'number')
|
|
238
|
+
estimatedRows = (estimatedRows === undefined) ? rightRows : Math.min(estimatedRows, rightRows);
|
|
239
|
+
}
|
|
240
|
+
else if (joinType === 'left') {
|
|
241
|
+
// LEFT outer: left's keys survive (and left's rowcount caps the output) iff
|
|
242
|
+
// the equi-pairs cover a right-side unique key — each left row then matches
|
|
243
|
+
// ≤ 1 right row, so no row duplication. The right-side keys do NOT survive:
|
|
244
|
+
// unmatched left rows produce NULL-padded right columns, breaking right keys.
|
|
245
|
+
if (rightKeyCovered) {
|
|
246
|
+
preservedKeys.push(...leftKeys.map(k => k.slice()));
|
|
247
|
+
if (typeof leftRows === 'number')
|
|
248
|
+
estimatedRows = leftRows;
|
|
249
|
+
}
|
|
85
250
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (preserved.length > 0)
|
|
96
|
-
uniqueKeys = preserved;
|
|
97
|
-
// Cardinality reduction: when a key is covered, result rows ≤ the other side's rows
|
|
98
|
-
if (rightKeyCovered && typeof leftRows === 'number')
|
|
99
|
-
estimatedRows = leftRows;
|
|
100
|
-
if (leftKeyCovered && typeof rightRows === 'number')
|
|
101
|
-
estimatedRows = (estimatedRows === undefined) ? rightRows : Math.min(estimatedRows, rightRows);
|
|
102
|
-
return { leftKeyCovered, rightKeyCovered, uniqueKeys, estimatedRows };
|
|
251
|
+
else if (joinType === 'right') {
|
|
252
|
+
// Symmetric to LEFT.
|
|
253
|
+
if (leftKeyCovered) {
|
|
254
|
+
preservedKeys.push(...rightKeysShifted.map(k => k.slice()));
|
|
255
|
+
if (typeof rightRows === 'number')
|
|
256
|
+
estimatedRows = rightRows;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return { leftKeyCovered, rightKeyCovered, preservedKeys, estimatedRows };
|
|
103
260
|
}
|
|
104
261
|
/**
|
|
105
262
|
* Extract TableSchema from a plan node by walking down through common wrappers
|
|
@@ -127,9 +284,14 @@ export function extractTableSchema(node) {
|
|
|
127
284
|
/**
|
|
128
285
|
* Check if an FK→PK relationship aligns with equi-join pairs.
|
|
129
286
|
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
287
|
+
* Alignment is *positional*: for each declared FK column at index `i`, the
|
|
288
|
+
* equi-pair partner must equal the FK's declared `referencedColumns[i]`. A
|
|
289
|
+
* composite FK `(fa, fb) REFERENCES p(a, b)` only covers the pairing
|
|
290
|
+
* `fa = a AND fb = b`; a permuted equi-pair set (`fa = b AND fb = a`) is NOT
|
|
291
|
+
* guaranteed by the FK and must not be reported as aligned. A defensive
|
|
292
|
+
* cross-check additionally requires every `fk.referencedColumns[i]` to be a
|
|
293
|
+
* PK column so a malformed FK referencing non-PK columns is never reported as
|
|
294
|
+
* an IND on the PK.
|
|
133
295
|
*/
|
|
134
296
|
export function checkFkPkAlignment(fkTable, pkTable, fkEquiIndices, pkEquiIndices) {
|
|
135
297
|
if (!fkTable.foreignKeys)
|
|
@@ -137,23 +299,38 @@ export function checkFkPkAlignment(fkTable, pkTable, fkEquiIndices, pkEquiIndice
|
|
|
137
299
|
for (const fk of fkTable.foreignKeys) {
|
|
138
300
|
if (fk.referencedTable.toLowerCase() !== pkTable.name.toLowerCase())
|
|
139
301
|
continue;
|
|
140
|
-
// Check if the FK columns are all present as equi-join columns
|
|
141
|
-
// and the corresponding PK columns on the other side match the PK definition
|
|
142
302
|
const pkDef = pkTable.primaryKeyDefinition;
|
|
143
303
|
if (pkDef.length === 0 || fk.columns.length !== pkDef.length)
|
|
144
304
|
continue;
|
|
305
|
+
// FK schemas store an empty referencedColumns at CREATE TABLE time; the
|
|
306
|
+
// real indices are resolved against the parent here.
|
|
307
|
+
let refCols;
|
|
308
|
+
try {
|
|
309
|
+
refCols = resolveReferencedColumns(fk, pkTable);
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (refCols.length !== fk.columns.length)
|
|
315
|
+
continue;
|
|
145
316
|
// Build mapping: for each equi-pair, fk column index -> pk column index
|
|
146
317
|
const equiMap = new Map();
|
|
147
318
|
for (let i = 0; i < fkEquiIndices.length; i++) {
|
|
148
319
|
equiMap.set(fkEquiIndices[i], pkEquiIndices[i]);
|
|
149
320
|
}
|
|
150
|
-
// Check: every FK column is in equi-pairs, and the corresponding PK column
|
|
151
|
-
// is part of the primary key
|
|
152
321
|
const pkColSet = new Set(pkDef.map(pk => pk.index));
|
|
153
322
|
let allAligned = true;
|
|
154
|
-
for (
|
|
155
|
-
|
|
156
|
-
|
|
323
|
+
for (let i = 0; i < fk.columns.length; i++) {
|
|
324
|
+
// Defensive: a malformed FK referencing a non-PK column must never be
|
|
325
|
+
// reported as an IND on the parent PK.
|
|
326
|
+
if (!pkColSet.has(refCols[i])) {
|
|
327
|
+
allAligned = false;
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
// Positional match: the equi-partner of fk.columns[i] must equal the
|
|
331
|
+
// parent column the FK declares at position i.
|
|
332
|
+
const partner = equiMap.get(fk.columns[i]);
|
|
333
|
+
if (partner !== refCols[i]) {
|
|
157
334
|
allAligned = false;
|
|
158
335
|
break;
|
|
159
336
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-utils.js","sourceRoot":"","sources":["../../../../src/planner/util/key-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"key-utils.js","sourceRoot":"","sources":["../../../../src/planner/util/key-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delta executor kernel.
|
|
3
|
+
*
|
|
4
|
+
* A reusable dispatcher that any change-driven consumer (assertions today;
|
|
5
|
+
* materialized views, reactive signals, triggers tomorrow) can register
|
|
6
|
+
* subscriptions against. The kernel inspects per-subscription bindings
|
|
7
|
+
* (`BindingMode`), collects the relevant changed binding tuples from the
|
|
8
|
+
* TransactionManager's change capture, applies a cost-based fallback to
|
|
9
|
+
* global re-evaluation when too many tuples would need per-binding dispatch,
|
|
10
|
+
* and invokes the subscription's `apply` once with the resulting batches.
|
|
11
|
+
*
|
|
12
|
+
* The kernel itself is stateless across runs; subscriptions own their own
|
|
13
|
+
* residual plan cache (no shared cache, since plan-shape generation is
|
|
14
|
+
* consumer-specific).
|
|
15
|
+
*/
|
|
16
|
+
import { type SqlValue } from '../common/types.js';
|
|
17
|
+
import type { BindingMode } from '../planner/analysis/binding-extractor.js';
|
|
18
|
+
import type { ChangeScope, QualifiedName, WatchHandler } from '../planner/analysis/change-scope.js';
|
|
19
|
+
/**
|
|
20
|
+
* The slice of `Database` the kernel needs. Decoupled so subscriptions can
|
|
21
|
+
* be unit-tested against a minimal mock.
|
|
22
|
+
*/
|
|
23
|
+
export interface DeltaExecutorContext {
|
|
24
|
+
/** Changed base tables for the current commit. */
|
|
25
|
+
getChangedBaseTables(): Set<string>;
|
|
26
|
+
/** Projected tuples for a changed base table. PK columns are always
|
|
27
|
+
* available; non-PK columns must be registered via `registerCaptureSpec`
|
|
28
|
+
* before any DML records changes. */
|
|
29
|
+
getChangedTuples(base: string, columnIndices: readonly number[], pkIndices: readonly number[]): SqlValue[][];
|
|
30
|
+
/** Heuristic row count for cost fallback. Optional — when omitted the
|
|
31
|
+
* kernel does not demote any bindings to global. */
|
|
32
|
+
getRowCount?(base: string): number | undefined;
|
|
33
|
+
/** Tuning parameter: ratio of changed-distinct-tuples to table row count
|
|
34
|
+
* above which the kernel demotes a 'row'/'group' binding to 'global'. */
|
|
35
|
+
readonly deltaPerRowFallbackRatio: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Input to a subscription's `apply`. Carries per-relation tuple batches plus
|
|
39
|
+
* a set of relations that should be re-evaluated globally (either because
|
|
40
|
+
* the binding is 'global' or because the cost-fallback fired).
|
|
41
|
+
*/
|
|
42
|
+
export interface DeltaApplyInput {
|
|
43
|
+
/** RelationKey → tuples to bind for that relation. Tuple order matches
|
|
44
|
+
* the BindingMode's `keyColumns`/`groupColumns`. */
|
|
45
|
+
readonly perRelationTuples: ReadonlyMap<string, readonly SqlValue[][]>;
|
|
46
|
+
/** RelationKeys flagged for global re-evaluation. */
|
|
47
|
+
readonly globalRelations: ReadonlySet<string>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A single change-driven consumer registered with the executor.
|
|
51
|
+
*/
|
|
52
|
+
export interface DeltaSubscription {
|
|
53
|
+
/** Diagnostic id (e.g. 'assertion:no_negative_balance'). */
|
|
54
|
+
readonly id: string;
|
|
55
|
+
/** Base table dependencies (lowercased 'schema.table'). */
|
|
56
|
+
readonly dependencies: ReadonlySet<string>;
|
|
57
|
+
/** BindingMode per relationKey (one per TableReferenceNode instance). */
|
|
58
|
+
readonly bindings: ReadonlyMap<string, BindingMode>;
|
|
59
|
+
/** relationKey → base table (from PlanBindings). */
|
|
60
|
+
readonly relationToBase: ReadonlyMap<string, string>;
|
|
61
|
+
/** PK indices per base table; used to retrieve changed tuples. */
|
|
62
|
+
readonly pkIndicesByBase: ReadonlyMap<string, readonly number[]>;
|
|
63
|
+
/** Invoked once with the per-relation batches for this commit. */
|
|
64
|
+
apply(input: DeltaApplyInput): Promise<void>;
|
|
65
|
+
/** Release any external resources this subscription holds. */
|
|
66
|
+
dispose(): void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Coordinates delta dispatch across all registered subscriptions.
|
|
70
|
+
*/
|
|
71
|
+
export declare class DeltaExecutor {
|
|
72
|
+
private readonly ctx;
|
|
73
|
+
private subscriptions;
|
|
74
|
+
constructor(ctx: DeltaExecutorContext);
|
|
75
|
+
/**
|
|
76
|
+
* Register a subscription. Returns a dispose handle that removes the
|
|
77
|
+
* subscription and calls its `dispose()`.
|
|
78
|
+
*/
|
|
79
|
+
register(sub: DeltaSubscription): () => void;
|
|
80
|
+
/** Dispose all subscriptions. */
|
|
81
|
+
disposeAll(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Run all impacted subscriptions. Throws on the first subscription's
|
|
84
|
+
* `apply` rejection — exceptions are surfaced unchanged so the COMMIT
|
|
85
|
+
* path can roll back.
|
|
86
|
+
*/
|
|
87
|
+
runAll(): Promise<void>;
|
|
88
|
+
private runOne;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Minimal table-info shape used by `subscriptionFromChangeScope` for column
|
|
92
|
+
* resolution and PK lookup. Kept generic so the helper does not import the
|
|
93
|
+
* schema module directly.
|
|
94
|
+
*/
|
|
95
|
+
export interface ChangeScopeTableInfo {
|
|
96
|
+
/** Lowercased column name → column index. */
|
|
97
|
+
readonly columnIndexMap: ReadonlyMap<string, number>;
|
|
98
|
+
/** Primary-key column indices, in PK order. */
|
|
99
|
+
readonly pkIndices: readonly number[];
|
|
100
|
+
}
|
|
101
|
+
/** Context provided by `Database.watch` to the helper. */
|
|
102
|
+
export interface SubscriptionFromChangeScopeContext {
|
|
103
|
+
/** Resolve a qualified base table. Used for column-index lookup and as
|
|
104
|
+
* the existence gate (returns `undefined` if the table is missing). */
|
|
105
|
+
resolveTable(qname: QualifiedName): ChangeScopeTableInfo | undefined;
|
|
106
|
+
/** Register a column-capture spec; returns a dispose handle. Called once
|
|
107
|
+
* per base table that needs extra columns captured (i.e. row/group key
|
|
108
|
+
* columns outside the PK, and `full` watches with a non-`'all'` column
|
|
109
|
+
* set). */
|
|
110
|
+
registerCaptureSpec(baseTable: string, spec: {
|
|
111
|
+
extraColumns: ReadonlySet<number>;
|
|
112
|
+
}): () => void;
|
|
113
|
+
/** Return a stable transaction id for the current commit. The watcher
|
|
114
|
+
* subscription includes this on every emitted `WatchEvent`. */
|
|
115
|
+
getCurrentTxnId(): string;
|
|
116
|
+
}
|
|
117
|
+
export interface SubscriptionFromChangeScopeResult {
|
|
118
|
+
subscription: DeltaSubscription;
|
|
119
|
+
/** Capture-spec dispose handles to release on `unsubscribe`. */
|
|
120
|
+
captureDisposers: Array<() => void>;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Translate a public `ChangeScope` into a `DeltaSubscription` plus its
|
|
124
|
+
* capture-spec dispose handles. Pure shape-translation: callers (i.e.
|
|
125
|
+
* `Database.watch`) own validation of unbound parameters, schema-change
|
|
126
|
+
* invalidation, and registration with the executor.
|
|
127
|
+
*
|
|
128
|
+
* Throws synchronously if:
|
|
129
|
+
* - any referenced table no longer exists in the schema;
|
|
130
|
+
* - any column referenced in `key` / `groupBy` / `columns` does not exist
|
|
131
|
+
* on its table.
|
|
132
|
+
*/
|
|
133
|
+
export declare function subscriptionFromChangeScope(scope: ChangeScope, handler: WatchHandler, id: string, ctx: SubscriptionFromChangeScopeContext): SubscriptionFromChangeScopeResult;
|
|
134
|
+
//# sourceMappingURL=delta-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta-executor.d.ts","sourceRoot":"","sources":["../../../src/runtime/delta-executor.ts"],"names":[],"mappings":"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"}
|