You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/02 08:53:12 UTC
[iotdb] 02/02: support not in
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 <ro...@apache.org>
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);
+ }
+ }
}