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