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 <[email protected]> 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()); + } + } }
