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