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(
