You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@iotdb.apache.org by GitBox <gi...@apache.org> on 2020/08/26 12:42:08 UTC

[GitHub] [incubator-iotdb] JackieTien97 commented on a change in pull request #1651: [IOTDB-849] Optimize value filter query

JackieTien97 commented on a change in pull request #1651:
URL: https://github.com/apache/incubator-iotdb/pull/1651#discussion_r477269148



##########
File path: server/src/main/java/org/apache/iotdb/db/query/timegenerator/ServerTimeGenerator.java
##########
@@ -65,19 +67,42 @@ public ServerTimeGenerator(IExpression expression, QueryContext context, RawData
   @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

Review comment:
       fix




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org