This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new ec9ef4f [IOTDB-849] Optimize value filter query (#1651)
ec9ef4f is described below
commit ec9ef4f586c2d3192e5c15abc996276ff90a0f46
Author: Jackie Tien <[email protected]>
AuthorDate: Sat Aug 29 10:44:13 2020 +0800
[IOTDB-849] Optimize value filter query (#1651)
* optimize the value filter query process
---
.../query/timegenerator/ServerTimeGenerator.java | 40 ++++++++++++++++++----
1 file changed, 33 insertions(+), 7 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
b/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
index ee1cf91..138689d 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
@@ -18,6 +18,7 @@
*/
package org.apache.iotdb.db.query.timegenerator;
+import java.io.IOException;
import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.qp.physical.crud.RawDataQueryPlan;
@@ -30,11 +31,12 @@ import org.apache.iotdb.tsfile.read.common.Path;
import org.apache.iotdb.tsfile.read.expression.IExpression;
import org.apache.iotdb.tsfile.read.expression.impl.SingleSeriesExpression;
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.FilterType;
+import org.apache.iotdb.tsfile.read.filter.operator.AndFilter;
import org.apache.iotdb.tsfile.read.query.timegenerator.TimeGenerator;
import org.apache.iotdb.tsfile.read.reader.IBatchReader;
-import java.io.IOException;
-
/**
* A timestamp generator for query with filter. e.g. For query clause "select
s1, s2 from root where
* s3 < 0 and time > 100", this class can iterate back to every timestamp of
the query.
@@ -65,19 +67,43 @@ public class ServerTimeGenerator extends TimeGenerator {
@Override
protected IBatchReader generateNewBatchReader(SingleSeriesExpression
expression)
throws IOException {
- Filter filter = expression.getFilter();
+ Filter valueFilter = expression.getFilter();
Path path = expression.getSeriesPath();
TSDataType dataType;
QueryDataSource queryDataSource;
try {
dataType = IoTDB.metaManager.getSeriesType(path.getFullPath());
- queryDataSource =
QueryResourceManager.getInstance().getQueryDataSource(path, context, filter);
- // update filter by TTL
- filter = queryDataSource.updateFilterUsingTTL(filter);
+ queryDataSource =
QueryResourceManager.getInstance().getQueryDataSource(path, context,
valueFilter);
+ // update valueFilter by TTL
+ valueFilter = queryDataSource.updateFilterUsingTTL(valueFilter);
} catch (Exception e) {
throw new IOException(e);
}
- return new SeriesRawDataBatchReader(path,
queryPlan.getAllMeasurementsInDevice(path.getDevice()), dataType, context,
queryDataSource, null, filter, null);
+ // get the TimeFilter part in SingleSeriesExpression
+ Filter timeFilter = getTimeFilter(valueFilter);
+
+ return new SeriesRawDataBatchReader(path,
queryPlan.getAllMeasurementsInDevice(path.getDevice()), dataType, context,
queryDataSource, timeFilter, valueFilter, null);
+ }
+
+ /**
+ * extract time filter from a value filter
+ */
+ private Filter getTimeFilter(Filter filter) {
+ if (filter instanceof UnaryFilter && ((UnaryFilter)
filter).getFilterType() == FilterType.TIME_FILTER) {
+ return filter;
+ }
+ if (filter instanceof AndFilter) {
+ Filter leftTimeFilter = getTimeFilter(((AndFilter) filter).getLeft());
+ Filter rightTimeFilter = getTimeFilter(((AndFilter) filter).getRight());
+ if (leftTimeFilter != null && rightTimeFilter != null) {
+ return filter;
+ } else if (leftTimeFilter != null) {
+ return leftTimeFilter;
+ } else {
+ return rightTimeFilter;
+ }
+ }
+ return null;
}
}