You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by er...@apache.org on 2021/12/27 02:08:51 UTC

[iotdb] branch rel/0.12 updated: [IOTDB-2174] Fix Regexp filter serializing and deserializing error (#4609)

This is an automated email from the ASF dual-hosted git repository.

ericpai pushed a commit to branch rel/0.12
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.12 by this push:
     new a7e4616  [IOTDB-2174] Fix Regexp filter serializing and deserializing error (#4609)
a7e4616 is described below

commit a7e46169badb950fef9cfc52d4acef532919d563
Author: BaiJian <er...@hotmail.com>
AuthorDate: Mon Dec 27 10:08:06 2021 +0800

    [IOTDB-2174] Fix Regexp filter serializing and deserializing error (#4609)
---
 .../tsfile/read/filter/factory/FilterFactory.java   |  4 ++++
 .../iotdb/tsfile/read/filter/operator/Regexp.java   | 21 ++++++++++++++++++---
 .../tsfile/read/filter/FilterSerializeTest.java     |  1 +
 3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/FilterFactory.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/FilterFactory.java
index 97f12e2..11d9349 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/FilterFactory.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/FilterFactory.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.tsfile.read.filter.operator.LtEq;
 import org.apache.iotdb.tsfile.read.filter.operator.NotEq;
 import org.apache.iotdb.tsfile.read.filter.operator.NotFilter;
 import org.apache.iotdb.tsfile.read.filter.operator.OrFilter;
+import org.apache.iotdb.tsfile.read.filter.operator.Regexp;
 
 import java.nio.ByteBuffer;
 
@@ -89,6 +90,9 @@ public class FilterFactory {
       case GROUP_BY_MONTH:
         filter = new GroupByMonthFilter();
         break;
+      case REGEXP:
+        filter = new Regexp<>();
+        break;
       default:
         throw new UnsupportedOperationException("Unknown filter type " + id);
     }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java
index 5aa95bb..646b51b 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Objects;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
@@ -43,7 +44,7 @@ public class Regexp<T extends Comparable<T>> implements Filter {
 
   protected Pattern pattern;
 
-  private Regexp() {}
+  public Regexp() {}
 
   public Regexp(String value, FilterType filterType) {
     this.value = value;
@@ -51,7 +52,7 @@ public class Regexp<T extends Comparable<T>> implements Filter {
     try {
       this.pattern = Pattern.compile(this.value);
     } catch (PatternSyntaxException e) {
-      throw new PatternSyntaxException("Regular expression error", value.toString(), e.getIndex());
+      throw new PatternSyntaxException("Regular expression error", value, e.getIndex());
     }
   }
 
@@ -88,7 +89,7 @@ public class Regexp<T extends Comparable<T>> implements Filter {
     try {
       outputStream.write(getSerializeId().ordinal());
       outputStream.write(filterType.ordinal());
-      ReadWriteIOUtils.writeObject(value, outputStream);
+      ReadWriteIOUtils.write(value, outputStream);
     } catch (IOException ex) {
       throw new IllegalArgumentException("Failed to serialize outputStream of type:", ex);
     }
@@ -98,6 +99,13 @@ public class Regexp<T extends Comparable<T>> implements Filter {
   public void deserialize(ByteBuffer buffer) {
     filterType = FilterType.values()[buffer.get()];
     value = ReadWriteIOUtils.readString(buffer);
+    if (value != null) {
+      try {
+        this.pattern = Pattern.compile(value);
+      } catch (PatternSyntaxException e) {
+        throw new PatternSyntaxException("Regular expression error", value, e.getIndex());
+      }
+    }
   }
 
   @Override
@@ -106,6 +114,13 @@ public class Regexp<T extends Comparable<T>> implements Filter {
   }
 
   @Override
+  public boolean equals(Object o) {
+    return o instanceof Regexp
+        && Objects.equals(((Regexp<?>) o).value, value)
+        && ((Regexp<?>) o).filterType == filterType;
+  }
+
+  @Override
   public FilterSerializeId getSerializeId() {
     return FilterSerializeId.REGEXP;
   }
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/FilterSerializeTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/FilterSerializeTest.java
index 2dd8a48..779e32d 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/FilterSerializeTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/FilterSerializeTest.java
@@ -48,6 +48,7 @@ public class FilterSerializeTest {
           ValueFilter.notEq(false),
           ValueFilter.in(new HashSet<>(Arrays.asList("a", "b")), false),
           ValueFilter.in(new HashSet<>(Arrays.asList("c", "d")), true),
+          ValueFilter.regexp("s.*"),
         };
     for (Filter filter : filters) {
       validateSerialization(filter);