This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch lmh/extendFilter
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/lmh/extendFilter by this push:
new f95c8306733 add batch interface
f95c8306733 is described below
commit f95c8306733231dd403deb81a5846c58de0fdd45
Author: Minghui Liu <[email protected]>
AuthorDate: Tue Nov 28 16:53:34 2023 +0800
add batch interface
---
.../read/reader/chunk/MemAlignedPageReader.java | 9 +-
.../tsfile/file/metadata/AlignedChunkMetadata.java | 14 +-
.../file/metadata/AlignedTimeSeriesMetadata.java | 13 +-
...Metadata.java => IAlignedMetadataProvider.java} | 19 +-
.../iotdb/tsfile/file/metadata/IChunkMetadata.java | 3 +-
.../tsfile/file/metadata/TimeseriesMetadata.java | 2 +-
.../iotdb/tsfile/read/filter/basic/Filter.java | 8 +-
.../tsfile/read/filter/basic/ITimeFilter.java | 11 +-
.../tsfile/read/filter/basic/IValueFilter.java | 16 +-
.../tsfile/read/filter/basic/OperatorType.java | 64 ++--
.../tsfile/read/filter/factory/ValueFilter.java | 94 +++---
.../iotdb/tsfile/read/filter/operator/And.java | 11 +-
.../iotdb/tsfile/read/filter/operator/Not.java | 15 +-
.../iotdb/tsfile/read/filter/operator/Or.java | 17 +-
.../read/filter/operator/ValueFilterOperators.java | 352 ++++++++++++---------
.../tsfile/read/reader/page/AlignedPageReader.java | 31 +-
16 files changed, 412 insertions(+), 267 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
index 4f3dd7bd7be..a4cc6ea373b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.db.storageengine.dataregion.read.reader.chunk;
import org.apache.iotdb.tsfile.file.metadata.AlignedChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.common.BatchData;
@@ -41,7 +42,8 @@ import java.util.List;
import static
org.apache.iotdb.tsfile.read.reader.series.PaginationController.UNLIMITED_PAGINATION_CONTROLLER;
-public class MemAlignedPageReader implements IPageReader, IAlignedPageReader {
+public class MemAlignedPageReader
+ implements IPageReader, IAlignedPageReader, IAlignedMetadataProvider {
private final TsBlock tsBlock;
private final AlignedChunkMetadata chunkMetadata;
@@ -252,6 +254,11 @@ public class MemAlignedPageReader implements IPageReader,
IAlignedPageReader {
return chunkMetadata.getTimeStatistics();
}
+ @Override
+ public Statistics<? extends Serializable> getMeasurementStatistics(int
measurementIndex) {
+ return getStatistics(measurementIndex);
+ }
+
private List<Statistics<? extends Serializable>> getValueStatisticsList() {
return chunkMetadata.getValueStatisticsList();
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
index 227475548be..8f116f6bced 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
@@ -29,7 +29,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-public class AlignedChunkMetadata implements IChunkMetadata {
+public class AlignedChunkMetadata implements IChunkMetadata,
IAlignedMetadataProvider {
// ChunkMetadata for time column
private final IChunkMetadata timeChunkMetadata;
@@ -46,13 +46,13 @@ public class AlignedChunkMetadata implements IChunkMetadata
{
}
@Override
- public Statistics<? extends Serializable> getStatistics() {
+ public Statistics<Serializable> getStatistics() {
return valueChunkMetadataList.size() == 1 && valueChunkMetadataList.get(0)
!= null
? valueChunkMetadataList.get(0).getStatistics()
: timeChunkMetadata.getStatistics();
}
- public Statistics<? extends Serializable> getStatistics(int index) {
+ public Statistics<Serializable> getStatistics(int index) {
IChunkMetadata v = valueChunkMetadataList.get(index);
return v == null ? null : v.getStatistics();
}
@@ -65,10 +65,16 @@ public class AlignedChunkMetadata implements IChunkMetadata
{
return valueStatisticsList;
}
- public Statistics<? extends Serializable> getTimeStatistics() {
+ @Override
+ public Statistics<Serializable> getTimeStatistics() {
return timeChunkMetadata.getStatistics();
}
+ @Override
+ public Statistics<Serializable> getMeasurementStatistics(int
measurementIndex) {
+ return getStatistics(measurementIndex);
+ }
+
@Override
public boolean isModified() {
return timeChunkMetadata.isModified();
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
index 79d20588418..c2bc1426c58 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
@@ -22,11 +22,12 @@ package org.apache.iotdb.tsfile.file.metadata;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-public class AlignedTimeSeriesMetadata implements ITimeSeriesMetadata {
+public class AlignedTimeSeriesMetadata implements ITimeSeriesMetadata,
IAlignedMetadataProvider {
// TimeSeriesMetadata for time column
private final TimeseriesMetadata timeseriesMetadata;
@@ -52,7 +53,7 @@ public class AlignedTimeSeriesMetadata implements
ITimeSeriesMetadata {
: timeseriesMetadata.getStatistics();
}
- public Statistics getStatistics(int index) {
+ public Statistics<? extends Serializable> getStatistics(int index) {
TimeseriesMetadata v = valueTimeseriesMetadataList.get(index);
return v == null ? null : v.getStatistics();
}
@@ -65,10 +66,16 @@ public class AlignedTimeSeriesMetadata implements
ITimeSeriesMetadata {
return valueStatisticsList;
}
- public Statistics getTimeStatistics() {
+ @Override
+ public Statistics<? extends Serializable> getTimeStatistics() {
return timeseriesMetadata.getStatistics();
}
+ @Override
+ public Statistics<? extends Serializable> getMeasurementStatistics(int
measurementIndex) {
+ return getStatistics(measurementIndex);
+ }
+
@Override
public boolean isModified() {
return timeseriesMetadata.isModified();
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadata.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadataProvider.java
similarity index 65%
rename from
iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadata.java
rename to
iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadataProvider.java
index 78425a00825..71b32034871 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadata.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadataProvider.java
@@ -20,24 +20,21 @@
package org.apache.iotdb.tsfile.file.metadata;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
-import org.apache.iotdb.tsfile.file.metadata.statistics.TimeStatistics;
import java.io.Serializable;
-public interface IAlignedMetadata {
+public interface IAlignedMetadataProvider {
- TimeStatistics getTimeStatistics();
+ Statistics<? extends Serializable> getTimeStatistics();
- Statistics<Serializable> getMeasurementStatistics(String measurement);
+ Statistics<? extends Serializable> getMeasurementStatistics(int
measurementIndex);
- /** @return whether there are any nulls. */
- default boolean hasNullValue(String measurement) {
- return getMeasurementStatistics(measurement).hasNullValue(getRowCount());
+ default boolean hasNullValue(int measurementIndex) {
+ long rowCount = getTimeStatistics().getCount();
+ return getMeasurementStatistics(measurementIndex).hasNullValue(rowCount);
}
- default long getRowCount() {
- return getTimeStatistics().getCount();
+ default boolean isAllNulls(int measurementIndex) {
+ return false;
}
-
- boolean isAllNulls(String measurement);
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
index 2dbedd1be1b..d84ae7fb745 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
@@ -26,12 +26,11 @@ import org.apache.iotdb.tsfile.read.controller.IChunkLoader;
import java.io.IOException;
import java.io.OutputStream;
-import java.io.Serializable;
import java.util.List;
public interface IChunkMetadata {
- Statistics<? extends Serializable> getStatistics();
+ Statistics getStatistics();
boolean isModified();
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
index b40868d4346..a45ea0525a7 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
@@ -87,7 +87,7 @@ public class TimeseriesMetadata implements
ITimeSeriesMetadata {
int chunkMetaDataListDataSize,
String measurementId,
TSDataType dataType,
- Statistics<? extends Serializable> statistics,
+ Statistics<Serializable> statistics,
PublicBAOS chunkMetadataListBuffer) {
this.timeSeriesMetadataType = timeSeriesMetadataType;
this.chunkMetaDataListDataSize = chunkMetaDataListDataSize;
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
index 890527800ee..6e621043e1e 100755
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
@@ -19,7 +19,7 @@
package org.apache.iotdb.tsfile.read.filter.basic;
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.common.TimeRange;
import org.apache.iotdb.tsfile.read.filter.factory.FilterFactory;
@@ -66,6 +66,8 @@ public interface Filter {
*/
boolean satisfy(long time, Object value);
+ boolean satisfy(long time, Object[] values);
+
/**
* To examine whether there are data points satisfied with the filter.
*
@@ -74,7 +76,7 @@ public interface Filter {
*/
boolean canSkip(Statistics<? extends Serializable> statistics);
- boolean canSkip(IAlignedMetadata alignedMetadata);
+ boolean canSkip(IAlignedMetadataProvider alignedMetadata);
/**
* To examine whether all data points are satisfied with the filter.
@@ -84,7 +86,7 @@ public interface Filter {
*/
boolean allSatisfy(Statistics<? extends Serializable> statistics);
- boolean allSatisfy(IAlignedMetadata alignedMetadata);
+ boolean allSatisfy(IAlignedMetadataProvider alignedMetadata);
/**
* To examine whether the min time and max time are satisfied with the
filter.
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
index 5a387ab3724..e9770e6e0a4 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
@@ -19,18 +19,23 @@
package org.apache.iotdb.tsfile.read.filter.basic;
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import java.io.Serializable;
public interface ITimeFilter extends Filter {
+ default boolean satisfy(long time, Object[] values) {
+ // only use time to filter
+ return satisfy(time, values[0]);
+ }
+
default boolean canSkip(Statistics<? extends Serializable> statistics) {
return !satisfyStartEndTime(statistics.getStartTime(),
statistics.getEndTime());
}
- default boolean canSkip(IAlignedMetadata alignedMetadata) {
+ default boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
return canSkip(alignedMetadata.getTimeStatistics());
}
@@ -38,7 +43,7 @@ public interface ITimeFilter extends Filter {
return containStartEndTime(statistics.getStartTime(),
statistics.getEndTime());
}
- default boolean allSatisfy(IAlignedMetadata alignedMetadata) {
+ default boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
return allSatisfy(alignedMetadata.getTimeStatistics());
}
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
index 3c306149fb9..2e577f323dd 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
@@ -19,21 +19,25 @@
package org.apache.iotdb.tsfile.read.filter.basic;
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.read.common.TimeRange;
import java.util.List;
public interface IValueFilter extends Filter {
- String getMeasurement();
+ int getMeasurementIndex();
- default boolean canSkip(IAlignedMetadata alignedMetadata) {
- return canSkip(alignedMetadata.getMeasurementStatistics(getMeasurement()));
+ default boolean satisfy(long time, Object[] values) {
+ return satisfy(time, values[getMeasurementIndex()]);
}
- default boolean allSatisfy(IAlignedMetadata alignedMetadata) {
- return
allSatisfy(alignedMetadata.getMeasurementStatistics(getMeasurement()));
+ default boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
+ return
canSkip(alignedMetadata.getMeasurementStatistics(getMeasurementIndex()));
+ }
+
+ default boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+ return
allSatisfy(alignedMetadata.getMeasurementStatistics(getMeasurementIndex()));
}
default boolean satisfyStartEndTime(long startTime, long endTime) {
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
index d80117d6fb8..d4f329229e2 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
@@ -21,41 +21,51 @@ package org.apache.iotdb.tsfile.read.filter.basic;
public enum OperatorType {
// comparison
- TIME_EQ,
- VALUE_EQ,
- TIME_NEQ,
- VALUE_NEQ,
- TIME_GT,
- VALUE_GT,
- TIME_GTEQ,
- VALUE_GTEQ,
- TIME_LT,
- VALUE_LT,
- TIME_LTEQ,
- VALUE_LTEQ,
+ TIME_EQ("=="),
+ VALUE_EQ("=="),
+ TIME_NEQ("!="),
+ VALUE_NEQ("!="),
+ TIME_GT(">"),
+ VALUE_GT(">"),
+ TIME_GTEQ(">="),
+ VALUE_GTEQ(">="),
+ TIME_LT("<"),
+ VALUE_LT("<"),
+ TIME_LTEQ("<="),
+ VALUE_LTEQ("<="),
// logical
- NOT,
- AND,
- OR,
+ NOT("NOT"),
+ AND("&&"),
+ OR("||"),
// range
- TIME_BETWEEN_AND,
- VALUE_BETWEEN_AND,
- TIME_NOT_BETWEEN_AND,
- VALUE_NOT_BETWEEN_AND,
+ TIME_BETWEEN_AND("BETWEEN"),
+ VALUE_BETWEEN_AND("BETWEEN"),
+ TIME_NOT_BETWEEN_AND("NOT BETWEEN"),
+ VALUE_NOT_BETWEEN_AND("NOT BETWEEN"),
// set
- TIME_IN,
- VALUE_IN,
- TIME_NOT_IN,
- VALUE_NOT_IN,
+ TIME_IN("IN"),
+ VALUE_IN("IN"),
+ TIME_NOT_IN("NOT IN"),
+ VALUE_NOT_IN("NOT IN"),
// pattern match
- VALUE_REGEXP,
- VALUE_NOT_REGEXP,
+ VALUE_REGEXP("MATCH"),
+ VALUE_NOT_REGEXP("NOT MATCH"),
// group by
- GROUP_BY_TIME,
- GROUP_BY_MONTH;
+ GROUP_BY_TIME("GROUP BY TIME"),
+ GROUP_BY_MONTH("GROUP BY MONTH");
+
+ private final String symbol;
+
+ OperatorType(String symbol) {
+ this.symbol = symbol;
+ }
+
+ public String getSymbol() {
+ return symbol;
+ }
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
index 726159c2cda..f39e7e8c3db 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
@@ -42,127 +42,127 @@ public class ValueFilter {
// forbidden construction
}
- private static final String FAKE_MEASUREMENT = "value";
+ private static final int DEFAULT_MEASUREMENT_INDEX = 0;
public static <T extends Comparable<T>> ValueGt<T> gt(T value) {
- return new ValueGt<>(FAKE_MEASUREMENT, value);
+ return new ValueGt<>(DEFAULT_MEASUREMENT_INDEX, value);
}
- public static <T extends Comparable<T>> ValueGt<T> gt(String measurement, T
value) {
- return new ValueGt<>(measurement, value);
+ public static <T extends Comparable<T>> ValueGt<T> gt(int measurementIndex,
T value) {
+ return new ValueGt<>(measurementIndex, value);
}
public static <T extends Comparable<T>> ValueGtEq<T> gtEq(T value) {
- return new ValueGtEq<>(FAKE_MEASUREMENT, value);
+ return new ValueGtEq<>(DEFAULT_MEASUREMENT_INDEX, value);
}
- public static <T extends Comparable<T>> ValueGtEq<T> gtEq(String
measurement, T value) {
- return new ValueGtEq<>(measurement, value);
+ public static <T extends Comparable<T>> ValueGtEq<T> gtEq(int
measurementIndex, T value) {
+ return new ValueGtEq<>(measurementIndex, value);
}
public static <T extends Comparable<T>> ValueLt<T> lt(T value) {
- return new ValueLt<>(FAKE_MEASUREMENT, value);
+ return new ValueLt<>(DEFAULT_MEASUREMENT_INDEX, value);
}
- public static <T extends Comparable<T>> ValueLt<T> lt(String measurement, T
value) {
- return new ValueLt<>(measurement, value);
+ public static <T extends Comparable<T>> ValueLt<T> lt(int measurementIndex,
T value) {
+ return new ValueLt<>(measurementIndex, value);
}
public static <T extends Comparable<T>> ValueLtEq<T> ltEq(T value) {
- return new ValueLtEq<>(FAKE_MEASUREMENT, value);
+ return new ValueLtEq<>(DEFAULT_MEASUREMENT_INDEX, value);
}
- public static <T extends Comparable<T>> ValueLtEq<T> ltEq(String
measurement, T value) {
- return new ValueLtEq<>(measurement, value);
+ public static <T extends Comparable<T>> ValueLtEq<T> ltEq(int
measurementIndex, T value) {
+ return new ValueLtEq<>(measurementIndex, value);
}
public static <T extends Comparable<T>> ValueEq<T> eq(T value) {
- return new ValueEq<>(FAKE_MEASUREMENT, value);
+ return new ValueEq<>(DEFAULT_MEASUREMENT_INDEX, value);
}
- public static <T extends Comparable<T>> ValueEq<T> eq(String measurement, T
value) {
- return new ValueEq<>(measurement, value);
+ public static <T extends Comparable<T>> ValueEq<T> eq(int measurementIndex,
T value) {
+ return new ValueEq<>(measurementIndex, value);
}
public static <T extends Comparable<T>> ValueNotEq<T> notEq(T value) {
- return new ValueNotEq<>(FAKE_MEASUREMENT, value);
+ return new ValueNotEq<>(DEFAULT_MEASUREMENT_INDEX, value);
}
- public static <T extends Comparable<T>> ValueNotEq<T> notEq(String
measurement, T value) {
- return new ValueNotEq<>(measurement, value);
+ public static <T extends Comparable<T>> ValueNotEq<T> notEq(int
measurementIndex, T value) {
+ return new ValueNotEq<>(measurementIndex, value);
}
public static <T extends Comparable<T>> ValueBetweenAnd<T> between(T value1,
T value2) {
- return new ValueBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
+ return new ValueBetweenAnd<>(DEFAULT_MEASUREMENT_INDEX, value1, value2);
}
public static <T extends Comparable<T>> ValueBetweenAnd<T> between(
- String measurement, T value1, T value2) {
- return new ValueBetweenAnd<>(measurement, value1, value2);
+ int measurementIndex, T value1, T value2) {
+ return new ValueBetweenAnd<>(measurementIndex, value1, value2);
}
public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(T
value1, T value2) {
- return new ValueNotBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
+ return new ValueNotBetweenAnd<>(DEFAULT_MEASUREMENT_INDEX, value1, value2);
}
public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(
- String measurement, T value1, T value2) {
- return new ValueNotBetweenAnd<>(measurement, value1, value2);
+ int measurementIndex, T value1, T value2) {
+ return new ValueNotBetweenAnd<>(measurementIndex, value1, value2);
}
public static ValueRegexp like(String likePattern) {
- return regexp(FAKE_MEASUREMENT,
RegexUtils.parseLikePatternToRegex(likePattern));
+ return regexp(DEFAULT_MEASUREMENT_INDEX,
RegexUtils.parseLikePatternToRegex(likePattern));
}
- public static ValueRegexp like(String measurement, String likePattern) {
- return regexp(measurement,
RegexUtils.parseLikePatternToRegex(likePattern));
+ public static ValueRegexp like(int measurementIndex, String likePattern) {
+ return regexp(measurementIndex,
RegexUtils.parseLikePatternToRegex(likePattern));
}
public static ValueNotRegexp notLike(String likePattern) {
- return notRegexp(FAKE_MEASUREMENT,
RegexUtils.parseLikePatternToRegex(likePattern));
+ return notRegexp(DEFAULT_MEASUREMENT_INDEX,
RegexUtils.parseLikePatternToRegex(likePattern));
}
- public static ValueNotRegexp notLike(String measurement, String likePattern)
{
- return notRegexp(measurement,
RegexUtils.parseLikePatternToRegex(likePattern));
+ public static ValueNotRegexp notLike(int measurementIndex, String
likePattern) {
+ return notRegexp(measurementIndex,
RegexUtils.parseLikePatternToRegex(likePattern));
}
public static ValueRegexp regexp(String regex) {
- return new ValueRegexp(FAKE_MEASUREMENT, RegexUtils.compileRegex(regex));
+ return new ValueRegexp(DEFAULT_MEASUREMENT_INDEX,
RegexUtils.compileRegex(regex));
}
- public static ValueRegexp regexp(String measurement, String regex) {
- return new ValueRegexp(measurement, RegexUtils.compileRegex(regex));
+ public static ValueRegexp regexp(int measurementIndex, String regex) {
+ return new ValueRegexp(measurementIndex, RegexUtils.compileRegex(regex));
}
- public static ValueRegexp regexp(String measurement, Pattern pattern) {
- return new ValueRegexp(measurement, pattern);
+ public static ValueRegexp regexp(int measurementIndex, Pattern pattern) {
+ return new ValueRegexp(measurementIndex, pattern);
}
public static ValueNotRegexp notRegexp(String regex) {
- return new ValueNotRegexp(FAKE_MEASUREMENT,
RegexUtils.compileRegex(regex));
+ return new ValueNotRegexp(DEFAULT_MEASUREMENT_INDEX,
RegexUtils.compileRegex(regex));
}
- public static ValueNotRegexp notRegexp(String measurement, String regex) {
- return new ValueNotRegexp(measurement, RegexUtils.compileRegex(regex));
+ public static ValueNotRegexp notRegexp(int measurementIndex, String regex) {
+ return new ValueNotRegexp(measurementIndex,
RegexUtils.compileRegex(regex));
}
- public static ValueNotRegexp notRegexp(String measurement, Pattern pattern) {
- return new ValueNotRegexp(measurement, pattern);
+ public static ValueNotRegexp notRegexp(int measurementIndex, Pattern
pattern) {
+ return new ValueNotRegexp(measurementIndex, pattern);
}
public static <T extends Comparable<T>> ValueIn<T> in(Set<T> values) {
- return new ValueIn<>(FAKE_MEASUREMENT, values);
+ return new ValueIn<>(DEFAULT_MEASUREMENT_INDEX, values);
}
- public static <T extends Comparable<T>> ValueIn<T> in(String measurement,
Set<T> values) {
- return new ValueIn<>(measurement, values);
+ public static <T extends Comparable<T>> ValueIn<T> in(int measurementIndex,
Set<T> values) {
+ return new ValueIn<>(measurementIndex, values);
}
public static <T extends Comparable<T>> ValueNotIn<T> notIn(Set<T> values) {
- return new ValueNotIn<>(FAKE_MEASUREMENT, values);
+ return new ValueNotIn<>(DEFAULT_MEASUREMENT_INDEX, values);
}
- public static <T extends Comparable<T>> ValueNotIn<T> notIn(String
measurement, Set<T> values) {
- return new ValueNotIn<>(measurement, values);
+ public static <T extends Comparable<T>> ValueNotIn<T> notIn(int
measurementIndex, Set<T> values) {
+ return new ValueNotIn<>(measurementIndex, values);
}
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
index 6a6480c882b..68b702a8c92 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
@@ -19,7 +19,7 @@
package org.apache.iotdb.tsfile.read.filter.operator;
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.common.TimeRange;
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@ -46,6 +46,11 @@ public class And extends BinaryLogicalFilter {
return left.satisfy(time, value) && right.satisfy(time, value);
}
+ @Override
+ public boolean satisfy(long time, Object[] values) {
+ return left.satisfy(time, values) && right.satisfy(time, values);
+ }
+
@Override
public boolean canSkip(Statistics<? extends Serializable> statistics) {
// we can drop a chunk of records if we know that either the left or the
right predicate agrees
@@ -54,7 +59,7 @@ public class And extends BinaryLogicalFilter {
}
@Override
- public boolean canSkip(IAlignedMetadata alignedMetadata) {
+ public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
return left.canSkip(alignedMetadata) || right.canSkip(alignedMetadata);
}
@@ -64,7 +69,7 @@ public class And extends BinaryLogicalFilter {
}
@Override
- public boolean allSatisfy(IAlignedMetadata alignedMetadata) {
+ public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
return left.allSatisfy(alignedMetadata) &&
right.allSatisfy(alignedMetadata);
}
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
index 90ea0a53edf..3d00981bd82 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.tsfile.read.filter.operator;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.common.TimeRange;
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@ -31,7 +32,6 @@ import java.io.Serializable;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import java.util.Objects;
public class Not implements Filter {
@@ -55,14 +55,18 @@ public class Not implements Filter {
return !filter.satisfy(time, value);
}
+ @Override
+ public boolean satisfy(long time, Object[] values) {
+ return !filter.satisfy(time, values);
+ }
+
@Override
public boolean canSkip(Statistics<? extends Serializable> statistics) {
throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
}
@Override
- public boolean canSkip(
- Map<String, Statistics<? extends Serializable>>
measurementToStatisticsMap) {
+ public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
}
@@ -71,6 +75,11 @@ public class Not implements Filter {
throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
}
+ @Override
+ public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+ throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
+ }
+
@Override
public boolean satisfyStartEndTime(long startTime, long endTime) {
throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
index 20d6f9f38e6..26e77d84685 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.tsfile.read.filter.operator;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.common.TimeRange;
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@ -29,7 +30,6 @@ import java.io.Serializable;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class Or extends BinaryLogicalFilter {
@@ -46,6 +46,11 @@ public class Or extends BinaryLogicalFilter {
return left.satisfy(time, value) || right.satisfy(time, value);
}
+ @Override
+ public boolean satisfy(long time, Object[] values) {
+ return left.satisfy(time, values) || right.satisfy(time, values);
+ }
+
@Override
public boolean canSkip(Statistics<? extends Serializable> statistics) {
// we can only drop a chunk of records if we know that both the left and
right predicates agree
@@ -54,9 +59,8 @@ public class Or extends BinaryLogicalFilter {
}
@Override
- public boolean canSkip(
- Map<String, Statistics<? extends Serializable>>
measurementToStatisticsMap) {
- return left.canSkip(measurementToStatisticsMap) &&
right.canSkip(measurementToStatisticsMap);
+ public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
+ return left.canSkip(alignedMetadata) && right.canSkip(alignedMetadata);
}
@Override
@@ -64,6 +68,11 @@ public class Or extends BinaryLogicalFilter {
return left.allSatisfy(statistics) || right.allSatisfy(statistics);
}
+ @Override
+ public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+ return left.allSatisfy(alignedMetadata) ||
right.allSatisfy(alignedMetadata);
+ }
+
@Override
public boolean satisfyStartEndTime(long startTime, long endTime) {
return left.satisfyStartEndTime(startTime, endTime)
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
index e186c9d0988..adde2d6d117 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
@@ -20,7 +20,7 @@
package org.apache.iotdb.tsfile.read.filter.operator;
import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
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;
@@ -52,32 +52,34 @@ public final class ValueFilterOperators {
// forbidden construction
}
- private static final String MEASUREMENT_CANNOT_BE_NULL_MSG = "measurement
cannot be null";
private static final String CONSTANT_CANNOT_BE_NULL_MSG = "constant cannot
be null";
private static final boolean BLOCK_MIGHT_MATCH = false;
private static final boolean BLOCK_CANNOT_MATCH = true;
+ private static final boolean BLOCK_ALL_MATCH = true;
+
+ private static final String OPERATOR_TO_STRING_FORMAT = "measurements[%s] %s
%s";
// base class for ValueEq, ValueNotEq, ValueLt, ValueGt, ValueLtEq, ValueGtEq
abstract static class ValueColumnCompareFilter<T extends Comparable<T>>
extends ColumnCompareFilter<T> implements IValueFilter {
- protected final String measurement;
+ protected final int measurementIndex;
- protected ValueColumnCompareFilter(String measurement, T constant) {
+ protected ValueColumnCompareFilter(int measurementIndex, T constant) {
super(constant);
- this.measurement = Objects.requireNonNull(measurement,
MEASUREMENT_CANNOT_BE_NULL_MSG);
+ this.measurementIndex = measurementIndex;
}
@Override
- public String getMeasurement() {
- return measurement;
+ public int getMeasurementIndex() {
+ return measurementIndex;
}
@Override
public void serialize(DataOutputStream outputStream) throws IOException {
ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
- ReadWriteIOUtils.write(measurement, outputStream);
+ ReadWriteIOUtils.write(measurementIndex, outputStream);
ReadWriteIOUtils.writeObject(constant, outputStream);
}
@@ -89,26 +91,35 @@ public final class ValueFilterOperators {
if (o == null || getClass() != o.getClass()) {
return false;
}
+ if (!super.equals(o)) {
+ return false;
+ }
ValueColumnCompareFilter<?> that = (ValueColumnCompareFilter<?>) o;
- return measurement.equals(that.measurement);
+ return measurementIndex == that.measurementIndex;
}
@Override
public int hashCode() {
- return Objects.hash(measurement);
+ return Objects.hash(super.hashCode(), measurementIndex);
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ OPERATOR_TO_STRING_FORMAT, measurementIndex,
getOperatorType().getSymbol(), constant);
}
}
public static final class ValueEq<T extends Comparable<T>> extends
ValueColumnCompareFilter<T> {
// constant can be null
- public ValueEq(String measurement, T constant) {
- super(measurement, constant);
+ public ValueEq(int measurementIndex, T constant) {
+ super(measurementIndex, constant);
}
@SuppressWarnings("unchecked")
public ValueEq(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
+ this(ReadWriteIOUtils.readInt(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
}
@Override
@@ -123,6 +134,11 @@ public final class ValueFilterOperators {
return BLOCK_MIGHT_MATCH;
}
+ if (constant == null) {
+ // non-aligned page don't have null value
+ return BLOCK_CANNOT_MATCH;
+ }
+
// drop if value < min || value > max
return constant.compareTo((T) statistics.getMinValue()) < 0
|| constant.compareTo((T) statistics.getMaxValue()) > 0;
@@ -130,9 +146,9 @@ public final class ValueFilterOperators {
@Override
@SuppressWarnings("unchecked")
- public boolean canSkip(IAlignedMetadata alignedMetadata) {
+ public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
Statistics<? extends Serializable> statistics =
- alignedMetadata.getMeasurementStatistics(measurement);
+ alignedMetadata.getMeasurementStatistics(measurementIndex);
if (statistics == null) {
// the measurement isn't in this block so all values are null.
@@ -150,7 +166,10 @@ public final class ValueFilterOperators {
if (constant == null) {
// we are looking for records where v eq(null)
// so drop if there are no nulls in this chunk
- return !alignedMetadata.hasNullValue(measurement);
+ if (!alignedMetadata.hasNullValue(measurementIndex)) {
+ return BLOCK_CANNOT_MATCH;
+ }
+ return BLOCK_MIGHT_MATCH;
}
// drop if value < min || value > max
@@ -165,23 +184,53 @@ public final class ValueFilterOperators {
return BLOCK_MIGHT_MATCH;
}
+ if (constant == null) {
+ // non-aligned page don't have null value
+ return BLOCK_MIGHT_MATCH;
+ }
+
return constant.compareTo((T) statistics.getMinValue()) == 0
&& constant.compareTo((T) statistics.getMaxValue()) == 0;
}
@Override
- public Filter reverse() {
- return new ValueNotEq<>(measurement, constant);
+ @SuppressWarnings("unchecked")
+ public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+ Statistics<? extends Serializable> statistics =
+ alignedMetadata.getMeasurementStatistics(measurementIndex);
+
+ if (statistics == null) {
+ // the measurement isn't in this block so all values are null.
+ if (constant == null) {
+ // null is always equal to null
+ return BLOCK_ALL_MATCH;
+ }
+ return BLOCK_MIGHT_MATCH;
+ }
+
+ if (statisticsNotAvailable(statistics)) {
+ return BLOCK_MIGHT_MATCH;
+ }
+
+ if (constant == null) {
+ if (alignedMetadata.isAllNulls(measurementIndex)) {
+ return BLOCK_ALL_MATCH;
+ }
+ return BLOCK_MIGHT_MATCH;
+ }
+
+ return constant.compareTo((T) statistics.getMinValue()) == 0
+ && constant.compareTo((T) statistics.getMaxValue()) == 0;
}
@Override
- public OperatorType getOperatorType() {
- return OperatorType.VALUE_EQ;
+ public Filter reverse() {
+ return new ValueNotEq<>(measurementIndex, constant);
}
@Override
- public String toString() {
- return measurement + " == " + constant;
+ public OperatorType getOperatorType() {
+ return OperatorType.VALUE_EQ;
}
}
@@ -189,13 +238,13 @@ public final class ValueFilterOperators {
extends ValueColumnCompareFilter<T> {
// constant can be null
- public ValueNotEq(String measurement, T constant) {
- super(measurement, constant);
+ public ValueNotEq(int measurementIndex, T constant) {
+ super(measurementIndex, constant);
}
@SuppressWarnings("unchecked")
public ValueNotEq(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
+ this(ReadWriteIOUtils.readInt(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
}
@Override
@@ -210,6 +259,11 @@ public final class ValueFilterOperators {
return BLOCK_MIGHT_MATCH;
}
+ if (constant == null) {
+ // non-aligned page don't have null value
+ return BLOCK_MIGHT_MATCH;
+ }
+
// drop if this is a column where min = max = value
return constant.compareTo((T) statistics.getMinValue()) == 0
&& constant.compareTo((T) statistics.getMaxValue()) == 0;
@@ -217,9 +271,9 @@ public final class ValueFilterOperators {
@Override
@SuppressWarnings("unchecked")
- public boolean canSkip(IAlignedMetadata alignedMetadata) {
+ public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
Statistics<? extends Serializable> statistics =
- alignedMetadata.getMeasurementStatistics(measurement);
+ alignedMetadata.getMeasurementStatistics(measurementIndex);
if (statistics == null) {
if (constant == null) {
@@ -236,7 +290,10 @@ public final class ValueFilterOperators {
if (constant == null) {
// we are looking for records where v notEq(null)
// so, if this is a column of all nulls, we can drop it
- return alignedMetadata.isAllNulls(measurement);
+ if (alignedMetadata.isAllNulls(measurementIndex)) {
+ return BLOCK_CANNOT_MATCH;
+ }
+ return BLOCK_MIGHT_MATCH;
}
// drop if this is a column where min = max = value
@@ -251,36 +308,66 @@ public final class ValueFilterOperators {
return BLOCK_MIGHT_MATCH;
}
+ if (constant == null) {
+ // non-aligned page don't have null value
+ return BLOCK_ALL_MATCH;
+ }
+
return constant.compareTo((T) statistics.getMinValue()) < 0
|| constant.compareTo((T) statistics.getMaxValue()) > 0;
}
@Override
- public Filter reverse() {
- return new ValueEq<>(measurement, constant);
+ @SuppressWarnings("unchecked")
+ public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+ Statistics<? extends Serializable> statistics =
+ alignedMetadata.getMeasurementStatistics(measurementIndex);
+
+ if (statistics == null) {
+ if (constant != null) {
+ return BLOCK_ALL_MATCH;
+ }
+ return BLOCK_MIGHT_MATCH;
+ }
+
+ if (statisticsNotAvailable(statistics)) {
+ return BLOCK_MIGHT_MATCH;
+ }
+
+ if (constant == null) {
+ // we are looking for records where v notEq(null)
+ // so, if this is a column of all nulls, we can drop it
+ if (!alignedMetadata.hasNullValue(measurementIndex)) {
+ return BLOCK_ALL_MATCH;
+ }
+ return BLOCK_MIGHT_MATCH;
+ }
+
+ return constant.compareTo((T) statistics.getMinValue()) < 0
+ || constant.compareTo((T) statistics.getMaxValue()) > 0;
}
@Override
- public OperatorType getOperatorType() {
- return OperatorType.VALUE_NEQ;
+ public Filter reverse() {
+ return new ValueEq<>(measurementIndex, constant);
}
@Override
- public String toString() {
- return measurement + " != " + constant;
+ public OperatorType getOperatorType() {
+ return OperatorType.VALUE_NEQ;
}
}
public static final class ValueLt<T extends Comparable<T>> extends
ValueColumnCompareFilter<T> {
// constant cannot be null
- public ValueLt(String measurement, T constant) {
- super(measurement, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
+ public ValueLt(int measurementIndex, T constant) {
+ super(measurementIndex, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
}
@SuppressWarnings("unchecked")
public ValueLt(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
+ this(ReadWriteIOUtils.readInt(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
}
@Override
@@ -312,30 +399,25 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueGtEq<>(measurement, constant);
+ return new ValueGtEq<>(measurementIndex, constant);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_LT;
}
-
- @Override
- public String toString() {
- return measurement + " < " + constant;
- }
}
public static final class ValueLtEq<T extends Comparable<T>> extends
ValueColumnCompareFilter<T> {
// constant cannot be null
- public ValueLtEq(String measurement, T constant) {
- super(measurement, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
+ public ValueLtEq(int measurementIndex, T constant) {
+ super(measurementIndex, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
}
@SuppressWarnings("unchecked")
public ValueLtEq(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
+ this(ReadWriteIOUtils.readInt(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
}
@Override
@@ -367,30 +449,25 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueGt<>(measurement, constant);
+ return new ValueGt<>(measurementIndex, constant);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_LTEQ;
}
-
- @Override
- public String toString() {
- return measurement + " <= " + constant;
- }
}
public static final class ValueGt<T extends Comparable<T>> extends
ValueColumnCompareFilter<T> {
// constant cannot be null
- public ValueGt(String measurement, T constant) {
- super(measurement, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
+ public ValueGt(int measurementIndex, T constant) {
+ super(measurementIndex, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
}
@SuppressWarnings("unchecked")
public ValueGt(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
+ this(ReadWriteIOUtils.readInt(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
}
@Override
@@ -422,30 +499,25 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueLtEq<>(measurement, constant);
+ return new ValueLtEq<>(measurementIndex, constant);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_GT;
}
-
- @Override
- public String toString() {
- return measurement + " > " + constant;
- }
}
public static final class ValueGtEq<T extends Comparable<T>> extends
ValueColumnCompareFilter<T> {
// constant cannot be null
- public ValueGtEq(String measurement, T constant) {
- super(measurement, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
+ public ValueGtEq(int measurementIndex, T constant) {
+ super(measurementIndex, Objects.requireNonNull(constant,
CONSTANT_CANNOT_BE_NULL_MSG));
}
@SuppressWarnings("unchecked")
public ValueGtEq(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
+ this(ReadWriteIOUtils.readInt(buffer), (T)
ReadWriteIOUtils.readObject(buffer));
}
@Override
@@ -477,40 +549,35 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueLt<>(measurement, constant);
+ return new ValueLt<>(measurementIndex, constant);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_GTEQ;
}
-
- @Override
- public String toString() {
- return measurement + " >= " + constant;
- }
}
// base class for ValueBetweenAnd, ValueNotBetweenAnd
abstract static class ValueColumnRangeFilter<T extends Comparable<T>>
extends ColumnRangeFilter<T>
implements IValueFilter {
- protected final String measurement;
+ protected final int measurementIndex;
- protected ValueColumnRangeFilter(String measurement, T min, T max) {
+ protected ValueColumnRangeFilter(int measurementIndex, T min, T max) {
super(min, max);
- this.measurement = Objects.requireNonNull(measurement,
MEASUREMENT_CANNOT_BE_NULL_MSG);
+ this.measurementIndex = measurementIndex;
}
@Override
- public String getMeasurement() {
- return measurement;
+ public int getMeasurementIndex() {
+ return measurementIndex;
}
@Override
public void serialize(DataOutputStream outputStream) throws IOException {
ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
- ReadWriteIOUtils.write(measurement, outputStream);
+ ReadWriteIOUtils.write(measurementIndex, outputStream);
ReadWriteIOUtils.writeObject(min, outputStream);
ReadWriteIOUtils.writeObject(max, outputStream);
}
@@ -527,26 +594,33 @@ public final class ValueFilterOperators {
return false;
}
ValueColumnRangeFilter<?> that = (ValueColumnRangeFilter<?>) o;
- return measurement.equals(that.measurement);
+ return measurementIndex == that.measurementIndex;
}
@Override
public int hashCode() {
- return Objects.hash(super.hashCode(), measurement);
+ return Objects.hash(super.hashCode(), measurementIndex);
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ "measurements[%s] %s %s AND %s",
+ measurementIndex, getOperatorType().getSymbol(), min, max);
}
}
public static final class ValueBetweenAnd<T extends Comparable<T>>
extends ValueColumnRangeFilter<T> {
- public ValueBetweenAnd(String measurement, T min, T max) {
- super(measurement, min, max);
+ public ValueBetweenAnd(int measurementIndex, T min, T max) {
+ super(measurementIndex, min, max);
}
@SuppressWarnings("unchecked")
public ValueBetweenAnd(ByteBuffer buffer) {
this(
- ReadWriteIOUtils.readString(buffer),
+ ReadWriteIOUtils.readInt(buffer),
(T) ReadWriteIOUtils.readObject(buffer),
(T) ReadWriteIOUtils.readObject(buffer));
}
@@ -581,31 +655,26 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueNotBetweenAnd<>(measurement, min, max);
+ return new ValueNotBetweenAnd<>(measurementIndex, min, max);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_BETWEEN_AND;
}
-
- @Override
- public String toString() {
- return measurement + " between " + min + " and " + max;
- }
}
public static final class ValueNotBetweenAnd<T extends Comparable<T>>
extends ValueColumnRangeFilter<T> {
- public ValueNotBetweenAnd(String measurement, T min, T max) {
- super(measurement, min, max);
+ public ValueNotBetweenAnd(int measurementIndex, T min, T max) {
+ super(measurementIndex, min, max);
}
@SuppressWarnings("unchecked")
public ValueNotBetweenAnd(ByteBuffer buffer) {
this(
- ReadWriteIOUtils.readString(buffer),
+ ReadWriteIOUtils.readInt(buffer),
(T) ReadWriteIOUtils.readObject(buffer),
(T) ReadWriteIOUtils.readObject(buffer));
}
@@ -640,18 +709,13 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueBetweenAnd<>(measurement, min, max);
+ return new ValueBetweenAnd<>(measurementIndex, min, max);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_NOT_BETWEEN_AND;
}
-
- @Override
- public String toString() {
- return measurement + " not between " + min + " and " + max;
- }
}
// we have no statistics available, we cannot drop any blocks
@@ -666,22 +730,22 @@ public final class ValueFilterOperators {
abstract static class ValueColumnSetFilter<T> extends ColumnSetFilter<T>
implements IDisableStatisticsValueFilter {
- protected final String measurement;
+ protected final int measurementIndex;
- protected ValueColumnSetFilter(String measurement, Set<T> candidates) {
+ protected ValueColumnSetFilter(int measurementIndex, Set<T> candidates) {
super(candidates);
- this.measurement = Objects.requireNonNull(measurement,
MEASUREMENT_CANNOT_BE_NULL_MSG);
+ this.measurementIndex = measurementIndex;
}
@Override
- public String getMeasurement() {
- return measurement;
+ public int getMeasurementIndex() {
+ return measurementIndex;
}
@Override
public void serialize(DataOutputStream outputStream) throws IOException {
ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
- ReadWriteIOUtils.write(measurement, outputStream);
+ ReadWriteIOUtils.write(measurementIndex, outputStream);
ReadWriteIOUtils.writeObjectSet(candidates, outputStream);
}
@@ -697,23 +761,29 @@ public final class ValueFilterOperators {
return false;
}
ValueColumnSetFilter<?> that = (ValueColumnSetFilter<?>) o;
- return measurement.equals(that.measurement);
+ return measurementIndex == that.measurementIndex;
}
@Override
public int hashCode() {
- return Objects.hash(super.hashCode(), measurement);
+ return Objects.hash(super.hashCode(), measurementIndex);
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ OPERATOR_TO_STRING_FORMAT, measurementIndex,
getOperatorType().getSymbol(), candidates);
}
}
public static final class ValueIn<T> extends ValueColumnSetFilter<T> {
- public ValueIn(String measurement, Set<T> candidates) {
- super(measurement, candidates);
+ public ValueIn(int measurementIndex, Set<T> candidates) {
+ super(measurementIndex, candidates);
}
public ValueIn(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer),
ReadWriteIOUtils.readObjectSet(buffer));
+ this(ReadWriteIOUtils.readInt(buffer),
ReadWriteIOUtils.readObjectSet(buffer));
}
@Override
@@ -723,28 +793,23 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueNotIn<>(measurement, candidates);
+ return new ValueNotIn<>(measurementIndex, candidates);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_IN;
}
-
- @Override
- public String toString() {
- return measurement + " in " + candidates;
- }
}
public static final class ValueNotIn<T> extends ValueColumnSetFilter<T> {
- public ValueNotIn(String measurement, Set<T> candidates) {
- super(measurement, candidates);
+ public ValueNotIn(int measurementIndex, Set<T> candidates) {
+ super(measurementIndex, candidates);
}
public ValueNotIn(ByteBuffer buffer) {
- this(ReadWriteIOUtils.readString(buffer),
ReadWriteIOUtils.readObjectSet(buffer));
+ this(ReadWriteIOUtils.readInt(buffer),
ReadWriteIOUtils.readObjectSet(buffer));
}
@Override
@@ -754,40 +819,35 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueIn<>(measurement, candidates);
+ return new ValueIn<>(measurementIndex, candidates);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_NOT_IN;
}
-
- @Override
- public String toString() {
- return measurement + " not in " + candidates;
- }
}
// base class for ValueRegex, ValueNotRegex
abstract static class ValueColumnPatternMatchFilter extends
ColumnPatternMatchFilter
implements IDisableStatisticsValueFilter {
- protected final String measurement;
+ protected final int measurementIndex;
- protected ValueColumnPatternMatchFilter(String measurement, Pattern
pattern) {
+ protected ValueColumnPatternMatchFilter(int measurementIndex, Pattern
pattern) {
super(pattern);
- this.measurement = Objects.requireNonNull(measurement,
MEASUREMENT_CANNOT_BE_NULL_MSG);
+ this.measurementIndex = measurementIndex;
}
@Override
- public String getMeasurement() {
- return measurement;
+ public int getMeasurementIndex() {
+ return measurementIndex;
}
@Override
public void serialize(DataOutputStream outputStream) throws IOException {
ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
- ReadWriteIOUtils.write(measurement, outputStream);
+ ReadWriteIOUtils.write(measurementIndex, outputStream);
ReadWriteIOUtils.write(pattern.pattern(), outputStream);
}
@@ -803,24 +863,30 @@ public final class ValueFilterOperators {
return false;
}
ValueColumnPatternMatchFilter that = (ValueColumnPatternMatchFilter) o;
- return measurement.equals(that.measurement);
+ return measurementIndex == that.measurementIndex;
}
@Override
public int hashCode() {
- return Objects.hash(super.hashCode(), measurement);
+ return Objects.hash(super.hashCode(), measurementIndex);
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ OPERATOR_TO_STRING_FORMAT, measurementIndex,
getOperatorType().getSymbol(), pattern);
}
}
public static final class ValueRegexp extends ValueColumnPatternMatchFilter {
- public ValueRegexp(String measurement, Pattern pattern) {
- super(measurement, pattern);
+ public ValueRegexp(int measurementIndex, Pattern pattern) {
+ super(measurementIndex, pattern);
}
public ValueRegexp(ByteBuffer buffer) {
this(
- ReadWriteIOUtils.readString(buffer),
+ ReadWriteIOUtils.readInt(buffer),
RegexUtils.compileRegex(ReadWriteIOUtils.readString(buffer)));
}
@@ -831,29 +897,24 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueNotRegexp(measurement, pattern);
+ return new ValueNotRegexp(measurementIndex, pattern);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_REGEXP;
}
-
- @Override
- public String toString() {
- return measurement + " match " + pattern;
- }
}
public static final class ValueNotRegexp extends
ValueColumnPatternMatchFilter {
- public ValueNotRegexp(String measurement, Pattern pattern) {
- super(measurement, pattern);
+ public ValueNotRegexp(int measurementIndex, Pattern pattern) {
+ super(measurementIndex, pattern);
}
public ValueNotRegexp(ByteBuffer buffer) {
this(
- ReadWriteIOUtils.readString(buffer),
+ ReadWriteIOUtils.readInt(buffer),
RegexUtils.compileRegex(ReadWriteIOUtils.readString(buffer)));
}
@@ -864,18 +925,13 @@ public final class ValueFilterOperators {
@Override
public Filter reverse() {
- return new ValueRegexp(measurement, pattern);
+ return new ValueRegexp(measurementIndex, pattern);
}
@Override
public OperatorType getOperatorType() {
return OperatorType.VALUE_NOT_REGEXP;
}
-
- @Override
- public String toString() {
- return measurement + " not match " + pattern;
- }
}
private static class AccessCount {
diff --git
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
index fc39a2cb07f..98f849d570c 100644
---
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
+++
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.tsfile.read.reader.page;
import org.apache.iotdb.tsfile.encoding.decoder.Decoder;
import org.apache.iotdb.tsfile.file.header.PageHeader;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.common.BatchData;
@@ -45,7 +46,8 @@ import java.util.List;
import static
org.apache.iotdb.tsfile.read.reader.series.PaginationController.UNLIMITED_PAGINATION_CONTROLLER;
-public class AlignedPageReader implements IPageReader, IAlignedPageReader {
+public class AlignedPageReader
+ implements IPageReader, IAlignedPageReader, IAlignedMetadataProvider {
private final TimePageReader timePageReader;
private final List<ValuePageReader> valuePageReaderList;
@@ -368,6 +370,28 @@ public class AlignedPageReader implements IPageReader,
IAlignedPageReader {
}
}
}
+
+ if (filter == null || filter.allSatisfy(getTimeStatistics())) {
+ return builder.build();
+ }
+
+ // filter the block
+ TsBlock unfilteredBlock = builder.build();
+ Object[] values = new Object[valueCount];
+
+ for (int i = 0, size = unfilteredBlock.getPositionCount(); i < size; i++) {
+ long time = unfilteredBlock.getTimeByIndex(i);
+ for (int j = 0; j < valueCount; j++) {
+ values[j] = unfilteredBlock.getValueColumns()[j].getObject(i);
+ }
+
+ if (filter.satisfy(time, values)) {
+ builder.getTimeColumnBuilder().writeLong(time);
+ for (int j = 0; j < valueCount; j++) {
+ builder.getValueColumnBuilders()[j].writeObject(values[j]);
+ }
+ }
+ }
return builder.build();
}
@@ -397,6 +421,11 @@ public class AlignedPageReader implements IPageReader,
IAlignedPageReader {
return timePageReader.getStatistics();
}
+ @Override
+ public Statistics<? extends Serializable> getMeasurementStatistics(int
measurementIndex) {
+ return getStatistics(measurementIndex);
+ }
+
private List<Statistics<? extends Serializable>> getValueStatisticsList() {
List<Statistics<? extends Serializable>> valueStatisticsList = new
ArrayList<>();
for (ValuePageReader v : valuePageReaderList) {