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

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

commit dda9edac43b097d6371e61bedeb7e378ebaa2e1e
Author: Beyyes <[email protected]>
AuthorDate: Mon Apr 22 11:00:03 2024 +0800

    fix LogicalExpression Identifier problem; fix column transformer concurrent 
problem
---
 .../relational/ColumnTransformerBuilder.java       | 71 +++++++++++-----------
 .../plan/planner/TableOperatorGenerator.java       |  1 +
 .../plan/relational/planner/PlanBuilder.java       |  9 +++
 .../plan/relational/planner/QueryPlanner.java      |  5 ++
 4 files changed, 52 insertions(+), 34 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
index 5f1c4544e44..577ef24121c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
@@ -299,8 +299,8 @@ public class ColumnTransformerBuilder
       ComparisonExpression node, Context context) {
     // fixme why using computeIfAbsent throw npe
     ColumnTransformer comparisonTransformer;
-    if (!context.cache.containsKey(node)) {
-      comparisonTransformer = getColumnTransformer(node, context);
+    if (context.cache.containsKey(node)) {
+      comparisonTransformer = context.cache.get(node);
     } else {
       comparisonTransformer = getColumnTransformer(node, context);
       context.cache.put(node, comparisonTransformer);
@@ -546,38 +546,41 @@ public class ColumnTransformerBuilder
 
   @Override
   protected ColumnTransformer visitLogicalExpression(LogicalExpression node, 
Context context) {
-    ColumnTransformer res =
-        context.cache.computeIfAbsent(
-            node,
-            n -> {
-              if (context.hasSeen.containsKey(node)) {
-                IdentityColumnTransformer identity =
-                    new IdentityColumnTransformer(
-                        BOOLEAN, context.originSize + 
context.commonTransformerList.size());
-                ColumnTransformer columnTransformer = 
context.hasSeen.get(node);
-                columnTransformer.addReferenceCount();
-                context.commonTransformerList.add(columnTransformer);
-                context.leafList.add(identity);
-                context.inputDataTypes.add(TSDataType.BOOLEAN);
-                return identity;
-              } else {
-                List<ColumnTransformer> children =
-                    node.getChildren().stream()
-                        .map(c -> process(c, context))
-                        .collect(Collectors.toList());
-                switch (node.getOperator()) {
-                  case OR:
-                    return new LogicalOrMultiColumnTransformer(BOOLEAN, 
children);
-                  case AND:
-                    return new LogicalAndMultiColumnTransformer(BOOLEAN, 
children);
-                  default:
-                    throw new UnsupportedOperationException(
-                        String.format(UNSUPPORTED_EXPRESSION, 
node.getOperator()));
-                }
-              }
-            });
-    res.addReferenceCount();
-    return res;
+    ColumnTransformer logicalTransformer;
+    if (context.cache.containsKey(node)) {
+      logicalTransformer = context.cache.get(node);
+    } else {
+      logicalTransformer = getColumnTransformer(node, context);
+      context.cache.put(node, logicalTransformer);
+    }
+    logicalTransformer.addReferenceCount();
+    return logicalTransformer;
+  }
+
+  private ColumnTransformer getColumnTransformer(LogicalExpression node, 
Context context) {
+    if (context.hasSeen.containsKey(node)) {
+      IdentityColumnTransformer identity =
+          new IdentityColumnTransformer(
+              BOOLEAN, context.originSize + 
context.commonTransformerList.size());
+      ColumnTransformer columnTransformer = context.hasSeen.get(node);
+      columnTransformer.addReferenceCount();
+      context.commonTransformerList.add(columnTransformer);
+      context.leafList.add(identity);
+      context.inputDataTypes.add(TSDataType.BOOLEAN);
+      return identity;
+    } else {
+      List<ColumnTransformer> children =
+          node.getChildren().stream().map(c -> process(c, 
context)).collect(Collectors.toList());
+      switch (node.getOperator()) {
+        case OR:
+          return new LogicalOrMultiColumnTransformer(BOOLEAN, children);
+        case AND:
+          return new LogicalAndMultiColumnTransformer(BOOLEAN, children);
+        default:
+          throw new UnsupportedOperationException(
+              String.format(UNSUPPORTED_EXPRESSION, node.getOperator()));
+      }
+    }
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index 741a2582e34..bd17059f141 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -422,6 +422,7 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
   }
 
   private List<TSDataType> getInputColumnTypes(PlanNode node, TypeProvider 
typeProvider) {
+    // ignore "time" column
     return node.getChildren().stream()
         .map(PlanNode::getOutputSymbols)
         .flatMap(List::stream)
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
index 21254c1d9ea..d48cc74ef71 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanBuilder.java
@@ -25,6 +25,7 @@ import 
org.apache.iotdb.db.relational.sql.tree.ComparisonExpression;
 import org.apache.iotdb.db.relational.sql.tree.Expression;
 import org.apache.iotdb.db.relational.sql.tree.FieldReference;
 import org.apache.iotdb.db.relational.sql.tree.Identifier;
+import org.apache.iotdb.db.relational.sql.tree.LogicalExpression;
 import org.apache.iotdb.db.relational.sql.tree.SymbolReference;
 
 import com.google.common.collect.ImmutableMap;
@@ -37,6 +38,7 @@ import java.util.Optional;
 import java.util.Set;
 
 import static com.google.common.base.Verify.verify;
+import static com.google.common.collect.ImmutableList.toImmutableList;
 import static java.util.Objects.requireNonNull;
 
 public class PlanBuilder {
@@ -106,6 +108,13 @@ public class PlanBuilder {
       return new ComparisonExpression(comparisonExpression.getOperator(), 
left, right);
     } else if (expression instanceof Identifier) {
       return 
getSymbolForColumn(expression).map(Symbol::toSymbolReference).get();
+    } else if (expression instanceof LogicalExpression) {
+      LogicalExpression logicalExpression = (LogicalExpression) expression;
+      return new LogicalExpression(
+          logicalExpression.getOperator(),
+          logicalExpression.getTerms().stream()
+              .map(e -> translate(e, false))
+              .collect(toImmutableList()));
     }
 
     return expression;
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 48182677f15..f542fb07c7d 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
@@ -246,6 +246,11 @@ public class QueryPlanner {
     Pair<Expression, Boolean> resultPair = 
extractGlobalTimePredicate(predicate, true, true);
     Expression globalTimePredicate = resultPair.left;
     analysis.setGlobalTableModelTimePredicate(globalTimePredicate);
+    boolean hasValueFilter = resultPair.right;
+    if (!hasValueFilter) {
+      return subPlan;
+    }
+    // TODO if predicate equals true, no need filter
 
     return subPlan.withNewRoot(
         new FilterNode(

Reply via email to