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

rong pushed a commit to branch iotdb-1400
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit efc952ba01c1707e41f731d71cecfd5992a4f81c
Author: Steve Yurong Su <[email protected]>
AuthorDate: Fri May 28 12:12:30 2021 +0800

    add IT
---
 .../transformer/ArithmeticBinaryTransformer.java   |   6 +-
 .../transformer/ArithmeticNegationTransformer.java |   4 +-
 .../iotdb/db/integration/IoTDBArithmeticIT.java    | 275 +++++++++++++++++++++
 3 files changed, 280 insertions(+), 5 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
index ae46158..fd7c0d9 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.query.udf.core.transformer;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
@@ -88,7 +87,7 @@ public abstract class ArithmeticBinaryTransformer extends 
Transformer {
   protected abstract double evaluate(double leftOperand, double rightOperand);
 
   private static double castCurrentValueToDoubleOperand(LayerPointReader 
layerPointReader)
-      throws IOException {
+      throws IOException, QueryProcessException {
     switch (layerPointReader.getDataType()) {
       case INT32:
         return layerPointReader.currentInt();
@@ -99,7 +98,8 @@ public abstract class ArithmeticBinaryTransformer extends 
Transformer {
       case DOUBLE:
         return layerPointReader.currentDouble();
       default:
-        throw new UnSupportedDataTypeException(layerPointReader.toString());
+        throw new QueryProcessException(
+            "Unsupported data type: " + 
layerPointReader.getDataType().toString());
     }
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticNegationTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticNegationTransformer.java
index 5052032..46a6063 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticNegationTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticNegationTransformer.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.query.udf.core.transformer;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
@@ -54,7 +53,8 @@ public class ArithmeticNegationTransformer extends 
Transformer {
         cachedDouble = -layerPointReader.currentDouble();
         break;
       default:
-        throw new UnSupportedDataTypeException(layerPointReader.toString());
+        throw new QueryProcessException(
+            "Unsupported data type: " + 
layerPointReader.getDataType().toString());
     }
     layerPointReader.readyForNext();
     return true;
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBArithmeticIT.java 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBArithmeticIT.java
new file mode 100644
index 0000000..840b595
--- /dev/null
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBArithmeticIT.java
@@ -0,0 +1,275 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.integration;
+
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.db.metadata.PartialPath;
+import org.apache.iotdb.db.service.IoTDB;
+import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.jdbc.Config;
+import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class IoTDBArithmeticIT {
+
+  private static final double E = 0.0001;
+
+  private static final String[] INSERTION_SQLS = {
+    "insert into root.sg.d1(time, s1, s2, s3, s4, s5, s6, s7) values (1, 1, 1, 
1, 1, false, '1', 1)",
+    "insert into root.sg.d1(time, s1, s2, s3, s4, s5, s6, s8) values (2, 2, 2, 
2, 2, false, '2', 2)",
+    "insert into root.sg.d1(time, s1, s2, s3, s4, s5, s6, s7) values (3, 3, 3, 
3, 3, true, '3', 3)",
+    "insert into root.sg.d1(time, s1, s2, s3, s4, s5, s6, s8) values (4, 4, 4, 
4, 4, true, '4', 4)",
+    "insert into root.sg.d1(time, s1, s2, s3, s4, s5, s6, s7, s8) values (5, 
5, 5, 5, 5, true, '5', 5, 5)",
+  };
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    EnvironmentUtils.envSetUp();
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    createTimeSeries();
+    generateData();
+  }
+
+  private static void createTimeSeries() throws MetadataException {
+    IoTDB.metaManager.setStorageGroup(new PartialPath("root.sg"));
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s1"),
+        TSDataType.INT32,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s2"),
+        TSDataType.INT64,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s3"),
+        TSDataType.FLOAT,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s4"),
+        TSDataType.DOUBLE,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s5"),
+        TSDataType.BOOLEAN,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s6"),
+        TSDataType.TEXT,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s7"),
+        TSDataType.INT32,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+    IoTDB.metaManager.createTimeseries(
+        new PartialPath("root.sg.d1.s8"),
+        TSDataType.INT32,
+        TSEncoding.PLAIN,
+        CompressionType.UNCOMPRESSED,
+        null);
+  }
+
+  private static void generateData() {
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+      for (String dataGenerationSql : INSERTION_SQLS) {
+        statement.execute(dataGenerationSql);
+      }
+    } catch (SQLException throwable) {
+      fail(throwable.getMessage());
+    }
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    EnvironmentUtils.cleanEnv();
+  }
+
+  @Test
+  public void testArithmeticBinary() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + 
"127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+
+      String[] operands = new String[] {"s1", "s2", "s3", "s4"};
+      for (String operator : new String[] {" + ", " - ", " * ", " / ", " % "}) 
{
+        List<String> expressions = new ArrayList<>();
+        for (String leftOperand : operands) {
+          for (String rightOperand : operands) {
+            expressions.add(leftOperand + operator + rightOperand);
+          }
+        }
+        String sql = String.format("select %s from root.sg.d1", 
String.join(",", expressions));
+
+        ResultSet resultSet = statement.executeQuery(sql);
+
+        assertEquals(1 + expressions.size(), 
resultSet.getMetaData().getColumnCount());
+
+        for (int i = 1; i < INSERTION_SQLS.length + 1; ++i) {
+          resultSet.next();
+          for (int j = 0; j < expressions.size(); ++j) {
+            double expected = 0;
+            switch (operator) {
+              case " + ":
+                expected = i + i;
+                break;
+              case " - ":
+                expected = i - i;
+                break;
+              case " * ":
+                expected = i * i;
+                break;
+              case " / ":
+                expected = i / i;
+                break;
+              case " % ":
+                expected = i % i;
+                break;
+            }
+            double actual = Double.parseDouble(resultSet.getString(2 + j));
+            assertEquals(expected, actual, E);
+          }
+        }
+      }
+    } catch (SQLException throwable) {
+      fail(throwable.getMessage());
+    }
+  }
+
+  @Test
+  public void testArithmeticUnary() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + 
"127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+      String[] expressions = new String[] {"- s1", "- s2", "- s3", "- s4"};
+      String sql = String.format("select %s from root.sg.d1", String.join(",", 
expressions));
+      ResultSet resultSet = statement.executeQuery(sql);
+
+      assertEquals(1 + expressions.length, 
resultSet.getMetaData().getColumnCount());
+
+      for (int i = 1; i < INSERTION_SQLS.length + 1; ++i) {
+        resultSet.next();
+        for (int j = 0; j < expressions.length; ++j) {
+          double expected = -i;
+          double actual = Double.parseDouble(resultSet.getString(2 + j));
+          assertEquals(expected, actual, E);
+        }
+      }
+    } catch (SQLException throwable) {
+      fail(throwable.getMessage());
+    }
+  }
+
+  @Test
+  public void testHybridQuery() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + 
"127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+      String[] expressions = new String[] {"s1", "s1 + s2", "sin(s1)"};
+      String sql = String.format("select %s from root.sg.d1", String.join(",", 
expressions));
+      ResultSet resultSet = statement.executeQuery(sql);
+
+      assertEquals(1 + expressions.length, 
resultSet.getMetaData().getColumnCount());
+
+      for (int i = 1; i < INSERTION_SQLS.length + 1; ++i) {
+        resultSet.next();
+        assertEquals(i, Double.parseDouble(resultSet.getString(2)), E);
+        assertEquals(i + i, Double.parseDouble(resultSet.getString(3)), E);
+        assertEquals(Math.sin(i), Double.parseDouble(resultSet.getString(4)), 
E);
+      }
+    } catch (SQLException throwable) {
+      fail(throwable.getMessage());
+    }
+  }
+
+  @Test
+  public void testNonAlign() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + 
"127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+      ResultSet resultSet = statement.executeQuery("select s7 + s8 from 
root.sg.d1");
+      assertEquals(1 + 1, resultSet.getMetaData().getColumnCount());
+      assertTrue(resultSet.next());
+      assertEquals(10, Double.parseDouble(resultSet.getString(2)), E);
+      assertFalse(resultSet.next());
+
+      resultSet = statement.executeQuery("select s7 + s8 from root.sg.d1 where 
time < 5");
+      assertEquals(1 + 1, resultSet.getMetaData().getColumnCount());
+      assertFalse(resultSet.next());
+    } catch (SQLException throwable) {
+      fail(throwable.getMessage());
+    }
+  }
+
+  @Test
+  public void testWrongTypeBoolean() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + 
"127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+      statement.executeQuery("select s1 + s5 from root.sg.d1");
+    } catch (SQLException throwable) {
+      assertTrue(throwable.getMessage().contains("Unsupported data type: 
BOOLEAN"));
+    }
+  }
+
+  @Test
+  public void testWrongTypeText() {
+    try (Statement statement =
+        DriverManager.getConnection(Config.IOTDB_URL_PREFIX + 
"127.0.0.1:6667/", "root", "root")
+            .createStatement()) {
+      statement.executeQuery("select s1 + s6 from root.sg.d1");
+    } catch (SQLException throwable) {
+      assertTrue(throwable.getMessage().contains("Unsupported data type: 
TEXT"));
+    }
+  }
+}

Reply via email to