You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/08/15 08:45:13 UTC

[iotdb] branch master updated: modify deserialize function of FunctionExpression and fix tests of String UDF (#6893)

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

jackietien 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 04ee9fa32d modify deserialize function of FunctionExpression and fix tests of String UDF (#6893)
04ee9fa32d is described below

commit 04ee9fa32d2235529f887243bbce5530d3bf5cf8
Author: Weihao Li <60...@users.noreply.github.com>
AuthorDate: Mon Aug 15 16:45:06 2022 +0800

    modify deserialize function of FunctionExpression and fix tests of String UDF (#6893)
    
    、
---
 .../db/it/udf/IoTDBUDTFBuiltinFunctionIT.java      | 172 ++++++++-------------
 .../plan/expression/multi/FunctionExpression.java  |  14 +-
 .../iotdb/tsfile/utils/ReadWriteIOUtils.java       |  17 ++
 3 files changed, 89 insertions(+), 114 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java
index 66cb990995..8ef47e56f1 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java
@@ -1080,155 +1080,115 @@ public class IoTDBUDTFBuiltinFunctionIT {
       testTrim(statement);
       testStrCmp(statement);
     } catch (Exception e) {
-      e.printStackTrace();
+      fail(e.getMessage());
     }
   }
 
-  private void testTrim(Statement statement) {
+  private void testTrim(Statement statement) throws SQLException {
     String s2;
-    try (ResultSet resultSet =
-        statement.executeQuery("select s2, trim(s2) " + "from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        s2 = resultSet.getString(3);
-        if (s2 == null) {
-          continue;
-        }
-        assertEquals(resultSet.getString(2).trim(), resultSet.getString(3));
+    ResultSet resultSet =
+        statement.executeQuery("select s2, trim(s2) " + "from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      s2 = resultSet.getString(3);
+      if (s2 == null) {
+        continue;
       }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+      assertEquals(resultSet.getString(2).trim(), resultSet.getString(3));
     }
   }
 
-  private void testStrCmp(Statement statement) {
-    try (ResultSet resultSet =
+  private void testStrCmp(Statement statement) throws SQLException {
+
+    ResultSet resultSet =
         statement.executeQuery(
-            "select s1, s2, strcmp(s1, s2) " + "from root.testStringFunctions.d1")) {
-      String s1, s2;
-      while (resultSet.next()) {
-        s1 = resultSet.getString(2);
-        s2 = resultSet.getString(3);
-        if (s1 == null || s2 == null) {
-          continue;
-        }
-        assertEquals(s1.compareTo(s2), resultSet.getInt(4));
+            "select s1, s2, strcmp(s1, s2) " + "from root.testStringFunctions.d1");
+    String s1, s2;
+    while (resultSet.next()) {
+      s1 = resultSet.getString(2);
+      s2 = resultSet.getString(3);
+      if (s1 == null || s2 == null) {
+        continue;
       }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+      assertEquals(s1.compareTo(s2), resultSet.getInt(4));
     }
   }
 
-  private void testLower(Statement statement) {
-    try (ResultSet resultSet =
-        statement.executeQuery("select s1, lower(s1) " + "from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(resultSet.getString(2).toLowerCase(), resultSet.getString(3));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+  private void testLower(Statement statement) throws SQLException {
+    ResultSet resultSet =
+        statement.executeQuery("select s1, lower(s1) " + "from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(resultSet.getString(2).toLowerCase(), resultSet.getString(3));
     }
   }
 
-  private void testUpper(Statement statement) {
-    try (ResultSet resultSet =
-        statement.executeQuery("select s1, upper(s1) " + "from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(resultSet.getString(2).toUpperCase(), resultSet.getString(3));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+  private void testUpper(Statement statement) throws SQLException {
+    ResultSet resultSet =
+        statement.executeQuery("select s1, upper(s1) " + "from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(resultSet.getString(2).toUpperCase(), resultSet.getString(3));
     }
   }
 
-  private void testSubStr(Statement statement) {
-    try (ResultSet resultSet =
+  private void testSubStr(Statement statement) throws SQLException {
+    ResultSet resultSet =
         statement.executeQuery(
             "select s1, substr(s1, \"start\"=\"3\", \"end\"=\"7\") "
-                + "from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(resultSet.getString(2).substring(3, 7), resultSet.getString(3));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+                + "from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(resultSet.getString(2).substring(3, 7), resultSet.getString(3));
     }
   }
 
-  private void testConcat(Statement statement) {
-    try (ResultSet resultSet =
+  private void testConcat(Statement statement) throws SQLException {
+    ResultSet resultSet =
         statement.executeQuery(
             "select s1, s2, "
                 + "concat(s1, s2, \"target1\"=\"IoT\", \"target2\"=\"DB\"), "
                 + "concat(s1, s2, \"target1\"=\"IoT\", \"target2\"=\"DB\", \"series_behind\"=\"true\") "
-                + "from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(
-            (resultSet.getString(2) + resultSet.getString(3) + "IoTDB").replace("null", ""),
-            resultSet.getString(4));
-        assertEquals(
-            ("IoTDB" + (resultSet.getString(2) + resultSet.getString(3))).replace("null", ""),
-            resultSet.getString(5));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+                + "from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(
+          (resultSet.getString(2) + resultSet.getString(3) + "IoTDB").replace("null", ""),
+          resultSet.getString(4));
+      assertEquals(
+          ("IoTDB" + (resultSet.getString(2) + resultSet.getString(3))).replace("null", ""),
+          resultSet.getString(5));
     }
   }
 
-  private void testEndsWith(Statement statement) {
-    try (ResultSet resultSet =
+  private void testEndsWith(Statement statement) throws SQLException {
+    ResultSet resultSet =
         statement.executeQuery(
-            "select s1, endsWith(s1, \"target\"=\"1111\") " + "from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(resultSet.getString(2).endsWith("1111"), resultSet.getBoolean(3));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+            "select s1, endsWith(s1, \"target\"=\"1111\") " + "from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(resultSet.getString(2).endsWith("1111"), resultSet.getBoolean(3));
     }
   }
 
-  private void testStartsWith(Statement statement) {
-    try (ResultSet resultSet =
+  private void testStartsWith(Statement statement) throws SQLException {
+    ResultSet resultSet =
         statement.executeQuery(
-            "select s1, startsWith(s1, \"target\"=\"1111\") "
-                + "from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(resultSet.getString(2).startsWith("1111"), resultSet.getBoolean(3));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+            "select s1, startsWith(s1, \"target\"=\"1111\") " + "from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(resultSet.getString(2).startsWith("1111"), resultSet.getBoolean(3));
     }
   }
 
-  private void testStrLocate(Statement statement) {
-    try (ResultSet resultSet =
+  private void testStrLocate(Statement statement) throws SQLException {
+    ResultSet resultSet =
         statement.executeQuery(
-            "select s1, locate(s1, \"target\"=\"1111\"), locate(s1, \"target\"=\"1111\", \"reverse\"=\"true\") from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(resultSet.getString(2).indexOf("1111"), resultSet.getInt(3));
-        assertEquals(resultSet.getString(2).lastIndexOf("1111"), resultSet.getInt(4));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+            "select s1, locate(s1, \"target\"=\"1111\"), locate(s1, \"target\"=\"1111\", \"reverse\"=\"true\") from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(resultSet.getString(2).indexOf("1111"), resultSet.getInt(3));
+      assertEquals(resultSet.getString(2).lastIndexOf("1111"), resultSet.getInt(4));
     }
   }
 
-  private void testStrLength(Statement statement) {
-    try (ResultSet resultSet =
-        statement.executeQuery("select s1, length(s1) from root.testStringFunctions.d1")) {
-      while (resultSet.next()) {
-        assertEquals(resultSet.getString(2).length(), resultSet.getInt(3));
-      }
-    } catch (SQLException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+  private void testStrLength(Statement statement) throws SQLException {
+    ResultSet resultSet =
+        statement.executeQuery("select s1, length(s1) from root.testStringFunctions.d1");
+    while (resultSet.next()) {
+      assertEquals(resultSet.getString(2).length(), resultSet.getInt(3));
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
index 2d6fad00d9..ca3a83f9b2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
@@ -64,7 +64,7 @@ public class FunctionExpression extends Expression {
   private boolean isUserDefinedAggregationFunctionExpression;
 
   private final String functionName;
-  private final Map<String, String> functionAttributes;
+  private final LinkedHashMap<String, String> functionAttributes;
 
   /**
    * example: select udf(a, b, udf(c)) from root.sg.d;
@@ -88,7 +88,9 @@ public class FunctionExpression extends Expression {
   }
 
   public FunctionExpression(
-      String functionName, Map<String, String> functionAttributes, List<Expression> expressions) {
+      String functionName,
+      LinkedHashMap<String, String> functionAttributes,
+      List<Expression> expressions) {
     this.functionName = functionName;
     this.functionAttributes = functionAttributes;
     this.expressions = expressions;
@@ -107,11 +109,7 @@ public class FunctionExpression extends Expression {
   public FunctionExpression(ByteBuffer byteBuffer) {
     functionName = ReadWriteIOUtils.readString(byteBuffer);
 
-    Map<String, String> deserializedFunctionAttributes = ReadWriteIOUtils.readMap(byteBuffer);
-    functionAttributes =
-        deserializedFunctionAttributes != null
-            ? deserializedFunctionAttributes
-            : new LinkedHashMap<>();
+    functionAttributes = ReadWriteIOUtils.readLinkedHashMap(byteBuffer);
 
     int expressionSize = ReadWriteIOUtils.readInt(byteBuffer);
     expressions = new ArrayList<>();
@@ -184,7 +182,7 @@ public class FunctionExpression extends Expression {
     return functionName;
   }
 
-  public Map<String, String> getFunctionAttributes() {
+  public LinkedHashMap<String, String> getFunctionAttributes() {
     return functionAttributes;
   }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
index dfa6be3f55..1ad3b5fbec 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
@@ -35,6 +35,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -691,6 +692,22 @@ public class ReadWriteIOUtils {
     return map;
   }
 
+  public static LinkedHashMap<String, String> readLinkedHashMap(ByteBuffer buffer) {
+    int length = readInt(buffer);
+    if (length == NO_BYTE_TO_READ) {
+      return null;
+    }
+    LinkedHashMap<String, String> map = new LinkedHashMap<>(length);
+    for (int i = 0; i < length; i++) {
+      // key
+      String key = readString(buffer);
+      // value
+      String value = readString(buffer);
+      map.put(key, value);
+    }
+    return map;
+  }
+
   public static List<Map<String, String>> readMaps(ByteBuffer buffer, int totalSize) {
     List<Map<String, String>> results = new ArrayList<>(totalSize);
     for (int i = 0; i < totalSize; i++) {