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/04/22 03:10:31 UTC
(iotdb) branch beyyes/ty/TableModelGrammar created (now dda9edac43b)
This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a change to branch beyyes/ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git
at dda9edac43b fix LogicalExpression Identifier problem; fix column transformer concurrent problem
This branch includes the following new commits:
new dda9edac43b fix LogicalExpression Identifier problem; fix column transformer concurrent problem
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(iotdb) 01/01: fix LogicalExpression Identifier problem; fix column transformer concurrent problem
Posted by ca...@apache.org.
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 <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(