From 5cc6a363e22c22a6ee770be83225e4c0c9ccc195 Mon Sep 17 00:00:00 2001 From: Marcus Henriksson Date: Sun, 7 Jun 2026 10:30:46 +0200 Subject: [PATCH] feat: Let catalogs be able to handle TOP to avoid streaming whole tables back. This only works for single select queries feat: Add code coverage subsystem that lets queries be hooked in into Junit to assert and view missed operators / expression branches etc. feat: Add PlanRule system to assets can be made to a compiled query. Like a TableSacan as a child to a Join, forcing all joins to be indexed etc. --- .../api/catalog/DatasourceData.java | 18 + .../catalog/jdbc/JdbcCatalog.java | 2 +- .../catalog/jdbc/JdbcDatasource.java | 31 +- .../jdbc/dialect/MySqlMariaDbDialect.java | 7 + .../catalog/jdbc/dialect/PostgreDialect.java | 7 + .../catalog/jdbc/dialect/SqlDialect.java | 28 +- .../jdbc/dialect/SqlServerDialect.java | 6 + .../catalog/jdbc/BaseJDBCTest.java | 30 ++ payloadbuilder-core/pom.xml | 45 ++- .../payloadbuilder/core/CompiledQuery.java | 9 +- .../payloadbuilder/core/Payloadbuilder.java | 13 +- .../payloadbuilder/core/cache/MBeanUtils.java | 4 + .../core/execution/CaseCoverageData.java | 61 ++++ .../execution/LogicalBinaryCoverageData.java | 53 +++ .../core/execution/PlanOperatorInfo.java | 84 +++++ .../core/execution/PlanRule.java | 16 + .../core/execution/PlanRuleRegistry.java | 47 +++ .../execution/PlanRuleViolationException.java | 10 + .../core/execution/QueryCoverageData.java | 304 +++++++++++++++++ .../core/execution/QueryCoverageRegistry.java | 53 +++ .../expression/ARewriteExpressionVisitor.java | 3 +- .../core/expression/CaseExpression.java | 14 + .../InstrumentedCaseExpression.java | 129 ++++++++ .../InstrumentedLogicalBinaryExpression.java | 107 ++++++ .../expression/LogicalBinaryExpression.java | 13 + .../core/expression/PredicateAnalyzer.java | 39 ++- .../core/logicalplan/Filter.java | 13 + .../payloadbuilder/core/logicalplan/Join.java | 13 + .../core/logicalplan/Projection.java | 13 + .../payloadbuilder/core/logicalplan/Sort.java | 13 + .../optimization/ALogicalPlanOptimizer.java | 8 +- .../optimization/ColumnOrdinalResolver.java | 8 +- .../optimization/ColumnResolver.java | 8 +- .../ComputedExpressionPushDown.java | 8 +- .../optimization/PredicatePushDown.java | 15 +- .../SubQueryExpressionPushDown.java | 2 +- .../core/parser/QueryParser.java | 37 +-- .../core/physicalplan/AnalyzeInterceptor.java | 6 + .../core/physicalplan/CoveragePlan.java | 243 ++++++++++++++ .../physicalplan/CoverageTupleVector.java | 64 ++++ .../core/physicalplan/TableScan.java | 5 + .../planning/CoverageExpressionRewriter.java | 66 ++++ .../core/planning/QueryPlanner.java | 135 +++++++- .../core/planning/StatementPlanner.java | 23 ++ .../core/planning/StatementRewriter.java | 109 +++++- .../core/physicalplan/CoveragePlanTest.java | 278 ++++++++++++++++ .../core/planning/QueryPlannerTest.java | 41 ++- payloadbuilder-test/.gitignore | 1 + payloadbuilder-test/README.md | 263 +++++++++++++++ payloadbuilder-test/pom.xml | 38 +++ .../test/CoverageAccumulator.java | 52 +++ .../payloadbuilder/test/CoverageReport.java | 312 ++++++++++++++++++ .../test/CoverageTestFactory.java | 288 ++++++++++++++++ .../test/QueryCoverageExtension.java | 195 +++++++++++ .../QueryCoverageExtensionExampleTest.java | 152 +++++++++ .../test/resources/queries/filter-example.sql | 3 + pom.xml | 1 + 57 files changed, 3466 insertions(+), 80 deletions(-) create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/CaseCoverageData.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/LogicalBinaryCoverageData.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/PlanOperatorInfo.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/PlanRule.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/PlanRuleRegistry.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/PlanRuleViolationException.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/QueryCoverageData.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/execution/QueryCoverageRegistry.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/expression/InstrumentedCaseExpression.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/expression/InstrumentedLogicalBinaryExpression.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/physicalplan/CoveragePlan.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/physicalplan/CoverageTupleVector.java create mode 100644 payloadbuilder-core/src/main/java/se/kuseman/payloadbuilder/core/planning/CoverageExpressionRewriter.java create mode 100644 payloadbuilder-core/src/test/java/se/kuseman/payloadbuilder/core/physicalplan/CoveragePlanTest.java create mode 100644 payloadbuilder-test/.gitignore create mode 100644 payloadbuilder-test/README.md create mode 100644 payloadbuilder-test/pom.xml create mode 100644 payloadbuilder-test/src/main/java/se/kuseman/payloadbuilder/test/CoverageAccumulator.java create mode 100644 payloadbuilder-test/src/main/java/se/kuseman/payloadbuilder/test/CoverageReport.java create mode 100644 payloadbuilder-test/src/main/java/se/kuseman/payloadbuilder/test/CoverageTestFactory.java create mode 100644 payloadbuilder-test/src/main/java/se/kuseman/payloadbuilder/test/QueryCoverageExtension.java create mode 100644 payloadbuilder-test/src/test/java/se/kuseman/payloadbuilder/test/QueryCoverageExtensionExampleTest.java create mode 100644 payloadbuilder-test/src/test/resources/queries/filter-example.sql diff --git a/payloadbuilder-api/src/main/java/se/kuseman/payloadbuilder/api/catalog/DatasourceData.java b/payloadbuilder-api/src/main/java/se/kuseman/payloadbuilder/api/catalog/DatasourceData.java index 3d16be95f..8ce94eb0a 100644 --- a/payloadbuilder-api/src/main/java/se/kuseman/payloadbuilder/api/catalog/DatasourceData.java +++ b/payloadbuilder-api/src/main/java/se/kuseman/payloadbuilder/api/catalog/DatasourceData.java @@ -21,6 +21,8 @@ public class DatasourceData private final List sortItems; private final Projection projection; private final List