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/07/22 09:48:41 UTC

[iotdb] 02/02: add udf test

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

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

commit dcd9f71468a75524ad562405cbdf879cb095ca65
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Thu Jul 22 17:48:07 2021 +0800

    add udf test
---
 .../selectinto/InsertTabletPlansIterator.java      | 16 ++----
 .../db/qp/logical/crud/SelectIntoOperator.java     |  3 +-
 .../iotdb/db/qp/physical/crud/SelectIntoPlan.java  | 14 ++++-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  1 +
 .../iotdb/db/integration/IoTDBSelectIntoIT.java    | 64 ++++++++++++++++++++++
 5 files changed, 84 insertions(+), 14 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlansIterator.java b/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlansIterator.java
index 8953ca3..da3df9c 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlansIterator.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlansIterator.java
@@ -38,15 +38,17 @@ public class InsertTabletPlansIterator {
   private static final Pattern leveledPathNodePattern = Pattern.compile("\\$\\{\\w+}");
 
   private final QueryDataSet queryDataSet;
+  private final PartialPath fromPath;
   private final List<PartialPath> intoPaths;
   private final int fetchSize;
 
   private InsertTabletPlanGenerator[] insertTabletPlanGenerators;
 
   public InsertTabletPlansIterator(
-      QueryDataSet queryDataSet, List<PartialPath> intoPaths, int fetchSize)
+      QueryDataSet queryDataSet, PartialPath fromPath, List<PartialPath> intoPaths, int fetchSize)
       throws IllegalPathException {
     this.queryDataSet = queryDataSet;
+    this.fromPath = fromPath;
     this.intoPaths = intoPaths;
     this.fetchSize = fetchSize;
 
@@ -61,17 +63,7 @@ public class InsertTabletPlansIterator {
   }
 
   private PartialPath generateActualIntoPath(int index) throws IllegalPathException {
-    String[] nodes = new PartialPath(queryDataSet.getPaths().get(index).getFullPath()).getNodes();
-
-    int indexOfLeftBracket = nodes[0].indexOf("(");
-    if (indexOfLeftBracket != -1) {
-      nodes[0] = nodes[0].substring(indexOfLeftBracket + 1);
-    }
-    int indexOfRightBracket = nodes[nodes.length - 1].indexOf(")");
-    if (indexOfRightBracket != -1) {
-      nodes[nodes.length - 1] = nodes[nodes.length - 1].substring(0, indexOfRightBracket);
-    }
-
+    String[] nodes = fromPath.getNodes();
     StringBuffer sb = new StringBuffer();
     Matcher m = leveledPathNodePattern.matcher(intoPaths.get(index).getFullPath());
     while (m.find()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java
index d130ae6..d9d76a5 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java
@@ -50,7 +50,8 @@ public class SelectIntoOperator extends Operator {
       throw new QueryProcessException(
           "select into: the number of source paths and the number of target paths should be the same.");
     }
-    return new SelectIntoPlan(queryPlan, intoPaths);
+    return new SelectIntoPlan(
+        queryPlan, queryOperator.getFromComponent().getPrefixPaths().get(0), intoPaths);
   }
 
   public void check() throws LogicalOperatorException {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java
index c3a6317..b2c2a06 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java
@@ -33,15 +33,17 @@ import java.util.List;
 public class SelectIntoPlan extends PhysicalPlan {
 
   private QueryPlan queryPlan;
+  private PartialPath fromPath;
   private List<PartialPath> intoPaths;
 
   public SelectIntoPlan() {
     super(false, OperatorType.SELECT_INTO);
   }
 
-  public SelectIntoPlan(QueryPlan queryPlan, List<PartialPath> intoPaths) {
+  public SelectIntoPlan(QueryPlan queryPlan, PartialPath fromPath, List<PartialPath> intoPaths) {
     super(false, OperatorType.SELECT_INTO);
     this.queryPlan = queryPlan;
+    this.fromPath = fromPath;
     this.intoPaths = intoPaths;
   }
 
@@ -56,6 +58,8 @@ public class SelectIntoPlan extends PhysicalPlan {
 
     queryPlan.serialize(outputStream);
 
+    putString(outputStream, fromPath.getFullPath());
+
     outputStream.write(intoPaths.size());
     for (PartialPath intoPath : intoPaths) {
       putString(outputStream, intoPath.getFullPath());
@@ -68,6 +72,8 @@ public class SelectIntoPlan extends PhysicalPlan {
 
     queryPlan.serialize(buffer);
 
+    putString(buffer, fromPath.getFullPath());
+
     buffer.putInt(intoPaths.size());
     for (PartialPath intoPath : intoPaths) {
       putString(buffer, intoPath.getFullPath());
@@ -78,6 +84,8 @@ public class SelectIntoPlan extends PhysicalPlan {
   public void deserialize(ByteBuffer buffer) throws IllegalPathException, IOException {
     queryPlan = (QueryPlan) Factory.create(buffer);
 
+    fromPath = new PartialPath(readString(buffer));
+
     int intoPathsSize = buffer.getInt();
     intoPaths = new ArrayList<>(intoPathsSize);
     for (int i = 0; i < intoPathsSize; ++i) {
@@ -95,6 +103,10 @@ public class SelectIntoPlan extends PhysicalPlan {
     return queryPlan;
   }
 
+  public PartialPath getFromPath() {
+    return fromPath;
+  }
+
   public List<PartialPath> getIntoPaths() {
     return intoPaths;
   }
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 3617ad7..3c575df 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
@@ -1067,6 +1067,7 @@ public class TSServiceImpl implements TSIService.Iface {
       InsertTabletPlansIterator insertTabletPlansIterator =
           new InsertTabletPlansIterator(
               createQueryDataSet(queryId, queryPlan, fetchSize),
+              selectIntoPlan.getFromPath(),
               selectIntoPlan.getIntoPaths(),
               fetchSize);
       while (insertTabletPlansIterator.hasNext()) {
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java
index 1d2fdf0..e5f9401 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java
@@ -405,4 +405,68 @@ public class IoTDBSelectIntoIT {
       assertTrue(throwable.getMessage().contains("desc clauses are not supported."));
     }
   }
+
+  @Test
+  public void selectSameTimeSeries() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+      statement.execute("select s1, s1 into s2, s3 from root.sg.d1");
+
+      ResultSet resultSet = statement.executeQuery("select s2, s3 from root.sg.d1");
+
+      int columnCount = resultSet.getMetaData().getColumnCount();
+      assertEquals(1 + 2, columnCount);
+
+      for (int i = 0; i < INSERTION_SQLS.length; ++i) {
+        assertTrue(resultSet.next());
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int j = 0; j < 2 + 1; ++j) {
+          assertEquals(resultSet.getString(2), resultSet.getString(3));
+          stringBuilder.append(resultSet.getString(j + 1)).append(',');
+        }
+        System.out.println(stringBuilder.toString());
+      }
+
+      assertFalse(resultSet.next());
+      resultSet.close();
+    } catch (SQLException throwable) {
+      fail(throwable.getMessage());
+    }
+  }
+
+  @Test
+  public void testSelectUDF() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+      statement.execute(
+          "select s1, sin(s1), s1 + s1 into ${2}.s2, ${2}.s3, ${2}.s4 from root.sg.d1");
+
+      ResultSet resultSet = statement.executeQuery("select s2, s3, s4 from root.sg.d1.d1");
+
+      int columnCount = resultSet.getMetaData().getColumnCount();
+      assertEquals(1 + 3, columnCount);
+
+      for (int i = 1; i < INSERTION_SQLS.length; ++i) {
+        assertTrue(resultSet.next());
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int j = 0; j < 2 + 1; ++j) {
+          double s2 = Double.parseDouble(resultSet.getString(2));
+          double s3 = Double.parseDouble(resultSet.getString(3));
+          double s4 = Double.parseDouble(resultSet.getString(4));
+          assertEquals(i, s2, 0);
+          assertEquals(Math.sin(i), s3, 0);
+          assertEquals((double) i + (double) i, s4, 0);
+          stringBuilder.append(resultSet.getString(j + 1)).append(',');
+        }
+        System.out.println(stringBuilder.toString());
+      }
+
+      assertFalse(resultSet.next());
+      resultSet.close();
+    } catch (SQLException throwable) {
+      fail(throwable.getMessage());
+    }
+  }
 }