This is an automated email from the ASF dual-hosted git repository.
rong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 9762677 [IOTDB-1986] Support `select UDF as alisa` clauses (#4354)
9762677 is described below
commit 97626770d2b277fbb27c6f08bd275586d9aff9db
Author: Xieqijun <[email protected]>
AuthorDate: Thu Nov 11 13:18:52 2021 +0800
[IOTDB-1986] Support `select UDF as alisa` clauses (#4354)
---
.../apache/iotdb/db/qp/physical/crud/UDTFPlan.java | 9 +++-
.../query/expression/unary/TimeSeriesOperand.java | 2 +-
.../apache/iotdb/db/integration/IoTDBAliasIT.java | 49 +++++++++++++++++++++-
3 files changed, 56 insertions(+), 4 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java
index 375e1b2..5bfb763 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/UDTFPlan.java
@@ -48,6 +48,8 @@ public class UDTFPlan extends RawDataQueryPlan implements
UDFPlan {
protected Map<Integer, Integer> datasetOutputIndexToResultColumnIndex = new
HashMap<>();
protected Map<String, Integer> pathNameToReaderIndex = new HashMap<>();
+ private final Map<PartialPath, Integer> resultColumnNameToQueryDataSetIndex
= new HashMap<>();
+
public UDTFPlan(ZoneId zoneId) {
super();
this.zoneId = zoneId;
@@ -61,6 +63,7 @@ public class UDTFPlan extends RawDataQueryPlan implements
UDFPlan {
for (int i = 0; i < resultColumns.size(); i++) {
for (PartialPath path : resultColumns.get(i).collectPaths()) {
indexedPaths.add(new Pair<>(path, i));
+ resultColumnNameToQueryDataSetIndex.put(path, i);
}
}
indexedPaths.sort(Comparator.comparing(pair -> pair.left));
@@ -134,7 +137,9 @@ public class UDTFPlan extends RawDataQueryPlan implements
UDFPlan {
return
expressionName2Executor.get(functionExpression.getExpressionString());
}
- public int getReaderIndex(String pathName) {
- return pathNameToReaderIndex.get(pathName);
+ public int getReaderIndex(PartialPath partialPath) {
+ return pathNameToReaderIndex.get(
+ getColumnForReaderFromPath(
+ partialPath,
resultColumnNameToQueryDataSetIndex.get(partialPath)));
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
index eb5dd59..0e287cc 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
@@ -104,7 +104,7 @@ public class TimeSeriesOperand extends Expression {
float memoryBudgetInMB = memoryAssigner.assign();
LayerPointReader parentLayerPointReader =
-
rawTimeSeriesInputLayer.constructPointReader(udtfPlan.getReaderIndex(path.getFullPath()));
+
rawTimeSeriesInputLayer.constructPointReader(udtfPlan.getReaderIndex(path));
expressionDataTypeMap.put(this, parentLayerPointReader.getDataType());
expressionIntermediateLayerMap.put(
diff --git
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAliasIT.java
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAliasIT.java
index fbe2cdb..ae7e502 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAliasIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAliasIT.java
@@ -53,7 +53,13 @@ public class IoTDBAliasIT {
"INSERT INTO root.sg.d2(timestamp,speed,temperature,power) values(100,
11.1, 20.2, 80.0)",
"INSERT INTO root.sg.d2(timestamp,speed,temperature,power) values(200,
20.2, 21.8, 81.0)",
"INSERT INTO root.sg.d2(timestamp,speed,temperature,power) values(300,
45.3, 23.4, 82.0)",
- "INSERT INTO root.sg.d2(timestamp,speed,temperature,power) values(400,
73.4, 26.3, 83.0)"
+ "INSERT INTO root.sg.d2(timestamp,speed,temperature,power) values(400,
73.4, 26.3, 83.0)",
+ "SET STORAGE GROUP TO root.sg1",
+ "CREATE TIMESERIES root.sg1.d1.s1 WITH DATATYPE=INT32, ENCODING=PLAIN",
+ "CREATE TIMESERIES root.sg1.d1.s2 WITH DATATYPE=INT32, ENCODING=PLAIN",
+ "INSERT INTO root.sg1.d1(timestamp, s1, s2) VALUES (0, -1, 1)",
+ "INSERT INTO root.sg1.d1(timestamp, s1, s2) VALUES (1, -2, 2)",
+ "INSERT INTO root.sg1.d1(timestamp, s1, s2) VALUES (2, -3, 3)"
};
private static final String TIMESTAMP_STR = "Time";
@@ -335,4 +341,45 @@ public class IoTDBAliasIT {
e.printStackTrace();
}
}
+
+ @Test
+ public void UDFAliasTest() throws ClassNotFoundException {
+
+ String[] expect = {
+ "Time,-root.sg1.d1.s1,a,cos(root.sg1.d1.s2),b,",
+ "Time,-root.sg1.d1.s1,a,cos(root.sg1.d1.s2),b,",
+
"Time,-root.sg1.d1.s1,-root.sg1.d1.s1,a,sin(cos(tan(root.sg1.d1.s1))),cos(root.sg1.d1.s2),b,cos(root.sg1.d1.s2),"
+ };
+ String[] sqls = {
+ "select -s1, sin(cos(tan(s1))) as a, cos(s2), top_k(s1 + s1, 'k'='1') as
b from root.sg1.d1 WHERE time >= 1509466140000",
+ "select -s1, sin(cos(tan(s1))) as a, cos(s2), top_k(s1 + s1, 'k'='1') as
b from root.sg1.d1",
+ "select -s1, -s1, sin(cos(tan(s1))) as a, sin(cos(tan(s1))), cos(s2),
top_k(s1 + s1, 'k'='1') as b, cos(s2) from root.sg1.d1"
+ };
+ int count = 2;
+
+ Class.forName(Config.JDBC_DRIVER_NAME);
+ try (Connection connection =
+ DriverManager.getConnection(
+ Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+ Statement statement = connection.createStatement()) {
+
+ for (int index = 0; index < count; index++) {
+
+ boolean hasResult = statement.execute(sqls[index]);
+ assertTrue(hasResult);
+ try (ResultSet resultSet = statement.getResultSet()) {
+
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ StringBuilder header = new StringBuilder();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ header.append(resultSetMetaData.getColumnName(i)).append(",");
+ }
+ Assert.assertEquals(expect[index], header.toString());
+ }
+ }
+
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
}