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());

Reply via email to