This is an automated email from the ASF dual-hosted git repository. caogaofei pushed a commit to branch beyyes/TableModel in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d25299c153c78600bf325bb6ecc7f57a63bf82c4 Author: Beyyes <[email protected]> AuthorDate: Sun Jun 2 16:02:49 2024 +0800 add globalTimeFilter logic in planFilter, but how does it use in FragmentInstanceContext --- .../db/queryengine/common/MPPQueryContext.java | 4 ++++ .../plan/relational/planner/QueryPlanner.java | 4 ++++ .../planner/optimizations/IndexScan.java | 27 ++++++++++++++------- .../plan/relational/analyzer/AnalyzerTest.java | 28 +++++++++++++++------- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java index 3a42ee805b0..b348fee081c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java @@ -223,6 +223,10 @@ public class MPPQueryContext { PredicateUtils.convertPredicateToTimeFilter(analysis.getGlobalTimePredicate()); } + public void setGlobalTimeFilter(Filter globalTimeFilter) { + this.globalTimeFilter = globalTimeFilter; + } + public Filter getGlobalTimeFilter() { // time filter may be stateful, so we need to copy it return globalTimeFilter != null ? globalTimeFilter.copy() : null; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java index a3e1dec9819..7dc67a7df05 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/QueryPlanner.java @@ -19,6 +19,7 @@ import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef; +import org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.ConvertPredicateToTimeFilterVisitor; import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.ExpressionTranslateVisitor; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.FilterNode; import org.apache.iotdb.db.queryengine.plan.relational.planner.node.LimitNode; @@ -250,6 +251,9 @@ public class QueryPlanner { if (resultPair.left != null) { globalTimePredicate = ExpressionTranslateVisitor.translateToSymbolReference(resultPair.left, planBuilder); + + queryContext.setGlobalTimeFilter( + globalTimePredicate.accept(new ConvertPredicateToTimeFilterVisitor(), null)); } analysis.setGlobalTableModelTimePredicate(globalTimePredicate); boolean hasValueFilter = resultPair.right; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java index 56eb8ea082d..5ef8c8d9620 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/IndexScan.java @@ -58,8 +58,6 @@ public class IndexScan implements RelationalPlanOptimizer { static final IoTDBConfig CONFIG = IoTDBDescriptor.getInstance().getConfig(); - private MPPQueryContext mppQueryContext; - @Override public PlanNode optimize( PlanNode planNode, @@ -67,14 +65,15 @@ public class IndexScan implements RelationalPlanOptimizer { Metadata metadata, IPartitionFetcher partitionFetcher, SessionInfo sessionInfo, - MPPQueryContext context) { + MPPQueryContext queryContext) { return planNode.accept( new Rewriter(), - new RewriterContext(null, metadata, sessionInfo, analysis, partitionFetcher)); + new RewriterContext(null, metadata, sessionInfo, analysis, partitionFetcher, queryContext)); } private static class Rewriter extends PlanVisitor<PlanNode, RewriterContext> { + @Override public PlanNode visitPlan(PlanNode node, RewriterContext context) { for (PlanNode child : node.getChildren()) { @@ -109,9 +108,7 @@ public class IndexScan implements RelationalPlanOptimizer { attributeColumns); node.setDeviceEntries(deviceEntries); - // TODO getDataPartition, Change globalTimeFilter to Filter String treeDatabase = "root." + dbName; - Filter globalTimeFilter = null; Set<String> deviceSet = new HashSet<>(); for (DeviceEntry deviceEntry : deviceEntries) { StringArrayDeviceID arrayDeviceID = (StringArrayDeviceID) deviceEntry.getDeviceID(); @@ -121,7 +118,10 @@ public class IndexScan implements RelationalPlanOptimizer { DataPartition dataPartition = fetchDataPartitionByDevices( - deviceSet, treeDatabase, globalTimeFilter, context.partitionFetcher); + deviceSet, + treeDatabase, + context.getQueryContext().getGlobalTimeFilter(), + context.getPartitionFetcher()); context.getAnalysis().setDataPartition(dataPartition); if (dataPartition.getDataPartitionMap().size() > 1) { @@ -218,18 +218,21 @@ public class IndexScan implements RelationalPlanOptimizer { private final SessionInfo sessionInfo; private final Analysis analysis; private final IPartitionFetcher partitionFetcher; + private final MPPQueryContext queryContext; RewriterContext( Expression predicate, Metadata metadata, SessionInfo sessionInfo, Analysis analysis, - IPartitionFetcher partitionFetcher) { + IPartitionFetcher partitionFetcher, + MPPQueryContext queryContext) { this.predicate = predicate; this.metadata = metadata; this.sessionInfo = sessionInfo; this.analysis = analysis; this.partitionFetcher = partitionFetcher; + this.queryContext = queryContext; } public Expression getPredicate() { @@ -255,5 +258,13 @@ public class IndexScan implements RelationalPlanOptimizer { public Analysis getAnalysis() { return this.analysis; } + + public IPartitionFetcher getPartitionFetcher() { + return partitionFetcher; + } + + public MPPQueryContext getQueryContext() { + return queryContext; + } } } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java index 104cdc9ed48..4eb9a17fb43 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java @@ -155,21 +155,29 @@ public class AnalyzerTest { "db", IClientSession.SqlDialect.TABLE); Metadata metadata = new TestMatadata(); + String sql; + Analysis actualAnalysis; + MPPQueryContext context; + LogicalPlanner logicalPlanner; + LogicalQueryPlan logicalQueryPlan; + PlanNode rootNode; + TableDistributionPlanner distributionPlanner; + DistributedQueryPlan distributedQueryPlan; @Test public void singleTableNoFilterTest() throws IoTDBException { // 1. wildcard - String sql = "SELECT * FROM table1"; - Analysis actualAnalysis = analyzeSQL(sql, metadata); + sql = "SELECT * FROM table1"; + actualAnalysis = analyzeSQL(sql, metadata); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); - MPPQueryContext context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - LogicalPlanner logicalPlanner = + context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); + logicalPlanner = new LogicalPlanner( context, metadata, sessionInfo, getFakePartitionFetcher(), WarningCollector.NOOP); - LogicalQueryPlan logicalQueryPlan = logicalPlanner.plan(actualAnalysis); - PlanNode rootNode = logicalQueryPlan.getRootNode(); + logicalQueryPlan = logicalPlanner.plan(actualAnalysis); + rootNode = logicalQueryPlan.getRootNode(); assertTrue(rootNode instanceof OutputNode); assertTrue(((OutputNode) rootNode).getChild() instanceof TableScanNode); TableScanNode tableScanNode = (TableScanNode) ((OutputNode) rootNode).getChild(); @@ -180,11 +188,13 @@ public class AnalyzerTest { assertEquals(5, tableScanNode.getIdAndAttributeIndexMap().size()); assertEquals(ASC, tableScanNode.getScanOrder()); - TableDistributionPlanner distributionPlanner = - new TableDistributionPlanner(actualAnalysis, logicalQueryPlan, context); + distributionPlanner = new TableDistributionPlanner(actualAnalysis, logicalQueryPlan, context); DistributedQueryPlan distributedQueryPlan = distributionPlanner.plan(); assertEquals(4, distributedQueryPlan.getInstances().size()); + } + @Test + public void singleTableWithTimeFilterTest() throws IoTDBException { // 2. global time filter sql = "SELECT * FROM table1 where time > 1"; actualAnalysis = analyzeSQL(sql, metadata); @@ -199,7 +209,7 @@ public class AnalyzerTest { rootNode = logicalQueryPlan.getRootNode(); assertTrue(rootNode instanceof OutputNode); assertTrue(((OutputNode) rootNode).getChild() instanceof TableScanNode); - tableScanNode = (TableScanNode) ((OutputNode) rootNode).getChild(); + TableScanNode tableScanNode = (TableScanNode) ((OutputNode) rootNode).getChild(); assertEquals("table1", tableScanNode.getQualifiedTableName()); assertEquals(8, tableScanNode.getOutputSymbols().size()); assertEquals(8, tableScanNode.getAssignments().size());
