This is an automated email from the ASF dual-hosted git repository.

caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/ty/TableModelGrammar by this 
push:
     new 588cc8e7229 add skipExecute judgement
588cc8e7229 is described below

commit 588cc8e7229a993a32ff88ee764b400b655ada66
Author: Beyyes <[email protected]>
AuthorDate: Sun Apr 28 15:23:28 2024 +0800

    add skipExecute judgement
---
 .../queryengine/plan/execution/QueryExecution.java | 13 +++++
 .../plan/relational/analyzer/Analysis.java         | 28 +++++++++-
 .../planner/optimizations/IndexScan.java           | 60 ++++++++++++----------
 3 files changed, 72 insertions(+), 29 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
index ea8a3d9af1e..5a0b732107e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
@@ -166,6 +166,19 @@ public class QueryExecution implements IQueryExecution {
     // check timeout for query first
     checkTimeOutForQuery();
     doLogicalPlan();
+
+    if (skipExecute()) {
+      // TODO move this judgement to analyze state?
+      LOGGER.debug("[SkipExecute After LogicalPlan]");
+      if (context.getQueryType() == QueryType.WRITE && analysis.isFailed()) {
+        stateMachine.transitionToFailed(analysis.getFailStatus());
+      } else {
+        constructResultForMemorySource();
+        stateMachine.transitionToRunning();
+      }
+      return;
+    }
+
     doDistributedPlan();
 
     // update timeout after finishing plan stage
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
index 015b3097324..ad131a30354 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analysis.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
 import org.apache.iotdb.db.queryengine.plan.analyze.IAnalysis;
+import 
org.apache.iotdb.db.queryengine.plan.execution.memory.StatementMemorySource;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema;
 import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl;
@@ -82,6 +83,7 @@ import static java.util.Collections.unmodifiableList;
 import static java.util.Collections.unmodifiableMap;
 import static java.util.Collections.unmodifiableSet;
 import static java.util.Objects.requireNonNull;
+import static 
org.apache.iotdb.db.queryengine.common.header.DatasetHeader.EMPTY_HEADER;
 
 public class Analysis implements IAnalysis {
 
@@ -154,6 +156,8 @@ public class Analysis implements IAnalysis {
 
   private DatasetHeader respDatasetHeader;
 
+  private boolean finishQueryAfterAnalyze;
+
   public Expression getGlobalTableModelTimePredicate() {
     return this.globalTableModelTimePredicate;
   }
@@ -575,12 +579,32 @@ public class Analysis implements IAnalysis {
 
   @Override
   public boolean canSkipExecute(MPPQueryContext context) {
-    return false;
+    return isFinishQueryAfterAnalyze();
+  }
+
+  public void setFinishQueryAfterAnalyze() {
+    this.finishQueryAfterAnalyze = true;
+  }
+
+  public boolean isFinishQueryAfterAnalyze() {
+    return finishQueryAfterAnalyze;
+  }
+
+  private boolean hasDataSource() {
+    return (dataPartition != null && !dataPartition.isEmpty());
+    //            || (schemaPartition != null && !schemaPartition.isEmpty())
+    //            || statement instanceof ShowQueriesStatement
+    //            || (statement instanceof QueryStatement
+    //            && ((QueryStatement) statement).isAggregationQuery());
   }
 
   @Override
   public TsBlock constructResultForMemorySource(MPPQueryContext context) {
-    return null;
+    StatementMemorySource source =
+        new StatementMemorySource(
+            new TsBlock(0), respDatasetHeader == null ? EMPTY_HEADER : 
respDatasetHeader);
+    setRespDatasetHeader(source.getDatasetHeader());
+    return source.getTsBlock();
   }
 
   @Override
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 2e967f4f66d..70945da8185 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
@@ -98,31 +98,7 @@ public class IndexScan implements RelationalPlanOptimizer {
               .map(e -> e.getKey().getName())
               .collect(Collectors.toList());
 
-      List<Expression> resultIndexExpressions = new ArrayList<>();
-      Expression originalPredicate = context.getPredicate();
-      if (originalPredicate != null) {
-        Set<String> idOrAttributeColumnNames =
-            node.getIdAndAttributeIndexMap().keySet().stream()
-                .map(Symbol::getName)
-                .collect(Collectors.toSet());
-        if (originalPredicate instanceof LogicalExpression) {
-          for (Expression subExpression : ((LogicalExpression) 
originalPredicate).getTerms()) {
-            if (Boolean.TRUE.equals(
-                new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames)
-                    .process(subExpression))) {
-              resultIndexExpressions.add(subExpression);
-            }
-          }
-        } else {
-          if (Boolean.FALSE.equals(
-              new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames)
-                  .process(originalPredicate))) {
-            resultIndexExpressions = Collections.emptyList();
-          } else {
-            resultIndexExpressions = 
Collections.singletonList(originalPredicate);
-          }
-        }
-      }
+      List<Expression> conjExpressions = 
getConjunctionExpressions(context.getPredicate(), node);
 
       List<DeviceEntry> deviceEntries =
           context
@@ -131,7 +107,7 @@ public class IndexScan implements RelationalPlanOptimizer {
                   new QualifiedObjectName(
                       context.getSessionInfo().getDatabaseName().get(),
                       node.getQualifiedTableName()),
-                  resultIndexExpressions,
+                  conjExpressions,
                   attributeColumns);
       node.setDeviceEntries(deviceEntries);
 
@@ -156,7 +132,7 @@ public class IndexScan implements RelationalPlanOptimizer {
       }
 
       if (dataPartition.getDataPartitionMap().isEmpty()) {
-        node.setRegionReplicaSet(new TRegionReplicaSet());
+        context.getAnalysis().setFinishQueryAfterAnalyze();
       } else {
         // TODO add the real impl
         TRegionReplicaSet regionReplicaSet =
@@ -179,6 +155,36 @@ public class IndexScan implements RelationalPlanOptimizer {
     }
   }
 
+  private static List<Expression> getConjunctionExpressions(
+      Expression predicate, TableScanNode node) {
+    if (predicate != null) {
+      List<Expression> resultExpressions = new ArrayList<>();
+      Set<String> idOrAttributeColumnNames =
+          node.getIdAndAttributeIndexMap().keySet().stream()
+              .map(Symbol::getName)
+              .collect(Collectors.toSet());
+      if (predicate instanceof LogicalExpression) {
+        for (Expression subExpression : ((LogicalExpression) 
predicate).getTerms()) {
+          if (Boolean.TRUE.equals(
+              new PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames)
+                  .process(subExpression))) {
+            resultExpressions.add(subExpression);
+          }
+        }
+      } else {
+        if (Boolean.FALSE.equals(
+            new 
PredicatePushIntoIndexScanChecker(idOrAttributeColumnNames).process(predicate)))
 {
+          resultExpressions = Collections.emptyList();
+        } else {
+          resultExpressions = Collections.singletonList(predicate);
+        }
+      }
+      return resultExpressions;
+    } else {
+      return Collections.emptyList();
+    }
+  }
+
   private static DataPartition fetchDataPartitionByDevices(
       Set<String> deviceSet,
       String database,

Reply via email to