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());
+ }
+ }
}