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:17 UTC

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

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