You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2019/12/13 09:52:16 UTC

[incubator-iotdb] branch serialize_filters created (now 98bc14f)

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

jiangtian pushed a change to branch serialize_filters
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git.


      at 98bc14f  make Filter serializable

This branch includes the following new commits:

     new 98bc14f  make Filter serializable

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-iotdb] 01/01: make Filter serializable

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch serialize_filters
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 98bc14fa78d520e402bb71ea8af5e5942856cd9d
Author: jt2594838 <jt...@163.com>
AuthorDate: Fri Dec 13 17:51:54 2019 +0800

    make Filter serializable
---
 .../iotdb/db/query/executor/EngineQueryRouter.java |  2 +-
 .../iotdb/tsfile/read/filter/GroupByFilter.java    | 52 +++++++++++----
 .../tsfile/read/filter/basic/BinaryFilter.java     | 28 +++++++-
 .../iotdb/tsfile/read/filter/basic/Filter.java     |  9 +++
 .../tsfile/read/filter/basic/UnaryFilter.java      | 26 +++++++-
 .../tsfile/read/filter/factory/FilterFactory.java  | 52 +++++++++++++++
 .../{FilterFactory.java => FilterSerializeId.java} | 22 +------
 .../tsfile/read/filter/operator/AndFilter.java     |  9 +++
 .../iotdb/tsfile/read/filter/operator/Eq.java      | 23 ++++---
 .../iotdb/tsfile/read/filter/operator/Gt.java      |  9 +++
 .../iotdb/tsfile/read/filter/operator/GtEq.java    | 10 +++
 .../iotdb/tsfile/read/filter/operator/Lt.java      |  9 +++
 .../iotdb/tsfile/read/filter/operator/LtEq.java    | 10 +++
 .../iotdb/tsfile/read/filter/operator/NotEq.java   |  9 +++
 .../tsfile/read/filter/operator/NotFilter.java     | 27 ++++++++
 .../tsfile/read/filter/operator/OrFilter.java      |  8 +++
 .../iotdb/tsfile/utils/ReadWriteIOUtils.java       | 76 ++++++++++++++++++++++
 .../tsfile/read/filter/GroupByFilterTest.java      |  2 +-
 18 files changed, 339 insertions(+), 44 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java b/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
index 267f915..fd2dcc7 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
@@ -111,7 +111,7 @@ public class EngineQueryRouter implements IEngineQueryRouter {
 
     long nextJobId = context.getJobId();
 
-    GlobalTimeExpression timeExpression = new GlobalTimeExpression(new GroupByFilter(unit, slidingStep, startTime, endTime, FilterType.GROUP_BY_FILTER));
+    GlobalTimeExpression timeExpression = new GlobalTimeExpression(new GroupByFilter(unit, slidingStep, startTime, endTime));
 
     if (expression == null) {
       expression = timeExpression;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java
index 75c8c66..4e5963c 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java
@@ -18,27 +18,31 @@
  */
 package org.apache.iotdb.tsfile.read.filter;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.nio.ByteBuffer;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
-import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
-
-import java.io.Serializable;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 
 public class GroupByFilter implements Filter, Serializable {
 
   private static final long serialVersionUID = -1211805021419281440L;
-  private final long unit;
-  private final long slidingStep;
-  private final long startTime;
-  private final long endTime;
-  private final FilterType filterType;
+  private long unit;
+  private long slidingStep;
+  private long startTime;
+  private long endTime;
 
-  public GroupByFilter(long unit, long slidingStep, long startTime, long endTime, FilterType filterType) {
+  public GroupByFilter(long unit, long slidingStep, long startTime, long endTime) {
     this.unit = unit;
     this.slidingStep = slidingStep;
     this.startTime = startTime;
     this.endTime = endTime;
-    this.filterType = filterType;
+  }
+
+  public GroupByFilter() {
+
   }
 
   @Override
@@ -91,11 +95,37 @@ public class GroupByFilter implements Filter, Serializable {
 
   @Override
   public Filter clone() {
-    return new GroupByFilter(unit, slidingStep, startTime, endTime, filterType);
+    return new GroupByFilter(unit, slidingStep, startTime, endTime);
   }
 
   @Override
   public String toString() {
     return "GroupByFilter{}";
   }
+
+  @Override
+  public void serialize(DataOutputStream outputStream) {
+    try {
+      outputStream.write(getSerializeId().ordinal());
+      outputStream.writeLong(unit);
+      outputStream.writeLong(slidingStep);
+      outputStream.writeLong(startTime);
+      outputStream.writeLong(endTime);
+    } catch (IOException ignored) {
+      // ignored
+    }
+  }
+
+  @Override
+  public void deserialize(ByteBuffer buffer) {
+    unit = buffer.getLong();
+    slidingStep = buffer.getLong();
+    startTime = buffer.getLong();
+    endTime = buffer.getLong();
+  }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.GROUP_BY;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/BinaryFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/BinaryFilter.java
index af18f85..9891537 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/BinaryFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/BinaryFilter.java
@@ -18,7 +18,11 @@
  */
 package org.apache.iotdb.tsfile.read.filter.basic;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
 import java.io.Serializable;
+import java.nio.ByteBuffer;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterFactory;
 
 /**
  * Definition for binary filter operations.
@@ -27,8 +31,11 @@ public abstract class BinaryFilter implements Filter, Serializable {
 
   private static final long serialVersionUID = 1039585564327602465L;
 
-  protected final Filter left;
-  protected final Filter right;
+  protected Filter left;
+  protected Filter right;
+
+  public BinaryFilter() {
+  }
 
   protected BinaryFilter(Filter left, Filter right) {
     this.left = left;
@@ -50,4 +57,21 @@ public abstract class BinaryFilter implements Filter, Serializable {
 
   @Override
   public abstract Filter clone();
+
+  @Override
+  public void serialize(DataOutputStream outputStream) {
+    try {
+      outputStream.write(getSerializeId().ordinal());
+      left.serialize(outputStream);
+      right.serialize(outputStream);
+    } catch (IOException ignored) {
+      // ignore
+    }
+  }
+
+  @Override
+  public void deserialize(ByteBuffer buffer) {
+    left = FilterFactory.deserialize(buffer);
+    right = FilterFactory.deserialize(buffer);
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
index ce2ccc5..cfc7478 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
@@ -18,7 +18,10 @@
  */
 package org.apache.iotdb.tsfile.read.filter.basic;
 
+import java.io.DataOutputStream;
+import java.nio.ByteBuffer;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 
 /**
  * Filter is a top level filter abstraction.
@@ -63,4 +66,10 @@ public interface Filter {
   boolean containStartEndTime(long startTime, long endTime);
 
   Filter clone();
+
+  void serialize(DataOutputStream outputStream);
+
+  void deserialize(ByteBuffer buffer);
+
+  FilterSerializeId getSerializeId();
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/UnaryFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/UnaryFilter.java
index 16f1687..3ce3103 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/UnaryFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/UnaryFilter.java
@@ -18,8 +18,12 @@
  */
 package org.apache.iotdb.tsfile.read.filter.basic;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
 import java.io.Serializable;
+import java.nio.ByteBuffer;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 /**
  * Definition for unary filter operations.
@@ -29,10 +33,13 @@ import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
 public abstract class UnaryFilter<T extends Comparable<T>> implements Filter, Serializable {
 
   private static final long serialVersionUID = 1431606024929453556L;
-  protected final T value;
+  protected T value;
 
   protected FilterType filterType;
 
+  public UnaryFilter() {
+  }
+
   protected UnaryFilter(T value, FilterType filterType) {
     this.value = value;
     this.filterType = filterType;
@@ -51,4 +58,21 @@ public abstract class UnaryFilter<T extends Comparable<T>> implements Filter, Se
 
   @Override
   public abstract Filter clone();
+
+  @Override
+  public void serialize(DataOutputStream outputStream) {
+    try {
+      outputStream.write(getSerializeId().ordinal());
+      outputStream.write(filterType.ordinal());
+      ReadWriteIOUtils.writeObject(value, outputStream);
+    } catch (IOException ignored) {
+      // ignored
+    }
+  }
+
+  @Override
+  public void deserialize(ByteBuffer buffer) {
+    filterType = FilterType.values()[buffer.get()];
+    value = (T) ReadWriteIOUtils.readObject(buffer);
+  }
 }
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 d423e45..7781e42 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
@@ -18,10 +18,20 @@
  */
 package org.apache.iotdb.tsfile.read.filter.factory;
 
+import java.nio.ByteBuffer;
+import org.apache.iotdb.tsfile.read.filter.GroupByFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.operator.AndFilter;
+import org.apache.iotdb.tsfile.read.filter.operator.Eq;
+import org.apache.iotdb.tsfile.read.filter.operator.Gt;
+import org.apache.iotdb.tsfile.read.filter.operator.GtEq;
+import org.apache.iotdb.tsfile.read.filter.operator.Lt;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class FilterFactory {
 
@@ -37,4 +47,46 @@ public class FilterFactory {
     return new NotFilter(filter);
   }
 
+  public static Filter deserialize(ByteBuffer buffer) {
+    FilterSerializeId id = FilterSerializeId.values()[buffer.get()];
+
+    Filter filter;
+    switch (id) {
+      case EQ:
+        filter = new Eq<>();
+        break;
+      case GT:
+        filter = new Gt<>();
+        break;
+      case LT:
+        filter = new Lt<>();
+        break;
+      case OR:
+        filter = new OrFilter();
+        break;
+      case AND:
+        filter = new AndFilter();
+        break;
+      case NEQ:
+        filter = new NotEq<>();
+        break;
+      case NOT:
+        filter = new NotFilter();
+        break;
+      case GTEQ:
+        filter = new GtEq<>();
+        break;
+      case LTEQ:
+        filter = new LtEq<>();
+        break;
+      case GROUP_BY:
+        filter = new GroupByFilter();
+        break;
+      default:
+        throw new UnsupportedOperationException("Unknown filter type " + id);
+    }
+    filter.deserialize(buffer);
+    return filter;
+  }
+
 }
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/FilterSerializeId.java
similarity index 60%
copy from tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/FilterFactory.java
copy to tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/FilterSerializeId.java
index d423e45..1b20251 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/FilterSerializeId.java
@@ -16,25 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.tsfile.read.filter.factory;
-
-import org.apache.iotdb.tsfile.read.filter.basic.Filter;
-import org.apache.iotdb.tsfile.read.filter.operator.AndFilter;
-import org.apache.iotdb.tsfile.read.filter.operator.NotFilter;
-import org.apache.iotdb.tsfile.read.filter.operator.OrFilter;
-
-public class FilterFactory {
 
-  public static AndFilter and(Filter left, Filter right) {
-    return new AndFilter(left, right);
-  }
-
-  public static OrFilter or(Filter left, Filter right) {
-    return new OrFilter(left, right);
-  }
-
-  public static NotFilter not(Filter filter) {
-    return new NotFilter(filter);
-  }
+package org.apache.iotdb.tsfile.read.filter.factory;
 
+public enum FilterSerializeId {
+  AND, EQ, GROUP_BY, GT, GTEQ, LT, LTEQ, NEQ, NOT, OR
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
index 4ba5778..1b3c021 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.tsfile.read.filter.operator;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.BinaryFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 
 /**
  * Both the left and right operators of AndExpression must satisfy the condition.
@@ -29,6 +30,9 @@ public class AndFilter extends BinaryFilter {
 
   private static final long serialVersionUID = -8212850098906044102L;
 
+  public AndFilter() {
+  }
+
   public AndFilter(Filter left, Filter right) {
     super(left, right);
   }
@@ -64,4 +68,9 @@ public class AndFilter extends BinaryFilter {
   public Filter clone() {
     return new AndFilter(left.clone(), right.clone());
   }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.AND;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java
index 48b6415..c2edf08 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java
@@ -18,11 +18,16 @@
  */
 package org.apache.iotdb.tsfile.read.filter.operator;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 /**
  * Equals.
@@ -33,6 +38,9 @@ public class Eq<T extends Comparable<T>> extends UnaryFilter<T> {
 
   private static final long serialVersionUID = -6668083116644568248L;
 
+  public Eq() {
+  }
+
   public Eq(T value, FilterType filterType) {
     super(value, filterType);
   }
@@ -60,10 +68,7 @@ public class Eq<T extends Comparable<T>> extends UnaryFilter<T> {
   public boolean satisfyStartEndTime(long startTime, long endTime) {
     if (filterType == FilterType.TIME_FILTER) {
       long time = (Long) value;
-      if (time > endTime || time < startTime) {
-        return false;
-      }
-      return true;
+      return time <= endTime && time >= startTime;
     } else {
       return true;
     }
@@ -73,11 +78,7 @@ public class Eq<T extends Comparable<T>> extends UnaryFilter<T> {
   public boolean containStartEndTime(long startTime, long endTime) {
     if (filterType == FilterType.TIME_FILTER) {
       long time = (Long) value;
-      if (time == startTime && time == endTime) {
-        return true;
-      } else {
-        return false;
-      }
+      return time == startTime && time == endTime;
     } else {
       return true;
     }
@@ -93,4 +94,8 @@ public class Eq<T extends Comparable<T>> extends UnaryFilter<T> {
     return getFilterType() + " == " + value;
   }
 
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.EQ;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java
index a48f0d5..9034956 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
 
 /**
@@ -33,6 +34,9 @@ public class Gt<T extends Comparable<T>> extends UnaryFilter<T> {
 
   private static final long serialVersionUID = -2088181659871608986L;
 
+  public Gt() {
+  }
+
   public Gt(T value, FilterType filterType) {
     super(value, filterType);
   }
@@ -91,4 +95,9 @@ public class Gt<T extends Comparable<T>> extends UnaryFilter<T> {
   public String toString() {
     return getFilterType() + " > " + value;
   }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.GT;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java
index 8391225..47ead82 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
 
 /**
@@ -37,6 +38,10 @@ public class GtEq<T extends Comparable<T>> extends UnaryFilter<T> {
     super(value, filterType);
   }
 
+  public GtEq() {
+
+  }
+
   @Override
   public boolean satisfy(Statistics statistics) {
     if (filterType == FilterType.TIME_FILTER) {
@@ -91,4 +96,9 @@ public class GtEq<T extends Comparable<T>> extends UnaryFilter<T> {
   public String toString() {
     return getFilterType() + " >= " + value;
   }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.GTEQ;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java
index 7d92a78..ff6ab89 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
 
 /**
@@ -33,6 +34,9 @@ public class Lt<T extends Comparable<T>> extends UnaryFilter<T> {
 
   private static final long serialVersionUID = -2088181659871608986L;
 
+  public Lt() {
+  }
+
   public Lt(T value, FilterType filterType) {
     super(value, filterType);
   }
@@ -91,4 +95,9 @@ public class Lt<T extends Comparable<T>> extends UnaryFilter<T> {
   public String toString() {
     return getFilterType() + " < " + value;
   }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.LT;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java
index f25db22..ca37348 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
 
 /**
@@ -37,6 +38,10 @@ public class LtEq<T extends Comparable<T>> extends UnaryFilter<T> {
     super(value, filterType);
   }
 
+  public LtEq() {
+
+  }
+
   @Override
   public boolean satisfy(Statistics statistics) {
     if (filterType == FilterType.TIME_FILTER) {
@@ -91,4 +96,9 @@ public class LtEq<T extends Comparable<T>> extends UnaryFilter<T> {
   public String toString() {
     return getFilterType() + " <= " + value;
   }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.LTEQ;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java
index f570f86..c58e788 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
 
 /**
@@ -33,6 +34,9 @@ public class NotEq<T extends Comparable<T>> extends UnaryFilter<T> {
 
   private static final long serialVersionUID = 2574090797476500965L;
 
+  public NotEq() {
+  }
+
   public NotEq(T value, FilterType filterType) {
     super(value, filterType);
   }
@@ -92,4 +96,9 @@ public class NotEq<T extends Comparable<T>> extends UnaryFilter<T> {
   public String toString() {
     return getFilterType() + " != " + value;
   }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.NEQ;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java
index 58baa11..851add1 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java
@@ -18,9 +18,14 @@
  */
 package org.apache.iotdb.tsfile.read.filter.operator;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
 import java.io.Serializable;
+import java.nio.ByteBuffer;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterFactory;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 
 /**
  * NotFilter necessary. Use InvertExpressionVisitor
@@ -30,6 +35,9 @@ public class NotFilter implements Filter, Serializable {
   private static final long serialVersionUID = 584860326604020881L;
   private Filter that;
 
+  public NotFilter() {
+  }
+
   public NotFilter(Filter that) {
     this.that = that;
   }
@@ -72,4 +80,23 @@ public class NotFilter implements Filter, Serializable {
     return "NotFilter: " + that;
   }
 
+  @Override
+  public void serialize(DataOutputStream outputStream) {
+    try {
+      outputStream.write(getSerializeId().ordinal());
+      that.serialize(outputStream);
+    } catch (IOException ignored) {
+      // ignored
+    }
+  }
+
+  @Override
+  public void deserialize(ByteBuffer buffer) {
+    that = FilterFactory.deserialize(buffer);
+  }
+
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.NOT;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java
index 5797074..e82bbb1 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.BinaryFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
+import org.apache.iotdb.tsfile.read.filter.factory.FilterSerializeId;
 
 /**
  * Either of the left and right operators of AndExpression must satisfy the condition.
@@ -30,6 +31,9 @@ public class OrFilter extends BinaryFilter implements Serializable {
 
   private static final long serialVersionUID = -968055896528472694L;
 
+  public OrFilter() {
+  }
+
   public OrFilter(Filter left, Filter right) {
     super(left, right);
   }
@@ -66,4 +70,8 @@ public class OrFilter extends BinaryFilter implements Serializable {
         .containStartEndTime(startTime, endTime);
   }
 
+  @Override
+  public FilterSerializeId getSerializeId() {
+    return FilterSerializeId.OR;
+  }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
index 1d7bb5d..8b38fb8 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
@@ -19,6 +19,15 @@
 
 package org.apache.iotdb.tsfile.utils;
 
+import static org.apache.iotdb.tsfile.utils.ReadWriteIOUtils.ClassSerializeId.BINARY;
+import static org.apache.iotdb.tsfile.utils.ReadWriteIOUtils.ClassSerializeId.BOOLEAN;
+import static org.apache.iotdb.tsfile.utils.ReadWriteIOUtils.ClassSerializeId.DOUBLE;
+import static org.apache.iotdb.tsfile.utils.ReadWriteIOUtils.ClassSerializeId.FLOAT;
+import static org.apache.iotdb.tsfile.utils.ReadWriteIOUtils.ClassSerializeId.INTEGER;
+import static org.apache.iotdb.tsfile.utils.ReadWriteIOUtils.ClassSerializeId.LONG;
+import static org.apache.iotdb.tsfile.utils.ReadWriteIOUtils.ClassSerializeId.STRING;
+
+import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -28,6 +37,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
+import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -768,4 +778,70 @@ public class ReadWriteIOUtils {
   public static boolean checkIfMagicString(InputStream inputStream) throws IOException {
     return inputStream.available() <= magicStringBytes.length;
   }
+
+  enum ClassSerializeId {
+    LONG, DOUBLE, INTEGER, FLOAT, BINARY, BOOLEAN, STRING
+  }
+
+  public static void writeObject(Object value, DataOutputStream outputStream) {
+      try {
+        if (value instanceof Long) {
+          outputStream.write(LONG.ordinal());
+          outputStream.writeLong((Long) value);
+        } else if (value instanceof Double) {
+          outputStream.write(DOUBLE.ordinal());
+          outputStream.writeDouble((Double) value);
+        } else if (value instanceof Integer) {
+          outputStream.write(INTEGER.ordinal());
+          outputStream.writeInt((Integer) value);
+        } else if (value instanceof Float) {
+          outputStream.write(FLOAT.ordinal());
+          outputStream.writeFloat((Float) value);
+        } else if (value instanceof Binary) {
+          outputStream.write(BINARY.ordinal());
+          byte[] bytes = ((Binary) value).getValues();
+          outputStream.writeInt(bytes.length);
+          outputStream.write(bytes);
+        } else if (value instanceof Boolean) {
+          outputStream.write(BOOLEAN.ordinal());
+          outputStream.write(((Boolean) value) ? 1 : 0);
+        } else {
+          outputStream.write(STRING.ordinal());
+          byte[] bytes = value.toString().getBytes();
+          outputStream.writeInt(bytes.length);
+          outputStream.write(bytes);
+        }
+      } catch (IOException ignored) {
+        // ignored
+      }
+  }
+
+  public static Object readObject(ByteBuffer buffer) {
+    ClassSerializeId serializeId = ClassSerializeId.values()[buffer.get()];
+    switch (serializeId) {
+      case BOOLEAN:
+        return buffer.get() == 1;
+      case FLOAT:
+        return buffer.getFloat();
+      case DOUBLE:
+        return buffer.getDouble();
+      case LONG:
+        return buffer.getLong();
+      case INTEGER:
+        return buffer.getInt();
+      case BINARY:
+        int length = buffer.getInt();
+        byte[] bytes = new byte[length];
+        buffer.get(bytes);
+        return new Binary(bytes);
+      case STRING:
+      default:
+        length = buffer.getInt();
+        bytes = new byte[length];
+        buffer.get(bytes);
+        return new String(bytes);
+    }
+  }
+
+
 }
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/GroupByFilterTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/GroupByFilterTest.java
index 633c1e6..8582b5f 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/GroupByFilterTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/filter/GroupByFilterTest.java
@@ -34,7 +34,7 @@ public class GroupByFilterTest {
   @Before
   public void setUp() throws Exception {
     groupByFilter = new GroupByFilter(3, 24,
-            8, 8 + 30 * 24 + 3 + 6, FilterType.GROUP_BY_FILTER);
+            8, 8 + 30 * 24 + 3 + 6);
   }
 
   @Test