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);
+    }
+  }
 }