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 7c3a9bd97d49f66f213bf99abea561c3fb3c348c Author: Beyyes <[email protected]> AuthorDate: Thu May 9 22:18:23 2024 +0800 support in, not, diff --- .../relational/metadata/TableMetadataImpl.java | 4 +-- .../planner/ir/ExpressionTranslateVisitor.java | 14 +++++---- .../ir/GlobalTimePredicateExtractVisitor.java | 33 ++++++++++++++++------ 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java index d8f156c3439..0b5ec9f4458 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java @@ -133,11 +133,11 @@ public class TableMetadataImpl implements Metadata { && isNumericType(argumentTypes.get(0)) && BOOLEAN.equals(argumentTypes.get(0)))) { throw new SemanticException( - "Scalar function" + "Scalar function " + functionName.toLowerCase(Locale.ENGLISH) + " only supports one numeric data types [INT32, INT64, FLOAT, DOUBLE] and one boolean"); } - + return argumentTypes.get(0); } else if (BuiltinScalarFunction.ROUND.getFunctionName().equalsIgnoreCase(functionName)) { if (!isOneNumericType(argumentTypes) && !isTwoNumericType(argumentTypes)) { throw new SemanticException( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTranslateVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTranslateVisitor.java index c7a05609bde..86e83783c6b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTranslateVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTranslateVisitor.java @@ -21,12 +21,12 @@ import org.apache.iotdb.db.relational.sql.tree.Expression; import org.apache.iotdb.db.relational.sql.tree.FunctionCall; import org.apache.iotdb.db.relational.sql.tree.Identifier; import org.apache.iotdb.db.relational.sql.tree.IfExpression; +import org.apache.iotdb.db.relational.sql.tree.InListExpression; import org.apache.iotdb.db.relational.sql.tree.InPredicate; import org.apache.iotdb.db.relational.sql.tree.IsNullPredicate; import org.apache.iotdb.db.relational.sql.tree.LikePredicate; import org.apache.iotdb.db.relational.sql.tree.Literal; import org.apache.iotdb.db.relational.sql.tree.LogicalExpression; -import org.apache.iotdb.db.relational.sql.tree.NotExpression; import org.apache.iotdb.db.relational.sql.tree.NullIfExpression; import org.apache.iotdb.db.relational.sql.tree.SearchedCaseExpression; import org.apache.iotdb.db.relational.sql.tree.SimpleCaseExpression; @@ -109,6 +109,13 @@ public class ExpressionTranslateVisitor extends RewritingVisitor<PlanBuilder> { process(node.getValue(), context), process(node.getValueList(), context)); } + @Override + protected Expression visitInListExpression(InListExpression node, PlanBuilder context) { + List<Expression> newValues = + node.getValues().stream().map(this::process).collect(Collectors.toList()); + return new InListExpression(newValues); + } + @Override protected Expression visitLikePredicate(LikePredicate node, PlanBuilder context) { return new LikePredicate( @@ -119,11 +126,6 @@ public class ExpressionTranslateVisitor extends RewritingVisitor<PlanBuilder> { // ============================ not implemented ======================================= - @Override - protected Expression visitNotExpression(NotExpression node, PlanBuilder context) { - throw new IllegalStateException(String.format(NOT_SUPPORTED, node.getClass().getName())); - } - @Override protected Expression visitSimpleCaseExpression(SimpleCaseExpression node, PlanBuilder context) { throw new IllegalStateException(String.format(NOT_SUPPORTED, node.getClass().getName())); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/GlobalTimePredicateExtractVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/GlobalTimePredicateExtractVisitor.java index 2d0b185f617..1aeb8fd24ba 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/GlobalTimePredicateExtractVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/GlobalTimePredicateExtractVisitor.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner.ir; +import org.apache.iotdb.db.queryengine.plan.expression.UnknownExpressionTypeException; import org.apache.iotdb.db.relational.sql.tree.ArithmeticBinaryExpression; import org.apache.iotdb.db.relational.sql.tree.BetweenPredicate; import org.apache.iotdb.db.relational.sql.tree.ComparisonExpression; @@ -54,6 +55,13 @@ public class GlobalTimePredicateExtractVisitor private static final String NOT_SUPPORTED = "visit() not implemented for %s in GlobalTimePredicateExtract."; + /** + * Extract global time predicate from query predicate. + * + * @param predicate raw query predicate + * @return Pair, left is globalTimePredicate, right is if hasValueFilter. + * @throws UnknownExpressionTypeException unknown expression type + */ public static Pair<Expression, Boolean> extractGlobalTimeFilter(Expression predicate) { return new GlobalTimePredicateExtractVisitor() .process(predicate, new GlobalTimePredicateExtractVisitor.Context(true, true)); @@ -178,21 +186,30 @@ public class GlobalTimePredicateExtractVisitor return new Pair<>(null, true); } - // ============================ not implemented ======================================= - @Override - protected Pair<Expression, Boolean> visitArithmeticBinary( - ArithmeticBinaryExpression node, Context context) { - throw new IllegalStateException(String.format(NOT_SUPPORTED, node.getClass())); + protected Pair<Expression, Boolean> visitInPredicate(InPredicate node, Context context) { + if (isTimeIdentifier(node.getValue())) { + return new Pair<>(node, false); + } + + return new Pair<>(null, true); } @Override - protected Pair<Expression, Boolean> visitInPredicate(InPredicate node, Context context) { - throw new IllegalStateException(String.format(NOT_SUPPORTED, node.getClass())); + protected Pair<Expression, Boolean> visitNotExpression(NotExpression node, Context context) { + Pair<Expression, Boolean> result = + process(node.getValue(), new Context(context.canRewrite, context.isFirstOr)); + if (result.left != null) { + return new Pair<>(new NotExpression(result.left), result.right); + } + return new Pair<>(null, true); } + // ============================ not implemented ======================================= + @Override - protected Pair<Expression, Boolean> visitNotExpression(NotExpression node, Context context) { + protected Pair<Expression, Boolean> visitArithmeticBinary( + ArithmeticBinaryExpression node, Context context) { throw new IllegalStateException(String.format(NOT_SUPPORTED, node.getClass())); }
