You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2024/05/21 13:02:33 UTC
(iotdb) 07/26: fix LogicalExpression Identifier problem; fix column transformer concurrent problem
This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch beyyes/debug-table
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit b5ef7dce2cb9d3eae13f9f337a19ad9576b08be4
Author: Beyyes <cg...@foxmail.com>
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(