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

Reply via email to