You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2021/11/24 07:53:21 UTC

[iotdb] 02/03: p selectinto

This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch xianyi
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 048b4cea7d86990326ee2fc18eae047b0b5e3687
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Wed Nov 24 11:34:59 2021 +0800

    p selectinto
---
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 77 ++++++++++++++++++++++
 1 file changed, 77 insertions(+)

diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index b8a0a6b..9ca4fd0 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -132,6 +132,14 @@ 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;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.expression.IExpression;
+import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
+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.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.query.dataset.QueryDataSet;
 
 import java.io.IOException;
@@ -1011,6 +1019,75 @@ public class TSServiceImpl extends BasicServiceProvider implements TSIService.If
 
     String prefix = statement.split("where")[0] + " where ";
 
+    IExpression iExpression = udtfPlan.getExpression();
+    if (iExpression instanceof GlobalTimeExpression) {
+      GlobalTimeExpression globalTimeExpression = (GlobalTimeExpression) iExpression;
+      if (globalTimeExpression.getFilter() instanceof AndFilter) {
+        AndFilter andFilter = (AndFilter) globalTimeExpression.getFilter();
+
+        if ((andFilter.getLeft() instanceof Lt || andFilter.getLeft() instanceof LtEq)
+            && (andFilter.getRight() instanceof Gt || andFilter.getRight() instanceof GtEq)) {
+          Filter filter = andFilter.getLeft();
+          andFilter.setLeft(andFilter.getRight());
+          andFilter.setRight(filter);
+        }
+
+        final long dayTimeDelta = 24 * 60 * 60 * 1000;
+
+        if (andFilter.getLeft() instanceof Gt && andFilter.getRight() instanceof Lt) {
+          long left = (Long) ((Gt) andFilter.getLeft()).getValue();
+          long right = (Long) ((Lt) andFilter.getRight()).getValue();
+          boolean first = true;
+
+          while (left < right) {
+            if (first) {
+              first = false;
+              statements.add(prefix + " time>" + left + " and time<" + (left + dayTimeDelta));
+            } else {
+              statements.add(prefix + " time>=" + left + " and time<" + (left + dayTimeDelta));
+            }
+            left += dayTimeDelta;
+          }
+        }
+
+        if (andFilter.getLeft() instanceof GtEq && andFilter.getRight() instanceof Lt) {
+          long left = (Long) ((GtEq) andFilter.getLeft()).getValue();
+          long right = (Long) ((Lt) andFilter.getRight()).getValue();
+
+          while (left < right) {
+            statements.add(prefix + " time>=" + left + " and time<" + (left + dayTimeDelta));
+            left += dayTimeDelta;
+          }
+        }
+
+        if (andFilter.getLeft() instanceof Gt && andFilter.getRight() instanceof LtEq) {
+          long left = (Long) ((Gt) andFilter.getLeft()).getValue();
+          long right = (Long) ((LtEq) andFilter.getRight()).getValue();
+
+          while (left <= right) {
+            statements.add(prefix + " time>" + left + " and time<=" + (left + dayTimeDelta));
+            left += dayTimeDelta;
+          }
+        }
+
+        if (andFilter.getLeft() instanceof GtEq && andFilter.getRight() instanceof LtEq) {
+          long left = (Long) ((GtEq) andFilter.getLeft()).getValue();
+          long right = (Long) ((LtEq) andFilter.getRight()).getValue();
+          boolean first = true;
+
+          while (left < right) {
+            if (first) {
+              first = false;
+              statements.add(prefix + " time>=" + left + " and time<=" + (left + dayTimeDelta));
+            } else {
+              statements.add(prefix + " time>" + left + " and time<=" + (left + dayTimeDelta));
+            }
+            left += dayTimeDelta;
+          }
+        }
+      }
+    }
+
     return statements;
   }