This is an automated email from the ASF dual-hosted git repository. rong pushed a commit to branch in-like-regexp in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d6d66118a62ba1a541a05757cdd7a86d51ef2769 Author: Steve Yurong Su <[email protected]> AuthorDate: Mon May 2 16:52:50 2022 +0800 support not in --- .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 2 +- .../apache/iotdb/db/mpp/sql/parser/ASTVisitor.java | 2 +- .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 2 +- .../db/query/expression/unary/InExpression.java | 10 ++- .../udf/core/transformer/unary/InTransformer.java | 98 ++++++++++++++++++++-- 5 files changed, 101 insertions(+), 13 deletions(-) diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 index 735a2f717d..92125573ae 100644 --- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 +++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 @@ -841,7 +841,7 @@ expression | leftExpression=expression (PLUS | MINUS) rightExpression=expression | leftExpression=expression (OPERATOR_GT | OPERATOR_GTE | OPERATOR_LT | OPERATOR_LTE | OPERATOR_DEQ | OPERATOR_NEQ) rightExpression=expression | unaryBeforeRegularOrLikeExpression=expression (REGEXP | LIKE) STRING_LITERAL - | unaryBeforeInExpression=expression OPERATOR_IN LR_BRACKET constant (COMMA constant)* RR_BRACKET + | unaryBeforeInExpression=expression OPERATOR_NOT? OPERATOR_IN LR_BRACKET constant (COMMA constant)* RR_BRACKET | leftExpression=expression OPERATOR_AND rightExpression=expression | leftExpression=expression OPERATOR_OR rightExpression=expression ; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java index 624871333a..b168d7c600 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java @@ -1858,7 +1858,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { String text = constantContext.getText(); values.add(constantContext.STRING_LITERAL() != null ? parseStringLiteral(text) : text); } - return new InExpression(childExpression, values); + return new InExpression(childExpression, context.OPERATOR_NOT() != null, values); } private Expression parseConstantOperand(ConstantContext constantContext) { diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java index 4b1b73dec2..e58f1f06d0 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java @@ -2694,7 +2694,7 @@ public class IoTDBSqlVisitor extends IoTDBSqlParserBaseVisitor<Operator> { String text = constantContext.getText(); values.add(constantContext.STRING_LITERAL() != null ? parseStringLiteral(text) : text); } - return new InExpression(childExpression, values); + return new InExpression(childExpression, context.OPERATOR_NOT() != null, values); } private Expression parseConstantOperand(ConstantContext constantContext) { diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/InExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/InExpression.java index e78a975677..2d311cba1d 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/InExpression.java +++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/InExpression.java @@ -32,15 +32,18 @@ import java.util.LinkedHashSet; public class InExpression extends UnaryExpression { + private final boolean isNotIn; private final LinkedHashSet<String> values; - public InExpression(Expression expression, LinkedHashSet<String> values) { + public InExpression(Expression expression, boolean isNotIn, LinkedHashSet<String> values) { super(expression); + this.isNotIn = isNotIn; this.values = values; } public InExpression(ByteBuffer byteBuffer) { super(Expression.deserialize(byteBuffer)); + isNotIn = ReadWriteIOUtils.readBool(byteBuffer); final int size = ReadWriteIOUtils.readInt(byteBuffer); values = new LinkedHashSet<>(); for (int i = 0; i < size; ++i) { @@ -68,17 +71,18 @@ public class InExpression extends UnaryExpression { @Override protected Transformer constructTransformer(LayerPointReader pointReader) { - return new InTransformer(pointReader, values); + return new InTransformer(pointReader, isNotIn, values); } @Override protected Expression constructExpression(Expression childExpression) { - return new InExpression(childExpression, values); + return new InExpression(childExpression, isNotIn, values); } @Override protected void serialize(ByteBuffer byteBuffer) { super.serialize(byteBuffer); + ReadWriteIOUtils.write(isNotIn, byteBuffer); ReadWriteIOUtils.write(values.size(), byteBuffer); for (String value : values) { ReadWriteIOUtils.write(value, byteBuffer); diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java index 46d59c0701..74dab92467 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java +++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java @@ -32,6 +32,8 @@ public class InTransformer extends UnaryTransformer { private final TSDataType dataType; + private final Satisfy satisfy; + private Set<Integer> intSet; private Set<Long> longSet; private Set<Float> floatSet; @@ -39,9 +41,10 @@ public class InTransformer extends UnaryTransformer { private Set<Boolean> booleanSet; private Set<String> stringSet; - public InTransformer(LayerPointReader layerPointReader, Set<String> values) { + public InTransformer(LayerPointReader layerPointReader, boolean isNotIn, Set<String> values) { super(layerPointReader); dataType = layerPointReader.getDataType(); + satisfy = isNotIn ? new NotInSatisfy() : new InSatisfy(); initTypedSet(values); } @@ -96,7 +99,7 @@ public class InTransformer extends UnaryTransformer { switch (dataType) { case INT32: int intValue = layerPointReader.currentInt(); - if (intSet.contains(intValue)) { + if (satisfy.of(intValue)) { cachedInt = intValue; } else { currentNull = true; @@ -104,7 +107,7 @@ public class InTransformer extends UnaryTransformer { break; case INT64: long longValue = layerPointReader.currentLong(); - if (longSet.contains(longValue)) { + if (satisfy.of(longValue)) { cachedLong = longValue; } else { currentNull = true; @@ -112,7 +115,7 @@ public class InTransformer extends UnaryTransformer { break; case FLOAT: float floatValue = layerPointReader.currentFloat(); - if (floatSet.contains(floatValue)) { + if (satisfy.of(floatValue)) { cachedFloat = floatValue; } else { currentNull = true; @@ -120,7 +123,7 @@ public class InTransformer extends UnaryTransformer { break; case DOUBLE: double doubleValue = layerPointReader.currentDouble(); - if (doubleSet.contains(doubleValue)) { + if (satisfy.of(doubleValue)) { cachedDouble = doubleValue; } else { currentNull = true; @@ -128,7 +131,7 @@ public class InTransformer extends UnaryTransformer { break; case BOOLEAN: boolean booleanValue = layerPointReader.currentBoolean(); - if (booleanSet.contains(booleanValue)) { + if (satisfy.of(booleanValue)) { cachedBoolean = booleanValue; } else { currentNull = true; @@ -136,7 +139,7 @@ public class InTransformer extends UnaryTransformer { break; case TEXT: Binary binaryValue = layerPointReader.currentBinary(); - if (stringSet.contains(binaryValue.getStringValue())) { + if (satisfy.of(binaryValue.getStringValue())) { cachedBinary = binaryValue; } else { currentNull = true; @@ -146,4 +149,85 @@ public class InTransformer extends UnaryTransformer { throw new QueryProcessException("unsupported data type: " + layerPointReader.getDataType()); } } + + private interface Satisfy { + + boolean of(int intValue); + + boolean of(long longValue); + + boolean of(float floatValue); + + boolean of(double doubleValue); + + boolean of(boolean booleanValue); + + boolean of(String stringValue); + } + + private class InSatisfy implements Satisfy { + + @Override + public boolean of(int intValue) { + return intSet.contains(intValue); + } + + @Override + public boolean of(long longValue) { + return longSet.contains(longValue); + } + + @Override + public boolean of(float floatValue) { + return floatSet.contains(floatValue); + } + + @Override + public boolean of(double doubleValue) { + return doubleSet.contains(doubleValue); + } + + @Override + public boolean of(boolean booleanValue) { + return booleanSet.contains(booleanValue); + } + + @Override + public boolean of(String stringValue) { + return stringSet.contains(stringValue); + } + } + + private class NotInSatisfy implements Satisfy { + + @Override + public boolean of(int intValue) { + return !intSet.contains(intValue); + } + + @Override + public boolean of(long longValue) { + return !longSet.contains(longValue); + } + + @Override + public boolean of(float floatValue) { + return !floatSet.contains(floatValue); + } + + @Override + public boolean of(double doubleValue) { + return !doubleSet.contains(doubleValue); + } + + @Override + public boolean of(boolean booleanValue) { + return !booleanSet.contains(booleanValue); + } + + @Override + public boolean of(String stringValue) { + return !stringSet.contains(stringValue); + } + } }
