@quereus/quereus 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -23
- package/dist/src/common/types.d.ts +1 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/core/database.d.ts +22 -4
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +44 -6
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +0 -7
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +1 -51
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +0 -11
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/index.d.ts +13 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +10 -4
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +40 -44
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-pass.js +12 -6
- package/dist/src/planner/analysis/const-pass.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +11 -0
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -0
- package/dist/src/planner/building/constraint-builder.js +79 -0
- package/dist/src/planner/building/constraint-builder.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +7 -4
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts +3 -0
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +33 -7
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +5 -2
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +46 -9
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-context.js +20 -11
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +5 -3
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +29 -20
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts +3 -1
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +15 -20
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +6 -3
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts +25 -2
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +147 -24
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table.d.ts +0 -10
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +1 -35
- package/dist/src/planner/building/table.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +8 -5
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +7 -8
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cache/correlation-detector.d.ts +11 -0
- package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -0
- package/dist/src/planner/cache/correlation-detector.js +73 -0
- package/dist/src/planner/cache/correlation-detector.js.map +1 -0
- package/dist/src/planner/cache/materialization-advisory.d.ts +12 -18
- package/dist/src/planner/cache/materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/cache/materialization-advisory.js +65 -46
- package/dist/src/planner/cache/materialization-advisory.js.map +1 -1
- package/dist/src/planner/cache/reference-graph.d.ts +14 -9
- package/dist/src/planner/cache/reference-graph.d.ts.map +1 -1
- package/dist/src/planner/cache/reference-graph.js +93 -84
- package/dist/src/planner/cache/reference-graph.js.map +1 -1
- package/dist/src/planner/debug.d.ts +25 -0
- package/dist/src/planner/debug.d.ts.map +1 -1
- package/dist/src/planner/debug.js +127 -0
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/context.d.ts +11 -0
- package/dist/src/planner/framework/context.d.ts.map +1 -1
- package/dist/src/planner/framework/context.js +25 -2
- package/dist/src/planner/framework/context.js.map +1 -1
- package/dist/src/planner/framework/registry.d.ts +3 -7
- package/dist/src/planner/framework/registry.d.ts.map +1 -1
- package/dist/src/planner/framework/registry.js +20 -31
- package/dist/src/planner/framework/registry.js.map +1 -1
- package/dist/src/planner/nodes/add-constraint-node.d.ts +2 -1
- package/dist/src/planner/nodes/add-constraint-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/add-constraint-node.js +3 -0
- package/dist/src/planner/nodes/add-constraint-node.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +6 -4
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cache-node.js +2 -2
- package/dist/src/planner/nodes/cache-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +13 -6
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +38 -12
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/create-index-node.d.ts +2 -1
- package/dist/src/planner/nodes/create-index-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-index-node.js +3 -0
- package/dist/src/planner/nodes/create-index-node.js.map +1 -1
- package/dist/src/planner/nodes/create-table-node.d.ts +2 -1
- package/dist/src/planner/nodes/create-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-table-node.js +3 -0
- package/dist/src/planner/nodes/create-table-node.js.map +1 -1
- package/dist/src/planner/nodes/create-view-node.d.ts +2 -1
- package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-view-node.js +3 -0
- package/dist/src/planner/nodes/create-view-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-node.js +33 -12
- package/dist/src/planner/nodes/cte-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.d.ts +18 -4
- package/dist/src/planner/nodes/cte-reference-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +40 -10
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/delete-node.d.ts +4 -3
- package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/delete-node.js +20 -6
- package/dist/src/planner/nodes/delete-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 +2 -2
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js +2 -2
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/nodes/drop-table-node.d.ts +2 -1
- package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-table-node.js +3 -0
- package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
- package/dist/src/planner/nodes/drop-view-node.d.ts +2 -1
- package/dist/src/planner/nodes/drop-view-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-view-node.js +3 -0
- package/dist/src/planner/nodes/drop-view-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +3 -3
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/insert-node.d.ts +2 -1
- package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/insert-node.js +18 -5
- package/dist/src/planner/nodes/insert-node.js.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +28 -0
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +69 -0
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -0
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +3 -3
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +2 -2
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +1 -1
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +23 -0
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +25 -2
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +5 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +39 -20
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
- package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js +20 -8
- package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +4 -2
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +21 -13
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +26 -2
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +82 -10
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.js +2 -2
- package/dist/src/planner/nodes/sequencing-node.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 +3 -3
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/single-row.d.ts +4 -2
- package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
- package/dist/src/planner/nodes/single-row.js +3 -0
- package/dist/src/planner/nodes/single-row.js.map +1 -1
- package/dist/src/planner/nodes/sink-node.d.ts +1 -1
- package/dist/src/planner/nodes/sink-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/sink-node.js +4 -4
- package/dist/src/planner/nodes/sink-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +2 -2
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -0
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +64 -11
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/subquery.d.ts +4 -4
- package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js +68 -23
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +83 -0
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -0
- package/dist/src/planner/nodes/table-access-nodes.js +226 -0
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -0
- package/dist/src/planner/nodes/update-node.d.ts +4 -2
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +26 -13
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +25 -23
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +46 -50
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +13 -0
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +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 +59 -53
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +62 -2
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js +31 -24
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
- package/dist/src/planner/scopes/base.d.ts +0 -10
- package/dist/src/planner/scopes/base.d.ts.map +1 -1
- package/dist/src/planner/scopes/base.js +0 -14
- package/dist/src/planner/scopes/base.js.map +1 -1
- package/dist/src/planner/scopes/empty.d.ts +0 -2
- package/dist/src/planner/scopes/empty.d.ts.map +1 -1
- package/dist/src/planner/scopes/empty.js +0 -8
- package/dist/src/planner/scopes/empty.js.map +1 -1
- package/dist/src/planner/scopes/multi.d.ts.map +1 -1
- package/dist/src/planner/scopes/multi.js +0 -1
- package/dist/src/planner/scopes/multi.js.map +1 -1
- package/dist/src/planner/scopes/param.d.ts.map +1 -1
- package/dist/src/planner/scopes/param.js +0 -1
- package/dist/src/planner/scopes/param.js.map +1 -1
- package/dist/src/planner/scopes/registered.d.ts +0 -10
- package/dist/src/planner/scopes/registered.d.ts.map +1 -1
- package/dist/src/planner/scopes/registered.js +1 -17
- package/dist/src/planner/scopes/registered.js.map +1 -1
- package/dist/src/planner/scopes/scope.d.ts +0 -8
- package/dist/src/planner/scopes/scope.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -7
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/context-helpers.d.ts +45 -0
- package/dist/src/runtime/context-helpers.d.ts.map +1 -0
- package/dist/src/runtime/context-helpers.js +139 -0
- package/dist/src/runtime/context-helpers.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +1 -0
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +2 -1
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +119 -86
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts +5 -0
- package/dist/src/runtime/emit/between.d.ts.map +1 -0
- package/dist/src/runtime/emit/between.js +38 -0
- package/dist/src/runtime/emit/between.js.map +1 -0
- package/dist/src/runtime/emit/binary.d.ts +0 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +0 -36
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/column-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/column-reference.js +2 -26
- package/dist/src/runtime/emit/column-reference.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +16 -123
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js +16 -48
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js +2 -8
- package/dist/src/runtime/emit/distinct.js.map +1 -1
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js +6 -13
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts +5 -0
- package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -0
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js +23 -0
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -0
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +40 -40
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +13 -13
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +3 -14
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +7 -14
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts +5 -2
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +21 -17
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/sort.d.ts.map +1 -1
- package/dist/src/runtime/emit/sort.js +8 -11
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +95 -40
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.js +7 -22
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +20 -27
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +55 -83
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/emitters.d.ts.map +1 -1
- package/dist/src/runtime/emitters.js +49 -1
- package/dist/src/runtime/emitters.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +5 -4
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/src/runtime/scheduler.js +47 -42
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +34 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js +21 -0
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +29 -16
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/table.d.ts +4 -4
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +10 -10
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/util/plugin-loader.d.ts +10 -1
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +56 -1
- package/dist/src/util/plugin-loader.js.map +1 -1
- package/dist/src/util/working-table-iterable.d.ts.map +1 -1
- package/dist/src/util/working-table-iterable.js +8 -8
- package/dist/src/util/working-table-iterable.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts +36 -0
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +1 -1
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/package.json +8 -3
- package/src/common/types.ts +1 -0
- package/src/core/database.ts +48 -6
- package/src/core/statement.ts +1 -49
- package/src/func/builtins/explain.ts +0 -11
- package/src/index.ts +39 -5
- package/src/parser/ast.ts +12 -6
- package/src/parser/parser.ts +45 -52
- package/src/planner/analysis/const-pass.ts +281 -270
- package/src/planner/building/constraint-builder.ts +114 -0
- package/src/planner/building/delete.ts +18 -5
- package/src/planner/building/expression.ts +35 -7
- package/src/planner/building/insert.ts +16 -3
- package/src/planner/building/select-aggregates.ts +57 -11
- package/src/planner/building/select-context.ts +22 -12
- package/src/planner/building/select-modifiers.ts +35 -21
- package/src/planner/building/select-projections.ts +25 -26
- package/src/planner/building/select-window.ts +14 -9
- package/src/planner/building/select.ts +163 -31
- package/src/planner/building/table.ts +1 -40
- package/src/planner/building/update.ts +22 -7
- package/src/planner/building/with.ts +12 -13
- package/src/planner/cache/correlation-detector.ts +83 -0
- package/src/planner/cache/materialization-advisory.ts +71 -50
- package/src/planner/cache/reference-graph.ts +115 -91
- package/src/planner/debug.ts +163 -0
- package/src/planner/framework/context.ts +36 -2
- package/src/planner/framework/registry.ts +261 -274
- package/src/planner/nodes/add-constraint-node.ts +5 -1
- package/src/planner/nodes/aggregate-node.ts +6 -4
- package/src/planner/nodes/cache-node.ts +2 -2
- package/src/planner/nodes/constraint-check-node.ts +49 -15
- package/src/planner/nodes/create-index-node.ts +5 -1
- package/src/planner/nodes/create-table-node.ts +5 -1
- package/src/planner/nodes/create-view-node.ts +5 -1
- package/src/planner/nodes/cte-node.ts +45 -14
- package/src/planner/nodes/cte-reference-node.ts +49 -13
- package/src/planner/nodes/delete-node.ts +31 -7
- package/src/planner/nodes/distinct-node.ts +2 -2
- package/src/planner/nodes/dml-executor-node.ts +3 -3
- package/src/planner/nodes/drop-table-node.ts +5 -1
- package/src/planner/nodes/drop-view-node.ts +5 -1
- package/src/planner/nodes/filter.ts +3 -3
- package/src/planner/nodes/function.ts +93 -93
- package/src/planner/nodes/insert-node.ts +28 -5
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +76 -0
- package/src/planner/nodes/join-node.ts +3 -3
- package/src/planner/nodes/limit-offset.ts +2 -2
- package/src/planner/nodes/plan-node-type.ts +1 -1
- package/src/planner/nodes/plan-node.ts +39 -2
- package/src/planner/nodes/project-node.ts +39 -19
- package/src/planner/nodes/recursive-cte-node.ts +37 -9
- package/src/planner/nodes/reference.ts +4 -2
- package/src/planner/nodes/returning-node.ts +25 -13
- package/src/planner/nodes/scalar.ts +95 -11
- package/src/planner/nodes/sequencing-node.ts +2 -2
- package/src/planner/nodes/set-operation-node.ts +3 -3
- package/src/planner/nodes/single-row.ts +7 -2
- package/src/planner/nodes/sink-node.ts +5 -5
- package/src/planner/nodes/sort.ts +2 -2
- package/src/planner/nodes/stream-aggregate.ts +76 -12
- package/src/planner/nodes/subquery.ts +90 -27
- package/src/planner/nodes/{physical-access-nodes.ts → table-access-nodes.ts} +6 -6
- package/src/planner/nodes/update-node.ts +31 -13
- package/src/planner/nodes/window-node.ts +28 -22
- package/src/planner/optimizer.ts +257 -263
- package/src/planner/planning-context.ts +15 -0
- package/src/planner/rules/access/rule-select-access-path.ts +68 -64
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +74 -2
- package/src/planner/rules/cache/rule-materialization-advisory.ts +31 -27
- package/src/planner/scopes/base.ts +0 -17
- package/src/planner/scopes/empty.ts +0 -10
- package/src/planner/scopes/multi.ts +0 -1
- package/src/planner/scopes/param.ts +0 -1
- package/src/planner/scopes/registered.ts +1 -20
- package/src/planner/scopes/scope.ts +0 -12
- package/src/planner/validation/plan-validator.ts +1 -8
- package/src/runtime/context-helpers.ts +191 -0
- package/src/runtime/emission-context.ts +5 -2
- package/src/runtime/emit/aggregate.ts +131 -85
- package/src/runtime/emit/between.ts +51 -0
- package/src/runtime/emit/binary.ts +0 -46
- package/src/runtime/emit/column-reference.ts +3 -36
- package/src/runtime/emit/constraint-check.ts +19 -144
- package/src/runtime/emit/cte-reference.ts +23 -60
- package/src/runtime/emit/distinct.ts +2 -7
- package/src/runtime/emit/filter.ts +6 -13
- package/src/runtime/emit/internal-recursive-cte-ref.ts +37 -0
- package/src/runtime/emit/join.ts +45 -43
- package/src/runtime/emit/project.ts +18 -12
- package/src/runtime/emit/recursive-cte.ts +3 -12
- package/src/runtime/emit/returning.ts +7 -14
- package/src/runtime/emit/scan.ts +25 -23
- package/src/runtime/emit/sort.ts +8 -11
- package/src/runtime/emit/subquery.ts +108 -48
- package/src/runtime/emit/table-valued-function.ts +7 -20
- package/src/runtime/emit/update.ts +22 -29
- package/src/runtime/emit/window.ts +74 -88
- package/src/runtime/emitters.ts +52 -1
- package/src/runtime/register.ts +5 -4
- package/src/runtime/scheduler.ts +54 -54
- package/src/runtime/types.ts +45 -0
- package/src/schema/manager.ts +34 -19
- package/src/schema/table.ts +8 -8
- package/src/util/plugin-loader.ts +78 -4
- package/src/util/working-table-iterable.ts +15 -7
- package/src/vtab/manifest.ts +42 -0
- package/src/vtab/table.ts +1 -1
- package/src/planner/nodes/scan.ts +0 -103
- package/src/planner/rules/physical/rule-mark-physical.ts +0 -37
- package/src/runtime/emit/table-reference.ts +0 -92
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* Decides when and how to inject caching based on reference graph analysis
|
|
4
4
|
*/
|
|
5
5
|
import { createLogger } from '../../common/logger.js';
|
|
6
|
+
import { isRelationalNode } from '../nodes/plan-node.js';
|
|
6
7
|
import { CacheNode } from '../nodes/cache-node.js';
|
|
7
8
|
import { PlanNodeType } from '../nodes/plan-node-type.js';
|
|
8
9
|
import { ReferenceGraphBuilder } from './reference-graph.js';
|
|
10
|
+
import { isCorrelatedSubquery } from './correlation-detector.js';
|
|
9
11
|
const log = createLogger('optimizer:cache:materialization');
|
|
10
12
|
/**
|
|
11
13
|
* Materialization advisory that analyzes plan trees and recommends caching
|
|
@@ -18,29 +20,32 @@ export class MaterializationAdvisory {
|
|
|
18
20
|
this.referenceBuilder = new ReferenceGraphBuilder(tuning);
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
|
-
* Analyze a plan tree and
|
|
23
|
+
* Analyze a plan tree and inject caching where beneficial
|
|
24
|
+
* Returns the transformed tree or the original if no caching was added
|
|
22
25
|
*/
|
|
23
|
-
|
|
26
|
+
analyzeAndTransform(root) {
|
|
27
|
+
// Build reference graph
|
|
24
28
|
const refGraph = this.referenceBuilder.buildReferenceGraph(root);
|
|
29
|
+
// Build recommendations
|
|
25
30
|
const recommendations = new Map();
|
|
26
31
|
for (const [node, stats] of refGraph) {
|
|
27
32
|
// Only consider relational nodes for caching
|
|
28
|
-
if (!
|
|
33
|
+
if (!isRelationalNode(node)) {
|
|
29
34
|
continue;
|
|
30
35
|
}
|
|
31
36
|
const recommendation = this.adviseCaching(node, stats);
|
|
32
|
-
recommendations.set(node, recommendation);
|
|
33
37
|
if (recommendation.shouldCache) {
|
|
38
|
+
recommendations.set(node, recommendation);
|
|
34
39
|
log('Recommending cache for %s: %s', node.nodeType, recommendation.reason);
|
|
35
40
|
}
|
|
36
41
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return this.
|
|
42
|
+
if (recommendations.size === 0) {
|
|
43
|
+
log('No caching opportunities identified');
|
|
44
|
+
return root;
|
|
45
|
+
}
|
|
46
|
+
log('Found %d caching opportunities', recommendations.size);
|
|
47
|
+
// Transform the tree by wrapping recommended nodes with CacheNode
|
|
48
|
+
return this.transformTree(root, recommendations);
|
|
44
49
|
}
|
|
45
50
|
/**
|
|
46
51
|
* Core advisory algorithm
|
|
@@ -64,7 +69,17 @@ export class MaterializationAdvisory {
|
|
|
64
69
|
reason: 'Already cached'
|
|
65
70
|
};
|
|
66
71
|
}
|
|
67
|
-
// Rule 3:
|
|
72
|
+
// Rule 3: Correlated subqueries should not be cached
|
|
73
|
+
// Check if this node is part of a subquery context and if it's correlated
|
|
74
|
+
if (isRelationalNode(node) && this.isCorrelatedNode(node)) {
|
|
75
|
+
return {
|
|
76
|
+
shouldCache: false,
|
|
77
|
+
strategy: 'memory',
|
|
78
|
+
threshold: 0,
|
|
79
|
+
reason: 'Correlated subquery - must re-execute for each outer row'
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Rule 4: Single-parent nodes that don't appear in loops typically don't benefit from caching
|
|
68
83
|
if (stats.parentCount <= 1 && !stats.appearsInLoop) {
|
|
69
84
|
return {
|
|
70
85
|
shouldCache: false,
|
|
@@ -73,7 +88,7 @@ export class MaterializationAdvisory {
|
|
|
73
88
|
reason: 'Single parent, not in loop'
|
|
74
89
|
};
|
|
75
90
|
}
|
|
76
|
-
// Rule
|
|
91
|
+
// Rule 5: Multi-parent nodes benefit from caching
|
|
77
92
|
if (stats.parentCount > 1) {
|
|
78
93
|
const strategy = this.selectStrategy(stats.estimatedRows);
|
|
79
94
|
const threshold = this.calculateThreshold(stats.estimatedRows, strategy);
|
|
@@ -84,7 +99,7 @@ export class MaterializationAdvisory {
|
|
|
84
99
|
reason: `Multiple parents (${stats.parentCount})`
|
|
85
100
|
};
|
|
86
101
|
}
|
|
87
|
-
// Rule
|
|
102
|
+
// Rule 6: Nodes in loop contexts benefit from caching even with single parent
|
|
88
103
|
if (stats.appearsInLoop) {
|
|
89
104
|
// Check if the estimated size is reasonable for caching
|
|
90
105
|
if (stats.estimatedRows > this.tuning.join.maxRightRowsForCaching) {
|
|
@@ -113,8 +128,8 @@ export class MaterializationAdvisory {
|
|
|
113
128
|
};
|
|
114
129
|
}
|
|
115
130
|
/**
|
|
116
|
-
|
|
117
|
-
|
|
131
|
+
* Select appropriate cache strategy based on estimated size
|
|
132
|
+
*/
|
|
118
133
|
selectStrategy(estimatedRows) {
|
|
119
134
|
// Use tuning configuration for strategy selection
|
|
120
135
|
if (this.tuning.cache.spillEnabled && estimatedRows > this.tuning.cache.spillThreshold) {
|
|
@@ -134,20 +149,25 @@ export class MaterializationAdvisory {
|
|
|
134
149
|
maxThreshold);
|
|
135
150
|
}
|
|
136
151
|
/**
|
|
137
|
-
* Check if a node is
|
|
152
|
+
* Check if a node is part of a correlated subquery
|
|
138
153
|
*/
|
|
139
|
-
|
|
140
|
-
|
|
154
|
+
isCorrelatedNode(node) {
|
|
155
|
+
// Check if this is a relational node that could be correlated
|
|
156
|
+
if (isRelationalNode(node)) {
|
|
157
|
+
return isCorrelatedSubquery(node);
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
141
160
|
}
|
|
142
161
|
/**
|
|
143
|
-
* Transform a
|
|
162
|
+
* Transform a tree by wrapping recommended nodes with CacheNode
|
|
163
|
+
* Uses a bottom-up approach to ensure proper transformation
|
|
144
164
|
*/
|
|
145
|
-
|
|
146
|
-
// First,
|
|
165
|
+
transformTree(node, recommendations) {
|
|
166
|
+
// First, transform all children recursively
|
|
147
167
|
const transformedNode = this.transformChildren(node, recommendations);
|
|
148
|
-
//
|
|
168
|
+
// Then check if this node itself should be cached
|
|
149
169
|
const recommendation = recommendations.get(node);
|
|
150
|
-
if (recommendation?.shouldCache &&
|
|
170
|
+
if (recommendation?.shouldCache && isRelationalNode(transformedNode)) {
|
|
151
171
|
log('Injecting %s cache for %s (threshold: %d)', recommendation.strategy, transformedNode.nodeType, recommendation.threshold);
|
|
152
172
|
return new CacheNode(transformedNode.scope, transformedNode, recommendation.strategy, recommendation.threshold);
|
|
153
173
|
}
|
|
@@ -155,32 +175,31 @@ export class MaterializationAdvisory {
|
|
|
155
175
|
}
|
|
156
176
|
/**
|
|
157
177
|
* Transform children of a node
|
|
178
|
+
* This handles both scalar and relational children using a simpler approach
|
|
158
179
|
*/
|
|
159
180
|
transformChildren(node, recommendations) {
|
|
160
|
-
//
|
|
161
|
-
// For
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
181
|
+
// For nodes that we know how to handle, transform their children
|
|
182
|
+
// For others, return the node as-is (the optimizer will handle it)
|
|
183
|
+
// First, try to transform scalar children using withChildren
|
|
184
|
+
const scalarChildren = node.getChildren();
|
|
185
|
+
const transformedScalarChildren = scalarChildren.map(child => this.transformTree(child, recommendations));
|
|
186
|
+
const scalarChanged = transformedScalarChildren.some((child, idx) => child !== scalarChildren[idx]);
|
|
187
|
+
if (scalarChanged) {
|
|
188
|
+
// Let withChildren handle the transformation
|
|
189
|
+
// This will maintain proper attribute IDs and node structure
|
|
190
|
+
try {
|
|
191
|
+
return node.withChildren(transformedScalarChildren);
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
// If withChildren fails, log and return original
|
|
195
|
+
log('Warning: withChildren failed for %s: %s', node.nodeType, e);
|
|
196
|
+
return node;
|
|
169
197
|
}
|
|
170
198
|
}
|
|
171
|
-
// If no
|
|
172
|
-
return node
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
* Recreate a node with new relational children
|
|
176
|
-
* This is a simplified version - in practice, would need comprehensive node cloning
|
|
177
|
-
*/
|
|
178
|
-
recreateNodeWithNewRelations(node, _newRelations) {
|
|
179
|
-
// TODO: This is a simplified implementation
|
|
180
|
-
// In practice, would need to handle all node types properly
|
|
181
|
-
// For now, just return the original node
|
|
182
|
-
// This would need to be expanded to handle all node types
|
|
183
|
-
log('Node recreation not yet implemented for %s', node.nodeType);
|
|
199
|
+
// If no scalar children changed, check if this node has relational children
|
|
200
|
+
// that might need caching. For now, we'll return the node as-is and let
|
|
201
|
+
// individual optimization rules handle relational transformations.
|
|
202
|
+
// This is safer than trying to recreate complex nodes.
|
|
184
203
|
return node;
|
|
185
204
|
}
|
|
186
205
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialization-advisory.js","sourceRoot":"","sources":["../../../../src/planner/cache/materialization-advisory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"materialization-advisory.js","sourceRoot":"","sources":["../../../../src/planner/cache/materialization-advisory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reference graph builder for materialization advisory
|
|
3
3
|
* Analyzes plan tree to identify nodes that would benefit from caching
|
|
4
|
+
*
|
|
5
|
+
* Note: This builder works with logical plan nodes and their properties.
|
|
6
|
+
* It does not make assumptions about execution strategies (e.g., whether
|
|
7
|
+
* a join will use nested loops vs hash join). Loop detection and execution
|
|
8
|
+
* multipliers should be determined during physical optimization when
|
|
9
|
+
* concrete execution strategies are chosen.
|
|
4
10
|
*/
|
|
5
|
-
import type
|
|
11
|
+
import { type PlanNode } from '../nodes/plan-node.js';
|
|
6
12
|
import type { OptimizerTuning } from '../optimizer-tuning.js';
|
|
7
13
|
/**
|
|
8
14
|
* Statistics about how a node is referenced in the plan tree
|
|
@@ -16,6 +22,10 @@ export interface RefStats {
|
|
|
16
22
|
estimatedRows: number;
|
|
17
23
|
/** Whether this node is deterministic (same inputs produce same outputs) */
|
|
18
24
|
deterministic: boolean;
|
|
25
|
+
/** Parent nodes that reference this node (for debugging) */
|
|
26
|
+
parents: Set<PlanNode>;
|
|
27
|
+
/** Estimated execution multiplier due to loop contexts */
|
|
28
|
+
loopMultiplier: number;
|
|
19
29
|
}
|
|
20
30
|
/**
|
|
21
31
|
* Builds a reference graph for materialization decisions
|
|
@@ -23,24 +33,19 @@ export interface RefStats {
|
|
|
23
33
|
export declare class ReferenceGraphBuilder {
|
|
24
34
|
private tuning;
|
|
25
35
|
private refMap;
|
|
26
|
-
private visited;
|
|
27
36
|
constructor(tuning: OptimizerTuning);
|
|
28
37
|
/**
|
|
29
38
|
* Build reference statistics for all nodes in the plan tree
|
|
30
39
|
*/
|
|
31
40
|
buildReferenceGraph(root: PlanNode): Map<PlanNode, RefStats>;
|
|
32
41
|
/**
|
|
33
|
-
*
|
|
42
|
+
* Build reference statistics recursively
|
|
34
43
|
*/
|
|
35
|
-
private
|
|
36
|
-
/**
|
|
37
|
-
* Second pass: identify nodes that appear in loop contexts
|
|
38
|
-
*/
|
|
39
|
-
private identifyLoopContexts;
|
|
44
|
+
private buildReferences;
|
|
40
45
|
/**
|
|
41
46
|
* Visit all children of a node
|
|
42
47
|
*/
|
|
43
|
-
private
|
|
48
|
+
private visitAllChildren;
|
|
44
49
|
/**
|
|
45
50
|
* Get estimated row count for a node
|
|
46
51
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-graph.d.ts","sourceRoot":"","sources":["../../../../src/planner/cache/reference-graph.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reference-graph.d.ts","sourceRoot":"","sources":["../../../../src/planner/cache/reference-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,aAAa,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;CACvB;AAcD;;GAEG;AACH,qBAAa,qBAAqB;IAGrB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAiC;gBAE3B,MAAM,EAAE,eAAe;IAE3C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAqB5D;;OAEG;IACH,OAAO,CAAC,eAAe;IA4CvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,OAAO,CAAC,eAAe;CAQvB"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reference graph builder for materialization advisory
|
|
3
3
|
* Analyzes plan tree to identify nodes that would benefit from caching
|
|
4
|
+
*
|
|
5
|
+
* Note: This builder works with logical plan nodes and their properties.
|
|
6
|
+
* It does not make assumptions about execution strategies (e.g., whether
|
|
7
|
+
* a join will use nested loops vs hash join). Loop detection and execution
|
|
8
|
+
* multipliers should be determined during physical optimization when
|
|
9
|
+
* concrete execution strategies are chosen.
|
|
4
10
|
*/
|
|
5
11
|
import { createLogger } from '../../common/logger.js';
|
|
6
|
-
import {
|
|
7
|
-
import { JoinNode } from '../nodes/join-node.js';
|
|
12
|
+
import { isRelationalNode } from '../nodes/plan-node.js';
|
|
8
13
|
const log = createLogger('optimizer:cache:reference-graph');
|
|
9
14
|
/**
|
|
10
15
|
* Builds a reference graph for materialization decisions
|
|
@@ -12,7 +17,6 @@ const log = createLogger('optimizer:cache:reference-graph');
|
|
|
12
17
|
export class ReferenceGraphBuilder {
|
|
13
18
|
tuning;
|
|
14
19
|
refMap = new Map();
|
|
15
|
-
visited = new Set();
|
|
16
20
|
constructor(tuning) {
|
|
17
21
|
this.tuning = tuning;
|
|
18
22
|
}
|
|
@@ -20,79 +24,95 @@ export class ReferenceGraphBuilder {
|
|
|
20
24
|
* Build reference statistics for all nodes in the plan tree
|
|
21
25
|
*/
|
|
22
26
|
buildReferenceGraph(root) {
|
|
27
|
+
if (!root) {
|
|
28
|
+
log('Warning: buildReferenceGraph called with null root');
|
|
29
|
+
return new Map();
|
|
30
|
+
}
|
|
23
31
|
this.refMap.clear();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
// Build the reference graph with proper parent tracking
|
|
33
|
+
const context = {
|
|
34
|
+
parent: null,
|
|
35
|
+
inLoop: false,
|
|
36
|
+
loopIterations: 1
|
|
37
|
+
};
|
|
38
|
+
this.buildReferences(root, context);
|
|
29
39
|
log('Built reference graph with %d nodes', this.refMap.size);
|
|
30
40
|
return new Map(this.refMap);
|
|
31
41
|
}
|
|
32
42
|
/**
|
|
33
|
-
*
|
|
43
|
+
* Build reference statistics recursively
|
|
34
44
|
*/
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
// Node seen again - increment parent count
|
|
38
|
-
const stats = this.refMap.get(node);
|
|
39
|
-
if (stats) {
|
|
40
|
-
stats.parentCount++;
|
|
41
|
-
}
|
|
45
|
+
buildReferences(node, context) {
|
|
46
|
+
if (!node) {
|
|
42
47
|
return;
|
|
43
48
|
}
|
|
44
|
-
this
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Second pass: identify nodes that appear in loop contexts
|
|
60
|
-
*/
|
|
61
|
-
identifyLoopContexts(node, inLoop) {
|
|
62
|
-
const stats = this.refMap.get(node);
|
|
63
|
-
if (!stats)
|
|
64
|
-
return;
|
|
65
|
-
// Update loop status if we're now in a loop context
|
|
66
|
-
if (inLoop && !stats.appearsInLoop) {
|
|
67
|
-
stats.appearsInLoop = true;
|
|
68
|
-
log('Node %s marked as appearing in loop', node.nodeType);
|
|
49
|
+
// Get or create stats for this node
|
|
50
|
+
let stats = this.refMap.get(node);
|
|
51
|
+
if (!stats) {
|
|
52
|
+
// First time seeing this node
|
|
53
|
+
stats = {
|
|
54
|
+
parentCount: 0,
|
|
55
|
+
appearsInLoop: context.inLoop,
|
|
56
|
+
estimatedRows: this.getEstimatedRows(node),
|
|
57
|
+
deterministic: this.isDeterministic(node),
|
|
58
|
+
parents: new Set(),
|
|
59
|
+
loopMultiplier: context.loopIterations
|
|
60
|
+
};
|
|
61
|
+
this.refMap.set(node, stats);
|
|
69
62
|
}
|
|
70
|
-
//
|
|
71
|
-
if (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this.identifyLoopContexts(left, inLoop);
|
|
75
|
-
this.identifyLoopContexts(right, true); // Right side is in loop
|
|
63
|
+
// Update stats based on current traversal
|
|
64
|
+
if (context.parent && !stats.parents.has(context.parent)) {
|
|
65
|
+
stats.parents.add(context.parent);
|
|
66
|
+
stats.parentCount++;
|
|
76
67
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
});
|
|
68
|
+
// Update loop context
|
|
69
|
+
if (context.inLoop) {
|
|
70
|
+
stats.appearsInLoop = true;
|
|
71
|
+
stats.loopMultiplier = Math.max(stats.loopMultiplier, context.loopIterations);
|
|
82
72
|
}
|
|
73
|
+
// Create child context - for now, we propagate the parent context
|
|
74
|
+
// In the future, if nodes expose execution strategy hints, we could use those
|
|
75
|
+
const childContext = {
|
|
76
|
+
parent: node,
|
|
77
|
+
inLoop: context.inLoop,
|
|
78
|
+
loopIterations: context.loopIterations
|
|
79
|
+
};
|
|
80
|
+
// Visit all children uniformly
|
|
81
|
+
this.visitAllChildren(node, childContext);
|
|
83
82
|
}
|
|
84
83
|
/**
|
|
85
84
|
* Visit all children of a node
|
|
86
85
|
*/
|
|
87
|
-
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
visitAllChildren(node, childContext) {
|
|
87
|
+
// 1. Scalar children (expressions)
|
|
88
|
+
try {
|
|
89
|
+
const children = node.getChildren();
|
|
90
|
+
for (const child of children) {
|
|
91
|
+
if (child) {
|
|
92
|
+
this.buildReferences(child, childContext);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
91
95
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
+
catch (e) {
|
|
97
|
+
log('Warning: Failed to get children for node %s: %s', node.nodeType, e);
|
|
98
|
+
}
|
|
99
|
+
// 2. Relational children
|
|
100
|
+
// Note: getRelations() returns a subset of getChildren() for nodes that have relational children
|
|
101
|
+
// We need to be careful not to double-count, but since we're using a Set for parents,
|
|
102
|
+
// and checking if we've already added a parent, this should be fine
|
|
103
|
+
if (isRelationalNode(node)) {
|
|
104
|
+
try {
|
|
105
|
+
const relations = node.getRelations();
|
|
106
|
+
for (const relation of relations) {
|
|
107
|
+
if (relation) {
|
|
108
|
+
// For now, treat all relational children the same
|
|
109
|
+
// In the future, nodes could provide hints about execution patterns
|
|
110
|
+
this.buildReferences(relation, childContext);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
log('Warning: Failed to get relations for node %s: %s', node.nodeType, e);
|
|
96
116
|
}
|
|
97
117
|
}
|
|
98
118
|
}
|
|
@@ -100,40 +120,29 @@ export class ReferenceGraphBuilder {
|
|
|
100
120
|
* Get estimated row count for a node
|
|
101
121
|
*/
|
|
102
122
|
getEstimatedRows(node) {
|
|
103
|
-
if (
|
|
104
|
-
return
|
|
123
|
+
if (!node) {
|
|
124
|
+
return this.tuning.defaultRowEstimate;
|
|
105
125
|
}
|
|
106
|
-
|
|
126
|
+
// Use physical properties if available
|
|
127
|
+
if (node.physical?.estimatedRows !== undefined) {
|
|
107
128
|
return node.physical.estimatedRows;
|
|
108
129
|
}
|
|
130
|
+
// Fall back to node-specific estimates (for relational nodes)
|
|
131
|
+
if (isRelationalNode(node) && node.estimatedRows !== undefined) {
|
|
132
|
+
return node.estimatedRows;
|
|
133
|
+
}
|
|
134
|
+
// Default estimate
|
|
109
135
|
return this.tuning.defaultRowEstimate;
|
|
110
136
|
}
|
|
111
137
|
/**
|
|
112
138
|
* Determine if a node is deterministic
|
|
113
139
|
*/
|
|
114
140
|
isDeterministic(node) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return node.physical.deterministic;
|
|
118
|
-
}
|
|
119
|
-
// Node-type specific deterministic analysis
|
|
120
|
-
switch (node.nodeType) {
|
|
121
|
-
case PlanNodeType.TableScan:
|
|
122
|
-
case PlanNodeType.Values:
|
|
123
|
-
case PlanNodeType.Project:
|
|
124
|
-
case PlanNodeType.Filter:
|
|
125
|
-
case PlanNodeType.Sort:
|
|
126
|
-
case PlanNodeType.Aggregate:
|
|
127
|
-
case PlanNodeType.StreamAggregate:
|
|
128
|
-
return true;
|
|
129
|
-
case PlanNodeType.TableFunctionCall:
|
|
130
|
-
// Would need to check if the table function is deterministic
|
|
131
|
-
// For now, assume non-deterministic to be safe
|
|
132
|
-
return false;
|
|
133
|
-
default:
|
|
134
|
-
// Conservative default - assume deterministic unless proven otherwise
|
|
135
|
-
return true;
|
|
141
|
+
if (!node) {
|
|
142
|
+
return true;
|
|
136
143
|
}
|
|
144
|
+
// Use physical properties to determine determinism
|
|
145
|
+
return node.physical?.deterministic ?? true;
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
148
|
//# sourceMappingURL=reference-graph.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-graph.js","sourceRoot":"","sources":["../../../../src/planner/cache/reference-graph.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reference-graph.js","sourceRoot":"","sources":["../../../../src/planner/cache/reference-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,uBAAuB,CAAC;AAGxE,MAAM,GAAG,GAAG,YAAY,CAAC,iCAAiC,CAAC,CAAC;AAgC5D;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAGb;IAFZ,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE/C,YAAoB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAE/C;;OAEG;IACH,mBAAmB,CAAC,IAAc;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAC1D,OAAO,IAAI,GAAG,EAAE,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,wDAAwD;QACxD,MAAM,OAAO,GAAqB;YACjC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,cAAc,EAAE,CAAC;SACjB,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEpC,GAAG,CAAC,qCAAqC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAiC,EAAE,OAAyB;QACnF,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO;QACR,CAAC;QAED,oCAAoC;QACpC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,8BAA8B;YAC9B,KAAK,GAAG;gBACP,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,OAAO,CAAC,MAAM;gBAC7B,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBAC1C,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBACzC,OAAO,EAAE,IAAI,GAAG,EAAY;gBAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;aACtC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,0CAA0C;QAC1C,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QAED,sBAAsB;QACtB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;YAC3B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/E,CAAC;QAED,kEAAkE;QAClE,8EAA8E;QAC9E,MAAM,YAAY,GAAqB;YACtC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,cAAc,EAAE,OAAO,CAAC,cAAc;SACtC,CAAC;QAEF,+BAA+B;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAc,EAAE,YAA8B;QACtE,mCAAmC;QACnC,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,KAAK,EAAE,CAAC;oBACX,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,GAAG,CAAC,iDAAiD,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,yBAAyB;QACzB,iGAAiG;QACjG,sFAAsF;QACtF,oEAAoE;QACpE,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBAClC,IAAI,QAAQ,EAAE,CAAC;wBACd,kDAAkD;wBAClD,oEAAoE;wBACpE,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;oBAC9C,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,GAAG,CAAC,kDAAkD,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAiC;QACzD,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QACvC,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QACpC,CAAC;QAED,8DAA8D;QAC9D,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,aAAa,CAAC;QAC3B,CAAC;QAED,mBAAmB;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAiC;QACxD,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACb,CAAC;QAED,mDAAmD;QACnD,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,IAAI,CAAC;IAC7C,CAAC;CACD"}
|
|
@@ -50,4 +50,29 @@ export declare function getInstructionDebugInfo(instructions: readonly Instructi
|
|
|
50
50
|
* Generates a comprehensive trace report that includes sub-program execution details.
|
|
51
51
|
*/
|
|
52
52
|
export declare function generateTraceReport(tracer: InstructionTracer): string;
|
|
53
|
+
/**
|
|
54
|
+
* Options for plan formatting
|
|
55
|
+
*/
|
|
56
|
+
export interface PlanDisplayOptions {
|
|
57
|
+
/** Show concise plan by default (true) or full details (false) */
|
|
58
|
+
concise?: boolean;
|
|
59
|
+
/** Node IDs to expand with full details (only applies when concise=true) */
|
|
60
|
+
expandNodes?: string[];
|
|
61
|
+
/** Maximum depth to display (default: no limit) */
|
|
62
|
+
maxDepth?: number;
|
|
63
|
+
/** Show physical properties if available */
|
|
64
|
+
showPhysical?: boolean;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Creates a concise, tree-like representation of the plan
|
|
68
|
+
*/
|
|
69
|
+
export declare function formatPlanTree(rootNode: PlanNode, options?: PlanDisplayOptions): string;
|
|
70
|
+
/**
|
|
71
|
+
* Generates a compact plan summary showing just the execution path
|
|
72
|
+
*/
|
|
73
|
+
export declare function formatPlanSummary(rootNode: PlanNode): string;
|
|
74
|
+
/**
|
|
75
|
+
* Enhanced plan serialization with formatting options
|
|
76
|
+
*/
|
|
77
|
+
export declare function serializePlanTreeWithOptions(rootNode: PlanNode, options?: PlanDisplayOptions): string;
|
|
53
78
|
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/planner/debug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAK1E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA+D5D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GACvC,MAAM,CAoDR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GACvC,oBAAoB,EAAE,CA+BxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,GACxB,MAAM,CA+CR"}
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/planner/debug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAK1E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA+D5D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GACvC,MAAM,CAoDR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GACvC,oBAAoB,EAAE,CA+BxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,GACxB,MAAM,CA+CR;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAuG3F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAwB5D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAOzG"}
|