You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2024/07/25 14:26:26 UTC
(iotdb) branch ty/TableModelGrammar updated: Add more table it
This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/ty/TableModelGrammar by this push:
new 819e5a42b61 Add more table it
819e5a42b61 is described below
commit 819e5a42b61d909ff80283d26846e0c7c29f6229
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Thu Jul 25 22:26:20 2024 +0800
Add more table it
---
.../java/org/apache/iotdb/itbase/env/BaseEnv.java | 5 +
...rmatIT.java => IoTDBDatetimeFormatTableIT.java} | 2 +-
...edQueryIT.java => IoTDBNestedQueryTableIT.java} | 2 +-
...ice2IT.java => IoTDBAlignByDeviceTable2IT.java} | 2 +-
...ice3IT.java => IoTDBAlignByDeviceTable3IT.java} | 2 +-
...eviceIT.java => IoTDBAlignByDeviceTableIT.java} | 2 +-
...=> IoTDBAlignByDeviceWithTemplateTable2IT.java} | 2 +-
... => IoTDBAlignByDeviceWithTemplateTableIT.java} | 2 +-
...DBOrderByLimitOffsetAlignByDeviceTable2IT.java} | 4 +-
...TDBOrderByLimitOffsetAlignByDeviceTableIT.java} | 6 +-
... => IoTDBOrderByWithAlignByDeviceTable2IT.java} | 2 +-
... => IoTDBOrderByWithAlignByDeviceTable3IT.java} | 2 +-
...a => IoTDBOrderByWithAlignByDeviceTableIT.java} | 2 +-
.../IoTDBAlignedOffsetLimitPushDownTableIT.java | 156 +
.../IoTDBAlignedSeriesQueryTable2IT.java} | 17 +-
.../IoTDBAlignedSeriesQueryTable3IT.java} | 19 +-
.../IoTDBAlignedSeriesQueryTable4IT.java} | 19 +-
.../IoTDBAlignedSeriesQueryTable5IT.java} | 18 +-
.../aligned/IoTDBAlignedSeriesQueryTableIT.java | 3678 ++++++++++++++++++++
.../IoTDBPredicatePushDownTable2IT.java} | 15 +-
.../IoTDBPredicatePushDownTable3IT.java} | 17 +-
.../IoTDBPredicatePushDownTable4IT.java} | 15 +-
.../old/aligned/IoTDBPredicatePushDownTableIT.java | 683 ++++
.../it/query/old/aligned/TableUtils.java | 216 ++
...nctionIT.java => IoTDBCastFunctionTableIT.java} | 2 +-
...tion2IT.java => IoTDBDiffFunctionTable2IT.java} | 2 +-
...tion3IT.java => IoTDBDiffFunctionTable3IT.java} | 2 +-
...nctionIT.java => IoTDBDiffFunctionTableIT.java} | 2 +-
...ionIT.java => IoTDBReplaceFunctionTableIT.java} | 2 +-
...ctionIT.java => IoTDBRoundFunctionTableIT.java} | 2 +-
...nIT.java => IoTDBSubStringFunctionTableIT.java} | 2 +-
.../it/query/old/orderBy/IoTDBOrderByTableIT.java | 1566 +++++++++
.../plan/planner/TableOperatorGenerator.java | 2 +-
.../planner/ir/NormalizeOrExpressionRewriter.java | 5 -
.../relational/planner/node/StreamSortNode.java | 2 +-
35 files changed, 6413 insertions(+), 64 deletions(-)
diff --git a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
index 25454caf871..1d721aaa798 100644
--- a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
+++ b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
@@ -109,6 +109,11 @@ public interface BaseEnv {
SessionConfig.DEFAULT_USER, SessionConfig.DEFAULT_PASSWORD, TREE_SQL_DIALECT);
}
+ default Connection getTableConnection() throws SQLException {
+ return getConnection(
+ SessionConfig.DEFAULT_USER, SessionConfig.DEFAULT_PASSWORD, TABLE_SQL_DIALECT);
+ }
+
default Connection getConnection(String sqlDialect) throws SQLException {
return getConnection(SessionConfig.DEFAULT_USER, SessionConfig.DEFAULT_PASSWORD, sqlDialect);
}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatTableIT.java
index 2491934de14..b5cbabd5700 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDatetimeFormatIT {
+public class IoTDBDatetimeFormatTableIT {
private static final String DATABASE_NAME = "db";
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryTableIT.java
index 4e8b1a6959b..d2bc1f172c0 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryTableIT.java
@@ -43,7 +43,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBNestedQueryIT {
+public class IoTDBNestedQueryTableIT {
private static final String DATABASE_NAME = "db";
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable2IT.java
similarity index 95%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable2IT.java
index abca27ddc04..ea22855e248 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable2IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice2IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignByDeviceTable2IT extends IoTDBAlignByDeviceTableIT {
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getCommonConfig().setDegreeOfParallelism(4);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable3IT.java
similarity index 95%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable3IT.java
index 3f67ef68d91..cd60f5e8dd7 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable3IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignByDeviceTable3IT extends IoTDBAlignByDeviceTableIT {
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
index d630477511b..cdb312308ad 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
@@ -39,7 +39,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceIT {
+public class IoTDBAlignByDeviceTableIT {
private static final String DATABASE_NAME = "db";
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTable2IT.java
similarity index 94%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTable2IT.java
index f19a20779e9..33f3ed9f62f 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTable2IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBAlignByDeviceWithTemplateTable2IT extends IoTDBAlignByDeviceWithTemplateTableIT {
@BeforeClass
public static void setUp() throws Exception {
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTableIT.java
index 5a61cdf49c4..a480bf5d592 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTableIT.java
@@ -42,7 +42,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBAlignByDeviceWithTemplateTableIT {
private static final String DATABASE_NAME = "db";
private static final String[] sqls =
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDevice2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTable2IT.java
similarity index 93%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDevice2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTable2IT.java
index bae442fd086..d1e858e1d7f 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDevice2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTable2IT.java
@@ -31,8 +31,8 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByLimitOffsetAlignByDevice2IT
- extends IoTDBOrderByLimitOffsetAlignByDeviceIT {
+public class IoTDBOrderByLimitOffsetAlignByDeviceTable2IT
+ extends IoTDBOrderByLimitOffsetAlignByDeviceTableIT {
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTableIT.java
similarity index 96%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTableIT.java
index 2e80792f5ee..30ba46b1188 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTableIT.java
@@ -38,7 +38,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByLimitOffsetAlignByDeviceIT {
+public class IoTDBOrderByLimitOffsetAlignByDeviceTableIT {
@BeforeClass
public static void setUp() throws Exception {
@@ -57,7 +57,7 @@ public class IoTDBOrderByLimitOffsetAlignByDeviceIT {
String[] expectedHeader = new String[] {"time", "device_id", "s1"};
String[] retArray = new String[] {"1970-01-01T00:00:00.003Z,d1,111,"};
tableResultSetEqualTest(
- "SELECT * FROM table1 WHERE s1>40 ORDER BY Time LIMIT 1",
+ "SELECT * FROM table1 WHERE s1>40 ORDER BY Time, device_id LIMIT 1",
expectedHeader,
retArray,
DATABASE_NAME);
@@ -78,7 +78,7 @@ public class IoTDBOrderByLimitOffsetAlignByDeviceIT {
// 4. both exist OFFSET and LIMIT, can push down LIMIT as OFFSET+LIMIT
retArray = new String[] {"1970-01-01T00:00:00.003Z,d2,222,"};
tableResultSetEqualTest(
- "SELECT * FROM table1 ORDER BY Time DESC OFFSET 1 LIMIT 1",
+ "SELECT * FROM table1 ORDER BY Time DESC, device_id OFFSET 1 LIMIT 1",
expectedHeader,
retArray,
DATABASE_NAME);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable2IT.java
similarity index 94%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable2IT.java
index d38319613e7..d0e4219d2fb 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable2IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByWithAlignByDevice2IT extends IoTDBOrderByWithAlignByDeviceIT {
+public class IoTDBOrderByWithAlignByDeviceTable2IT extends IoTDBOrderByWithAlignByDeviceTableIT {
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getCommonConfig().setDegreeOfParallelism(4);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable3IT.java
similarity index 94%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice3IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable3IT.java
index 20ef83b8378..282ba80b165 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable3IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByWithAlignByDevice3IT extends IoTDBOrderByWithAlignByDeviceIT {
+public class IoTDBOrderByWithAlignByDeviceTable3IT extends IoTDBOrderByWithAlignByDeviceTableIT {
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTableIT.java
index e89cc9b4285..5f988358b58 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTableIT.java
@@ -52,7 +52,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByWithAlignByDeviceIT {
+public class IoTDBOrderByWithAlignByDeviceTableIT {
protected static final String DATABASE_NAME = "db";
protected static final String[] places =
new String[] {
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedOffsetLimitPushDownTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedOffsetLimitPushDownTableIT.java
new file mode 100644
index 00000000000..fc344846b0f
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedOffsetLimitPushDownTableIT.java
@@ -0,0 +1,156 @@
+/*
+ * 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.relational.it.query.old.aligned;
+
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.iotdb.relational.it.query.old.aligned.TableUtils.USE_DB;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBAlignedOffsetLimitPushDownTableIT {
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ EnvFactory.getEnv().initClusterEnvironment();
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute("CREATE DATABASE IF NOT EXISTS db");
+ statement.execute(USE_DB);
+ statement.execute(
+ "CREATE TABLE table0 (device string id, s1 double measurement, s2 double measurement)");
+
+ statement.execute("insert into table0(device,time,s1,s2) values('d1',1,1,1)");
+ statement.execute("insert into table0(device,time,s1,s2) values('d1',2,2,2)");
+ statement.execute("insert into table0(device,time,s1,s2) values('d1',3,3,3)");
+ statement.execute("insert into table0(device,time,s1,s2) values('d1',4,4,4)");
+ statement.execute("insert into table0(device,time,s1,s2) values('d1',5,5,null)");
+ statement.execute("insert into table0(device,time,s1,s2) values('d1',6,6,null)");
+ statement.execute("insert into table0(device,time,s1,s2) values('d1',7,7,7)");
+
+ statement.execute("flush");
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ EnvFactory.getEnv().cleanClusterEnvironment();
+ }
+
+ @Test
+ public void selectWithLimitPushDownTest1() {
+
+ String[] retArray = new String[] {"3,3.0", "4,4.0"};
+
+ String[] columnNames = {"s1"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1 from table0 where device='d1' and time >= 3 limit 2")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectWithLimitPushDownTest2() {
+
+ String[] retArray = new String[] {"6,6.0,null", "7,7.0,7.0"};
+
+ String[] columnNames = {"s1", "s2"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2 from table0 where device='d1' and time >= 1 offset 5")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable2IT.java
similarity index 76%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable2IT.java
index 3f67ef68d91..4855767c868 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable2IT.java
@@ -16,8 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,12 +30,20 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignedSeriesQueryTable2IT extends IoTDBAlignedSeriesQueryTableIT {
+
@BeforeClass
public static void setUp() throws Exception {
- EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3)
+ .setMaxNumberOfPointsInPage(2);
EnvFactory.getEnv().initClusterEnvironment();
- insertData();
+ TableUtils.insertData();
}
@AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable3IT.java
similarity index 74%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable3IT.java
index 3f67ef68d91..6e08514eba3 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable3IT.java
@@ -16,8 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,16 +30,24 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignedSeriesQueryTable3IT extends IoTDBAlignedSeriesQueryTableIT {
+
@BeforeClass
public static void setUp() throws Exception {
- EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3)
+ .setMaxNumberOfPointsInPage(3);
EnvFactory.getEnv().initClusterEnvironment();
- insertData();
+ TableUtils.insertData();
}
@AfterClass
- public static void tearDown() throws Exception {
+ public static void tearDown() {
EnvFactory.getEnv().cleanClusterEnvironment();
}
}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable4IT.java
similarity index 74%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable4IT.java
index 3f67ef68d91..59374ddfaa4 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable4IT.java
@@ -7,7 +7,7 @@
* "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
+ * 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
@@ -16,8 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,12 +30,20 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignedSeriesQueryTable4IT extends IoTDBAlignedSeriesQueryTableIT {
+
@BeforeClass
public static void setUp() throws Exception {
- EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3)
+ .setDegreeOfParallelism(4);
EnvFactory.getEnv().initClusterEnvironment();
- insertData();
+ TableUtils.insertData();
}
@AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable5IT.java
similarity index 74%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable5IT.java
index f19a20779e9..560aad5b404 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable5IT.java
@@ -16,8 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,13 +30,22 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBAlignedSeriesQueryTable5IT extends IoTDBAlignedSeriesQueryTableIT {
@BeforeClass
public static void setUp() throws Exception {
- EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(1)
+ .setMaxNumberOfPointsInPage(1)
+ .setDriverTaskExecutionTimeSliceInMs(20);
+
EnvFactory.getEnv().initClusterEnvironment();
- insertData();
+ TableUtils.insertData();
}
@AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTableIT.java
new file mode 100644
index 00000000000..3d9c3e43fec
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTableIT.java
@@ -0,0 +1,3678 @@
+/*
+ * 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.relational.it.query.old.aligned;
+
+import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.iotdb.db.utils.constant.TestConstant.avg;
+import static org.apache.iotdb.db.utils.constant.TestConstant.count;
+import static org.apache.iotdb.db.utils.constant.TestConstant.firstValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.lastValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.maxTime;
+import static org.apache.iotdb.db.utils.constant.TestConstant.maxValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.minTime;
+import static org.apache.iotdb.db.utils.constant.TestConstant.minValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.sum;
+import static org.apache.iotdb.itbase.constant.TestConstant.TIMESTAMP_STR;
+import static org.apache.iotdb.relational.it.query.old.aligned.TableUtils.USE_DB;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBAlignedSeriesQueryTableIT {
+
+ private static final double DELTA = 1e-6;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3);
+ EnvFactory.getEnv().initClusterEnvironment();
+ TableUtils.insertData();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ EnvFactory.getEnv().cleanClusterEnvironment();
+ }
+
+ // ------------------------------Raw Query Without Value Filter----------------------------------
+ @Test
+ public void selectAllAlignedWithoutValueFilterTest() {
+
+ String[] retArray =
+ new String[] {
+ "1,1.0,1,1,true,aligned_test1",
+ "2,2.0,2,2,null,aligned_test2",
+ "3,30000.0,null,30000,true,aligned_unseq_test3",
+ "4,4.0,4,null,true,aligned_test4",
+ "5,5.0,5,null,true,aligned_test5",
+ "6,6.0,6,6,true,null",
+ "7,7.0,7,7,false,aligned_test7",
+ "8,8.0,8,8,null,aligned_test8",
+ "9,9.0,9,9,false,aligned_test9",
+ "10,null,10,10,true,aligned_test10",
+ "11,11.0,11,11,null,null",
+ "12,12.0,12,12,null,null",
+ "13,130000.0,130000,130000,true,aligned_unseq_test13",
+ "14,14.0,14,14,null,null",
+ "15,15.0,15,15,null,null",
+ "16,16.0,16,16,null,null",
+ "17,17.0,17,17,null,null",
+ "18,18.0,18,18,null,null",
+ "19,19.0,19,19,null,null",
+ "20,20.0,20,20,null,null",
+ "21,null,null,21,true,null",
+ "22,null,null,22,true,null",
+ "23,230000.0,null,230000,false,null",
+ "24,null,null,24,true,null",
+ "25,null,null,25,true,null",
+ "26,null,null,26,false,null",
+ "27,null,null,27,false,null",
+ "28,null,null,28,false,null",
+ "29,null,null,29,false,null",
+ "30,null,null,30,false,null",
+ "31,null,31,null,null,aligned_test31",
+ "32,null,32,null,null,aligned_test32",
+ "33,null,33,null,null,aligned_test33",
+ "34,null,34,null,null,aligned_test34",
+ "35,null,35,null,null,aligned_test35",
+ "36,null,36,null,null,aligned_test36",
+ "37,null,37,null,null,aligned_test37",
+ "38,null,38,null,null,aligned_test38",
+ "39,null,39,null,null,aligned_test39",
+ "40,null,40,null,null,aligned_test40",
+ };
+
+ String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithTimeFilterTest() {
+
+ String[] retArray =
+ new String[] {
+ "9,9.0,9,9,false,aligned_test9",
+ "10,null,10,10,true,aligned_test10",
+ "11,11.0,11,11,null,null",
+ "12,12.0,12,12,null,null",
+ "13,130000.0,130000,130000,true,aligned_unseq_test13",
+ "14,14.0,14,14,null,null",
+ "15,15.0,15,15,null,null",
+ "16,16.0,16,16,null,null",
+ "17,17.0,17,17,null,null",
+ "18,18.0,18,18,null,null",
+ "19,19.0,19,19,null,null",
+ "20,20.0,20,20,null,null",
+ "21,null,null,21,true,null",
+ "22,null,null,22,true,null",
+ "23,230000.0,null,230000,false,null",
+ "24,null,null,24,true,null",
+ "25,null,null,25,true,null",
+ "26,null,null,26,false,null",
+ "27,null,null,27,false,null",
+ "28,null,null,28,false,null",
+ "29,null,null,29,false,null",
+ "30,null,null,30,false,null",
+ "31,null,31,null,null,aligned_test31",
+ "32,null,32,null,null,aligned_test32",
+ "33,null,33,null,null,aligned_test33",
+ };
+
+ String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithoutValueFilterTest1() {
+
+ String[] retArray =
+ new String[] {
+ "1,1.0,true,aligned_test1",
+ "2,2.0,null,aligned_test2",
+ "3,30000.0,true,aligned_unseq_test3",
+ "4,4.0,true,aligned_test4",
+ "5,5.0,true,aligned_test5",
+ "6,6.0,true,null",
+ "7,7.0,false,aligned_test7",
+ "8,8.0,null,aligned_test8",
+ "9,9.0,false,aligned_test9",
+ "10,null,true,aligned_test10",
+ "11,11.0,null,null",
+ "12,12.0,null,null",
+ "13,130000.0,true,aligned_unseq_test13",
+ "14,14.0,null,null",
+ "15,15.0,null,null",
+ "16,16.0,null,null",
+ "17,17.0,null,null",
+ "18,18.0,null,null",
+ "19,19.0,null,null",
+ "20,20.0,null,null",
+ "21,null,true,null",
+ "22,null,true,null",
+ "23,230000.0,false,null",
+ "24,null,true,null",
+ "25,null,true,null",
+ "26,null,false,null",
+ "27,null,false,null",
+ "28,null,false,null",
+ "29,null,false,null",
+ "30,null,false,null",
+ "31,null,null,aligned_test31",
+ "32,null,null,aligned_test32",
+ "33,null,null,aligned_test33",
+ "34,null,null,aligned_test34",
+ "35,null,null,aligned_test35",
+ "36,null,null,aligned_test36",
+ "37,null,null,aligned_test37",
+ "38,null,null,aligned_test38",
+ "39,null,null,aligned_test39",
+ "40,null,null,aligned_test40",
+ };
+
+ String[] columnNames = {"s1", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery("select Time,s1,s4,s5 from table0 where device='d1'")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithoutValueFilterTest2() {
+
+ String[] retArray =
+ new String[] {
+ "1,1.0,true",
+ "2,2.0,null",
+ "3,30000.0,true",
+ "4,4.0,true",
+ "5,5.0,true",
+ "6,6.0,true",
+ "7,7.0,false",
+ "8,8.0,null",
+ "9,9.0,false",
+ "10,null,true",
+ "11,11.0,null",
+ "12,12.0,null",
+ "13,130000.0,true",
+ "14,14.0,null",
+ "15,15.0,null",
+ "16,16.0,null",
+ "17,17.0,null",
+ "18,18.0,null",
+ "19,19.0,null",
+ "20,20.0,null",
+ "21,null,true",
+ "22,null,true",
+ "23,230000.0,false",
+ "24,null,true",
+ "25,null,true",
+ "26,null,false",
+ "27,null,false",
+ "28,null,false",
+ "29,null,false",
+ "30,null,false",
+ };
+
+ String[] columnNames = {"s1", "s4"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery("select Time,s1,s4 from table0 where device='d1'")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithTimeFilterTest() {
+
+ String[] retArray =
+ new String[] {
+ "16,16.0,null,null",
+ "17,17.0,null,null",
+ "18,18.0,null,null",
+ "19,19.0,null,null",
+ "20,20.0,null,null",
+ "21,null,true,null",
+ "22,null,true,null",
+ "23,230000.0,false,null",
+ "24,null,true,null",
+ "25,null,true,null",
+ "26,null,false,null",
+ "27,null,false,null",
+ "28,null,false,null",
+ "29,null,false,null",
+ "30,null,false,null",
+ "31,null,null,aligned_test31",
+ "32,null,null,aligned_test32",
+ "33,null,null,aligned_test33",
+ "34,null,null,aligned_test34",
+ };
+
+ String[] columnNames = {"s1", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s4,s5 from table0 where device='d1' and time >= 16 and time <= 34")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ // ------------------------------Raw Query With Value Filter-------------------------------------
+ @Test
+ public void selectAllAlignedWithValueFilterTest1() {
+
+ String[] retArray =
+ new String[] {
+ "1,1.0,1,1,true,aligned_test1",
+ "3,30000.0,null,30000,true,aligned_unseq_test3",
+ "4,4.0,4,null,true,aligned_test4",
+ "5,5.0,5,null,true,aligned_test5",
+ "6,6.0,6,6,true,null",
+ "10,null,10,10,true,aligned_test10",
+ "13,130000.0,130000,130000,true,aligned_unseq_test13",
+ "21,null,null,21,true,null",
+ "22,null,null,22,true,null",
+ "24,null,null,24,true,null",
+ "25,null,null,25,true,null",
+ };
+
+ String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and s4 = true")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithValueFilterTest2() {
+
+ String[] retArray =
+ new String[] {
+ "12,12.0,12,12,null,null",
+ "14,14.0,14,14,null,null",
+ "15,15.0,15,15,null,null",
+ "16,16.0,16,16,null,null",
+ "17,17.0,17,17,null,null",
+ "18,18.0,18,18,null,null",
+ "19,19.0,19,19,null,null",
+ "20,20.0,20,20,null,null",
+ };
+
+ String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and s1 > 11.0 and s2 <= 33 order by time asc")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithValueFilterTest3() {
+
+ String[] retArray =
+ new String[] {
+ "1,1.0,1,1,true,aligned_test1",
+ "2,2.0,2,2,null,aligned_test2",
+ "3,30000.0,null,30000,true,aligned_unseq_test3",
+ "4,4.0,4,null,true,aligned_test4",
+ "5,5.0,5,null,true,aligned_test5",
+ "6,6.0,6,6,true,null",
+ "7,7.0,7,7,false,aligned_test7",
+ "8,8.0,8,8,null,aligned_test8",
+ "9,9.0,9,9,false,aligned_test9",
+ "10,null,10,10,true,aligned_test10",
+ "11,11.0,11,11,null,null",
+ "12,12.0,12,12,null,null",
+ "13,130000.0,130000,130000,true,aligned_unseq_test13",
+ "14,14.0,14,14,null,null",
+ "15,15.0,15,15,null,null",
+ "16,16.0,16,16,null,null",
+ "17,17.0,17,17,null,null",
+ "18,18.0,18,18,null,null",
+ "19,19.0,19,19,null,null",
+ "20,20.0,20,20,null,null",
+ "23,230000.0,null,230000,false,null",
+ "31,null,31,null,null,aligned_test31",
+ "32,null,32,null,null,aligned_test32",
+ };
+
+ String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and (s1 >= 13.0 or s2 < 33) order by time asc")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithTimeAndValueFilterTest1() {
+
+ String[] retArray =
+ new String[] {
+ "9,9.0,9,9,false,aligned_test9",
+ "11,11.0,11,11,null,null",
+ "12,12.0,12,12,null,null",
+ "14,14.0,14,14,null,null",
+ "15,15.0,15,15,null,null",
+ "16,16.0,16,16,null,null",
+ "17,17.0,17,17,null,null",
+ "18,18.0,18,18,null,null",
+ };
+
+ String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 and s1 < 19.0")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithLimitOffsetTest() {
+
+ String[] retArray =
+ new String[] {
+ "14,14.0,14,14,null,null",
+ "15,15.0,15,15,null,null",
+ "16,16.0,16,16,null,null",
+ "17,17.0,17,17,null,null",
+ "18,18.0,18,18,null,null",
+ };
+
+ String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 offset 5 limit 5")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithValueFilterTest1() {
+
+ String[] retArray =
+ new String[] {
+ "1,1.0,true,aligned_test1",
+ "2,2.0,null,aligned_test2",
+ "4,4.0,true,aligned_test4",
+ "5,5.0,true,aligned_test5",
+ "6,6.0,true,null",
+ "7,7.0,false,aligned_test7",
+ "8,8.0,null,aligned_test8",
+ "9,9.0,false,aligned_test9",
+ "11,11.0,null,null",
+ "12,12.0,null,null",
+ "14,14.0,null,null",
+ "15,15.0,null,null",
+ "16,16.0,null,null",
+ "34,null,null,aligned_test34",
+ };
+
+ String[] columnNames = {"s1", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s4,s5 from table0 where device='d1' and s1 < 17.0 or s5 = 'aligned_test34'")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithValueFilterTest2() {
+
+ String[] retArray =
+ new String[] {
+ "7,7.0,false", "9,9.0,false",
+ };
+
+ String[] columnNames = {"s1", "s4"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s4 from table0 where device='d1' and s1 < 19.0 and s4 = false")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithTimeAndValueFilterTest() {
+
+ String[] retArray =
+ new String[] {
+ "23,230000.0,false,null",
+ "26,null,false,null",
+ "27,null,false,null",
+ "28,null,false,null",
+ "29,null,false,null",
+ "30,null,false,null",
+ };
+
+ String[] columnNames = {"s1", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,s1,s4,s5 from table0 where device='d1' and time >= 16 and time <= 34 and s4=false")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ // --------------------------Aggregation Query Without Value Filter---------------------------
+ @Ignore
+ @Test
+ public void countAllAlignedWithoutTimeFilterTest() {
+ String[] retArray = new String[] {"20", "29", "28", "19", "20"};
+ String[] columnNames = {
+ "count(d1.s1)", "count(d1.s2)", "count(d1.s3)", "count(d1.s4)", "count(d1.s5)"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet = statement.executeQuery("select count(*) from d1")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAllAlignedAndNonAlignedWithoutTimeFilterTest() {
+ String[] retArray = new String[] {"20", "29", "28", "19", "20", "19", "29", "28", "18", "19"};
+ String[] columnNames = {
+ "count(d1.s1)",
+ "count(d1.s2)",
+ "count(d1.s3)",
+ "count(d1.s4)",
+ "count(d1.s5)",
+ "count(d2.s1)",
+ "count(d2.s2)",
+ "count(d2.s3)",
+ "count(d2.s4)",
+ "count(d2.s5)"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet = statement.executeQuery("select count(*) from root.sg1.*")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAllAlignedWithTimeFilterTest() {
+ String[] retArray = new String[] {"12", "15", "22", "13", "6"};
+ String[] columnNames = {
+ "count(d1.s1)", "count(d1.s2)", "count(d1.s3)", "count(d1.s4)", "count(d1.s5)"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(*) from d1 where time >= 9 and time <= 33")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ /** aggregate multi columns of aligned timeseries in one SQL */
+ @Ignore
+ @Test
+ public void aggregateSomeAlignedWithoutTimeFilterTest() {
+ double[] retArray =
+ new double[] {
+ 20, 29, 28, 390184, 130549, 390417, 19509.2, 4501.689655172413, 13943.464285714286
+ };
+ String[] columnNames = {
+ "count(d1.s1)",
+ "count(d1.s2)",
+ "count(d1.s3)",
+ "sum(d1.s1)",
+ "sum(d1.s2)",
+ "sum(d1.s3)",
+ "avg(d1.s1)",
+ "avg(d1.s2)",
+ "avg(d1.s3)",
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1),count(s2),count(s3),sum(s1),sum(s2),sum(s3),avg(s1),avg(s2),avg(s3) from d1")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ double[] ans = new double[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = Double.parseDouble(resultSet.getString(index));
+ }
+ assertArrayEquals(retArray, ans, DELTA);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ /** aggregate multi columns of aligned timeseries in one SQL */
+ @Ignore
+ @Test
+ public void aggregateSomeAlignedWithTimeFilterTest() {
+ double[] retArray =
+ new double[] {
+ 6, 9, 15, 230090, 220, 230322, 38348.333333333336, 24.444444444444443, 15354.8
+ };
+ String[] columnNames = {
+ "count(d1.s1)",
+ "count(d1.s2)",
+ "count(d1.s3)",
+ "sum(d1.s1)",
+ "sum(d1.s2)",
+ "sum(d1.s3)",
+ "avg(d1.s1)",
+ "avg(d1.s2)",
+ "avg(d1.s3)",
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1),count (s2),count (s3),sum(s1),sum(s2),sum(s3),avg(s1),avg(s2),avg(s3) from d1 where time>=16 and time<=34")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ double[] ans = new double[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = Double.parseDouble(resultSet.getString(index));
+ }
+ assertArrayEquals(retArray, ans, DELTA);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countSingleAlignedWithTimeFilterTest() {
+ String[] retArray = new String[] {"9"};
+ String[] columnNames = {"count(d1.s2)"};
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(s2) from d1 where time>=16 and time<=34")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ // No need to add time column for aggregation query
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ if (builder.length() != 0) {
+ builder.append(",");
+ }
+ builder.append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void sumSingleAlignedWithTimeFilterTest() {
+ String[] retArray = new String[] {"230322.0"};
+ String[] columnNames = {"sum(d1.s3)"};
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select sum(s3) from d1 where time>=16 and time<=34")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ // No need to add time column for aggregation query
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ if (builder.length() != 0) {
+ builder.append(",");
+ }
+ builder.append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void avgSingleAlignedWithTimeFilterTest() {
+ double[][] retArray = {{24.444444444444443}};
+ String[] columnNames = {"avg(d1.s2)"};
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select avg(s2) from d1 where time>=16 and time<=34")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ double[] ans = new double[columnNames.length];
+ StringBuilder builder = new StringBuilder();
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = Double.parseDouble(resultSet.getString(index));
+ }
+ assertArrayEquals(retArray[cnt], ans, DELTA);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ // --------------------------------Aggregation with value filter------------------------------
+ @Ignore
+ @Test
+ public void countAlignedWithValueFilterTest() {
+ String[] retArray = new String[] {"11"};
+ String[] columnNames = {"count(d1.s4)"};
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(s4) from d1 where s4 = true")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void aggregationFuncAlignedWithValueFilterTest() throws ClassNotFoundException {
+ String[] retArray = new String[] {"8", "42.0", "5.25", "1.0", "9.0", "1", "9", "1.0", "9.0"};
+ String[] columnNames = {
+ "count(d1.s1)",
+ "sum(d1.s1)",
+ "avg(d1.s1)",
+ "first_value(d1.s1)",
+ "last_value(d1.s1)",
+ "min_time(d1.s1)",
+ "max_time(d1.s1)",
+ "min_value(d1.s1)",
+ "max_value(d1.s1)",
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s1), avg(s1), "
+ + "first_value(s1), last_value(s1), "
+ + "min_time(s1), max_time(s1),"
+ + "max_value(s1), min_value(s1) from d1 where s1 < 10")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAllAlignedWithValueFilterTest() throws ClassNotFoundException {
+ String[] retArray = new String[] {"6", "6", "9", "11", "6"};
+ String[] columnNames = {
+ "count(d1.s1)", "count(d1.s2)", "count(d1.s3)", "count(d1.s4)", "count(d1.s5)"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(*) from d1 where s4 = true")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void aggregationAllAlignedWithValueFilterTest() throws ClassNotFoundException {
+ String[] retArray = new String[] {"160016.0", "11", "1", "13"};
+ String[] columnNames = {
+ "sum(d1.s1)", "count(d1.s4)", "min_value(d1.s3)", "max_time(d1.s2)",
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select sum(s1), count(s4), min_value(s3), max_time(s2) from d1 where s4 = true")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ // ---------------------------------Align by device query ------------------------------------
+ @Test
+ public void selectAllAlignedWithoutValueFilterAlignByDeviceTest() {
+ String[] retArray =
+ new String[] {
+ "1,d1,1.0,1,1,true,aligned_test1",
+ "2,d1,2.0,2,2,null,aligned_test2",
+ "3,d1,30000.0,null,30000,true,aligned_unseq_test3",
+ "4,d1,4.0,4,null,true,aligned_test4",
+ "5,d1,5.0,5,null,true,aligned_test5",
+ "6,d1,6.0,6,6,true,null",
+ "7,d1,7.0,7,7,false,aligned_test7",
+ "8,d1,8.0,8,8,null,aligned_test8",
+ "9,d1,9.0,9,9,false,aligned_test9",
+ "10,d1,null,10,10,true,aligned_test10",
+ "11,d1,11.0,11,11,null,null",
+ "12,d1,12.0,12,12,null,null",
+ "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+ "14,d1,14.0,14,14,null,null",
+ "15,d1,15.0,15,15,null,null",
+ "16,d1,16.0,16,16,null,null",
+ "17,d1,17.0,17,17,null,null",
+ "18,d1,18.0,18,18,null,null",
+ "19,d1,19.0,19,19,null,null",
+ "20,d1,20.0,20,20,null,null",
+ "21,d1,null,null,21,true,null",
+ "22,d1,null,null,22,true,null",
+ "23,d1,230000.0,null,230000,false,null",
+ "24,d1,null,null,24,true,null",
+ "25,d1,null,null,25,true,null",
+ "26,d1,null,null,26,false,null",
+ "27,d1,null,null,27,false,null",
+ "28,d1,null,null,28,false,null",
+ "29,d1,null,null,29,false,null",
+ "30,d1,null,null,30,false,null",
+ "31,d1,null,31,null,null,aligned_test31",
+ "32,d1,null,32,null,null,aligned_test32",
+ "33,d1,null,33,null,null,aligned_test33",
+ "34,d1,null,34,null,null,aligned_test34",
+ "35,d1,null,35,null,null,aligned_test35",
+ "36,d1,null,36,null,null,aligned_test36",
+ "37,d1,null,37,null,null,aligned_test37",
+ "38,d1,null,38,null,null,aligned_test38",
+ "39,d1,null,39,null,null,aligned_test39",
+ "40,d1,null,40,null,null,aligned_test40",
+ };
+
+ String[] columnNames = {"device", "s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,device,s1,s2,s3,s4,s5 from table0 where device='d1' order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedAndNonAlignedAlignByDeviceTest() {
+ String[] retArray =
+ new String[] {
+ "1,d1,1.0,1,1,true,aligned_test1",
+ "2,d1,2.0,2,2,null,aligned_test2",
+ "3,d1,30000.0,null,30000,true,aligned_unseq_test3",
+ "4,d1,4.0,4,null,true,aligned_test4",
+ "5,d1,5.0,5,null,true,aligned_test5",
+ "6,d1,6.0,6,6,true,null",
+ "7,d1,7.0,7,7,false,aligned_test7",
+ "8,d1,8.0,8,8,null,aligned_test8",
+ "9,d1,9.0,9,9,false,aligned_test9",
+ "10,d1,null,10,10,true,aligned_test10",
+ "11,d1,11.0,11,11,null,null",
+ "12,d1,12.0,12,12,null,null",
+ "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+ "14,d1,14.0,14,14,null,null",
+ "15,d1,15.0,15,15,null,null",
+ "16,d1,16.0,16,16,null,null",
+ "17,d1,17.0,17,17,null,null",
+ "18,d1,18.0,18,18,null,null",
+ "19,d1,19.0,19,19,null,null",
+ "20,d1,20.0,20,20,null,null",
+ "21,d1,null,null,21,true,null",
+ "22,d1,null,null,22,true,null",
+ "23,d1,230000.0,null,230000,false,null",
+ "24,d1,null,null,24,true,null",
+ "25,d1,null,null,25,true,null",
+ "26,d1,null,null,26,false,null",
+ "27,d1,null,null,27,false,null",
+ "28,d1,null,null,28,false,null",
+ "29,d1,null,null,29,false,null",
+ "30,d1,null,null,30,false,null",
+ "31,d1,null,31,null,null,aligned_test31",
+ "32,d1,null,32,null,null,aligned_test32",
+ "33,d1,null,33,null,null,aligned_test33",
+ "34,d1,null,34,null,null,aligned_test34",
+ "35,d1,null,35,null,null,aligned_test35",
+ "36,d1,null,36,null,null,aligned_test36",
+ "37,d1,null,37,null,null,aligned_test37",
+ "38,d1,null,38,null,null,aligned_test38",
+ "39,d1,null,39,null,null,aligned_test39",
+ "40,d1,null,40,null,null,aligned_test40",
+ "1,d2,1.0,1,1,true,non_aligned_test1",
+ "2,d2,2.0,2,2,null,non_aligned_test2",
+ "3,d2,3.0,null,3,false,non_aligned_test3",
+ "4,d2,4.0,4,null,true,non_aligned_test4",
+ "5,d2,5.0,5,null,true,non_aligned_test5",
+ "6,d2,6.0,6,6,true,null",
+ "7,d2,7.0,7,7,false,non_aligned_test7",
+ "8,d2,8.0,8,8,null,non_aligned_test8",
+ "9,d2,9.0,9,9,false,non_aligned_test9",
+ "10,d2,null,10,10,true,non_aligned_test10",
+ "11,d2,11.0,11,11,null,null",
+ "12,d2,12.0,12,12,null,null",
+ "13,d2,13.0,13,13,null,null",
+ "14,d2,14.0,14,14,null,null",
+ "15,d2,15.0,15,15,null,null",
+ "16,d2,16.0,16,16,null,null",
+ "17,d2,17.0,17,17,null,null",
+ "18,d2,18.0,18,18,null,null",
+ "19,d2,19.0,19,19,null,null",
+ "20,d2,20.0,20,20,null,null",
+ "21,d2,null,null,21,true,null",
+ "22,d2,null,null,22,true,null",
+ "23,d2,null,null,23,true,null",
+ "24,d2,null,null,24,true,null",
+ "25,d2,null,null,25,true,null",
+ "26,d2,null,null,26,false,null",
+ "27,d2,null,null,27,false,null",
+ "28,d2,null,null,28,false,null",
+ "29,d2,null,null,29,false,null",
+ "30,d2,null,null,30,false,null",
+ "31,d2,null,31,null,null,non_aligned_test31",
+ "32,d2,null,32,null,null,non_aligned_test32",
+ "33,d2,null,33,null,null,non_aligned_test33",
+ "34,d2,null,34,null,null,non_aligned_test34",
+ "35,d2,null,35,null,null,non_aligned_test35",
+ "36,d2,null,36,null,null,non_aligned_test36",
+ "37,d2,null,37,null,null,non_aligned_test37",
+ "38,d2,null,38,null,null,non_aligned_test38",
+ "39,d2,null,39,null,null,non_aligned_test39",
+ "40,d2,null,40,null,null,non_aligned_test40",
+ };
+
+ String[] columnNames = {"device", "s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,device,s1,s2,s3,s4,s5 from table0 order by device, time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithTimeFilterAlignByDeviceTest() {
+ String[] retArray =
+ new String[] {
+ "9,d1,9.0,9,9,false,aligned_test9",
+ "10,d1,null,10,10,true,aligned_test10",
+ "11,d1,11.0,11,11,null,null",
+ "12,d1,12.0,12,12,null,null",
+ "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+ "14,d1,14.0,14,14,null,null",
+ "15,d1,15.0,15,15,null,null",
+ "16,d1,16.0,16,16,null,null",
+ "17,d1,17.0,17,17,null,null",
+ "18,d1,18.0,18,18,null,null",
+ "19,d1,19.0,19,19,null,null",
+ "20,d1,20.0,20,20,null,null",
+ "21,d1,null,null,21,true,null",
+ "22,d1,null,null,22,true,null",
+ "23,d1,230000.0,null,230000,false,null",
+ "24,d1,null,null,24,true,null",
+ "25,d1,null,null,25,true,null",
+ "26,d1,null,null,26,false,null",
+ "27,d1,null,null,27,false,null",
+ "28,d1,null,null,28,false,null",
+ "29,d1,null,null,29,false,null",
+ "30,d1,null,null,30,false,null",
+ "31,d1,null,31,null,null,aligned_test31",
+ "32,d1,null,32,null,null,aligned_test32",
+ "33,d1,null,33,null,null,aligned_test33",
+ };
+
+ String[] columnNames = {"device", "s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,device,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithoutValueFilterAlignByDeviceTest1() {
+ String[] retArray =
+ new String[] {
+ "1,d1,1.0,true,aligned_test1",
+ "2,d1,2.0,null,aligned_test2",
+ "3,d1,30000.0,true,aligned_unseq_test3",
+ "4,d1,4.0,true,aligned_test4",
+ "5,d1,5.0,true,aligned_test5",
+ "6,d1,6.0,true,null",
+ "7,d1,7.0,false,aligned_test7",
+ "8,d1,8.0,null,aligned_test8",
+ "9,d1,9.0,false,aligned_test9",
+ "10,d1,null,true,aligned_test10",
+ "11,d1,11.0,null,null",
+ "12,d1,12.0,null,null",
+ "13,d1,130000.0,true,aligned_unseq_test13",
+ "14,d1,14.0,null,null",
+ "15,d1,15.0,null,null",
+ "16,d1,16.0,null,null",
+ "17,d1,17.0,null,null",
+ "18,d1,18.0,null,null",
+ "19,d1,19.0,null,null",
+ "20,d1,20.0,null,null",
+ "21,d1,null,true,null",
+ "22,d1,null,true,null",
+ "23,d1,230000.0,false,null",
+ "24,d1,null,true,null",
+ "25,d1,null,true,null",
+ "26,d1,null,false,null",
+ "27,d1,null,false,null",
+ "28,d1,null,false,null",
+ "29,d1,null,false,null",
+ "30,d1,null,false,null",
+ "31,d1,null,null,aligned_test31",
+ "32,d1,null,null,aligned_test32",
+ "33,d1,null,null,aligned_test33",
+ "34,d1,null,null,aligned_test34",
+ "35,d1,null,null,aligned_test35",
+ "36,d1,null,null,aligned_test36",
+ "37,d1,null,null,aligned_test37",
+ "38,d1,null,null,aligned_test38",
+ "39,d1,null,null,aligned_test39",
+ "40,d1,null,null,aligned_test40",
+ };
+
+ String[] columnNames = {"device", "s1", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select Time,device,s1,s4,s5 from table0 where device='d1'")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithoutValueFilterAlignByDeviceTest2() {
+ String[] retArray =
+ new String[] {
+ "1,d1,1.0,true",
+ "2,d1,2.0,null",
+ "3,d1,30000.0,true",
+ "4,d1,4.0,true",
+ "5,d1,5.0,true",
+ "6,d1,6.0,true",
+ "7,d1,7.0,false",
+ "8,d1,8.0,null",
+ "9,d1,9.0,false",
+ "10,d1,null,true",
+ "11,d1,11.0,null",
+ "12,d1,12.0,null",
+ "13,d1,130000.0,true",
+ "14,d1,14.0,null",
+ "15,d1,15.0,null",
+ "16,d1,16.0,null",
+ "17,d1,17.0,null",
+ "18,d1,18.0,null",
+ "19,d1,19.0,null",
+ "20,d1,20.0,null",
+ "21,d1,null,true",
+ "22,d1,null,true",
+ "23,d1,230000.0,false",
+ "24,d1,null,true",
+ "25,d1,null,true",
+ "26,d1,null,false",
+ "27,d1,null,false",
+ "28,d1,null,false",
+ "29,d1,null,false",
+ "30,d1,null,false",
+ };
+
+ String[] columnNames = {"Device", "s1", "s4"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery("select Time,Device,s1,s4 from table0 where device='d1'")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithTimeFilterAlignByDeviceTest() {
+ String[] retArray =
+ new String[] {
+ "16,d1,16.0,null,null",
+ "17,d1,17.0,null,null",
+ "18,d1,18.0,null,null",
+ "19,d1,19.0,null,null",
+ "20,d1,20.0,null,null",
+ "21,d1,null,true,null",
+ "22,d1,null,true,null",
+ "23,d1,230000.0,false,null",
+ "24,d1,null,true,null",
+ "25,d1,null,true,null",
+ "26,d1,null,false,null",
+ "27,d1,null,false,null",
+ "28,d1,null,false,null",
+ "29,d1,null,false,null",
+ "30,d1,null,false,null",
+ "31,d1,null,null,aligned_test31",
+ "32,d1,null,null,aligned_test32",
+ "33,d1,null,null,aligned_test33",
+ "34,d1,null,null,aligned_test34",
+ };
+
+ String[] columnNames = {"Device", "s1", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,Device,s1,s4,s5 from table0 where device='d1' and time >= 16 and time <= 34 order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithValueFilterAlignByDeviceTest1() {
+ String[] retArray =
+ new String[] {
+ "1,d1,1.0,1,1,true,aligned_test1",
+ "3,d1,30000.0,null,30000,true,aligned_unseq_test3",
+ "4,d1,4.0,4,null,true,aligned_test4",
+ "5,d1,5.0,5,null,true,aligned_test5",
+ "6,d1,6.0,6,6,true,null",
+ "10,d1,null,10,10,true,aligned_test10",
+ "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+ "21,d1,null,null,21,true,null",
+ "22,d1,null,null,22,true,null",
+ "24,d1,null,null,24,true,null",
+ "25,d1,null,null,25,true,null",
+ };
+
+ String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,Device,s1,s2,s3,s4,s5 from table0 where device='d1' and s4 = true order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithValueFilterAlignByDeviceTest2() {
+ String[] retArray =
+ new String[] {
+ "12,d1,12.0,12,12,null,null",
+ "14,d1,14.0,14,14,null,null",
+ "15,d1,15.0,15,15,null,null",
+ "16,d1,16.0,16,16,null,null",
+ "17,d1,17.0,17,17,null,null",
+ "18,d1,18.0,18,18,null,null",
+ "19,d1,19.0,19,19,null,null",
+ "20,d1,20.0,20,20,null,null",
+ };
+
+ String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,Device,s1,s2,s3,s4,s5 from table0 where device='d1' and s1 > 11.0 and s2 <= 33 order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectAllAlignedWithTimeAndValueFilterAlignByDeviceTest1() {
+ String[] retArray =
+ new String[] {
+ "9,d1,9.0,9,9,false,aligned_test9",
+ "11,d1,11.0,11,11,null,null",
+ "12,d1,12.0,12,12,null,null",
+ "14,d1,14.0,14,14,null,null",
+ "15,d1,15.0,15,15,null,null",
+ "16,d1,16.0,16,16,null,null",
+ "17,d1,17.0,17,17,null,null",
+ "18,d1,18.0,18,18,null,null",
+ };
+
+ String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,Device,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 and s1 < 19.0 order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithValueFilterAlignByDeviceTest1() {
+ String[] retArray =
+ new String[] {
+ "1,d1,1.0,true,aligned_test1",
+ "2,d1,2.0,null,aligned_test2",
+ "4,d1,4.0,true,aligned_test4",
+ "5,d1,5.0,true,aligned_test5",
+ "6,d1,6.0,true,null",
+ "7,d1,7.0,false,aligned_test7",
+ "8,d1,8.0,null,aligned_test8",
+ "9,d1,9.0,false,aligned_test9",
+ "11,d1,11.0,null,null",
+ "12,d1,12.0,null,null",
+ "14,d1,14.0,null,null",
+ "15,d1,15.0,null,null",
+ "16,d1,16.0,null,null",
+ "34,d1,null,null,aligned_test34",
+ };
+
+ String[] columnNames = {"Device", "s1", "s4", "s5"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,Device,s1,s4,s5 from table0 where device='d1' and s1 < 17.0 or s5 = 'aligned_test34' order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void selectSomeAlignedWithValueFilterAlignByDeviceTest2() {
+ String[] retArray =
+ new String[] {
+ "7,d1,7.0,false", "9,d1,9.0,false",
+ };
+
+ String[] columnNames = {"Device", "s1", "s4"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select Time,Device,s1,s4 from table0 where device='d1' and s1 < 19.0 and s4 = false order by time")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(resultSet.getLong(1));
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(",").append(resultSet.getString(index));
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAllAlignedWithoutTimeFilterAlignByDeviceTest() {
+ String[] retArray = new String[] {"d1", "20", "29", "28", "19", "20"};
+ String[] columnNames = {
+ "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+ };
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(*) from d1 align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAllAlignedAndNonAlignedWithoutTimeFilterAlignByDeviceTest() {
+ String[] retArray = new String[] {"d1,20,29,28,19,20,", "d2,19,29,28,18,19,"};
+ String[] columnNames = {
+ "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+ };
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(*) from root.sg1.* align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+ for (String columnName : columnNames) {
+ int index = map.get(columnName);
+ builder.append(resultSet.getString(index)).append(",");
+ }
+ assertEquals(retArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAllAlignedWithTimeFilterAlignByDeviceTest() {
+ String[] retArray = new String[] {"d1", "12", "15", "22", "13", "6"};
+ String[] columnNames = {
+ "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+ };
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(*) from d1 where time >= 9 and time <= 33 align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ /** aggregate multi columns of aligned timeseries in one SQL */
+ @Ignore
+ @Test
+ public void aggregateSomeAlignedWithoutTimeFilterAlignByDeviceTest() {
+ double[] retArray =
+ new double[] {
+ 20, 29, 28, 390184, 130549, 390417, 19509.2, 4501.689655172413, 13943.464285714286
+ };
+ String[] columnNames = {
+ "Device",
+ "count(s1)",
+ "count(s2)",
+ "count(s3)",
+ "sum(s1)",
+ "sum(s2)",
+ "sum(s3)",
+ "avg(s1)",
+ "avg(s2)",
+ "avg(s3)",
+ };
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1),count(s2),count(s3),sum(s1),sum(s2),sum(s3),avg(s1),avg(s2),avg(s3) from d1 align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ double[] ans = new double[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 1; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i - 1] = Double.parseDouble(resultSet.getString(index));
+ assertEquals(retArray[i - 1], ans[i - 1], DELTA);
+ }
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAlignedWithValueFilterAlignByDeviceTest() {
+ String[] retArray = new String[] {"d1", "11"};
+ String[] columnNames = {"Device", "count(s4)"};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(s4) from d1 where s4 = true align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void aggregationFuncAlignedWithValueFilterAlignByDeviceTest() {
+ String[] retArray =
+ new String[] {"d1", "8", "42.0", "5.25", "1.0", "9.0", "1", "9", "1.0", "9.0"};
+ String[] columnNames = {
+ "Device",
+ "count(s1)",
+ "sum(s1)",
+ "avg(s1)",
+ "first_value(s1)",
+ "last_value(s1)",
+ "min_time(s1)",
+ "max_time(s1)",
+ "min_value(s1)",
+ "max_value(s1)",
+ };
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s1), avg(s1), "
+ + "first_value(s1), last_value(s1), "
+ + "min_time(s1), max_time(s1),"
+ + "max_value(s1), min_value(s1) from d1 where s1 < 10 "
+ + "align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countAllAlignedWithValueFilterAlignByDeviceTest() {
+ String[] retArray = new String[] {"d1", "6", "6", "9", "11", "6"};
+ String[] columnNames = {
+ "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+ };
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery("select count(*) from d1 where s4 = true " + "align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void aggregationAllAlignedWithValueFilterAlignByDeviceTest() {
+ String[] retArray = new String[] {"d1", "160016.0", "11", "1", "13"};
+ String[] columnNames = {
+ "Device", "sum(s1)", "count(s4)", "min_value(s3)", "max_time(s2)",
+ };
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select sum(s1), count(s4), min_value(s3), max_time(s2) from d1 where s4 = true "
+ + "align by device")) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ map.put(resultSetMetaData.getColumnName(i), i);
+ }
+ assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+ int cnt = 0;
+ while (resultSet.next()) {
+ String[] ans = new String[columnNames.length];
+ // No need to add time column for aggregation query
+ for (int i = 0; i < columnNames.length; i++) {
+ String columnName = columnNames[i];
+ int index = map.get(columnName);
+ ans[i] = resultSet.getString(index);
+ }
+ assertArrayEquals(retArray, ans);
+ cnt++;
+ }
+ assertEquals(1, cnt);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countSumAvgGroupByTimeAlignByDeviceTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,d1,4,40.0,7.5",
+ "11,d1,10,130142.0,13014.2",
+ "21,d1,1,null,230000.0",
+ "31,d1,0,355.0,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 10ms) align by device")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(ColumnHeaderConstant.DEVICE)
+ + ","
+ + resultSet.getString(count("s1"))
+ + ","
+ + resultSet.getString(sum("s2"))
+ + ","
+ + resultSet.getString(avg("s1"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void maxMinValueGroupByTimeAlignByDeviceTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,d1,10,6.0,10,6",
+ "11,d1,130000,11.0,20,11",
+ "21,d1,230000,230000.0,null,21",
+ "31,d1,null,null,40,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 10ms) align by device")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(ColumnHeaderConstant.DEVICE)
+ + ","
+ + resultSet.getString(maxValue("s3"))
+ + ","
+ + resultSet.getString(minValue("s1"))
+ + ","
+ + resultSet.getString(maxTime("s2"))
+ + ","
+ + resultSet.getString(minTime("s3"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void firstLastGroupByTimeAlignByDeviceTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,d1,null,null", "6,d1,true,aligned_test7",
+ "11,d1,true,aligned_unseq_test13", "16,d1,null,null",
+ "21,d1,true,null", "26,d1,false,null",
+ "31,d1,null,aligned_test31", "36,d1,null,aligned_test36"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(s4), first_value(s5) from d1 "
+ + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) align by device")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(ColumnHeaderConstant.DEVICE)
+ + ","
+ + resultSet.getString(lastValue("s4"))
+ + ","
+ + resultSet.getString(firstValue("s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void groupByWithWildcardAlignByDeviceTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,d1,9,9,8,8,9,9.0,10,10,true,aligned_test10",
+ "11,d1,10,10,10,1,1,20.0,20,20,true,aligned_unseq_test13",
+ "21,d1,1,0,10,10,0,230000.0,null,30,false,null",
+ "31,d1,0,10,0,0,10,null,40,null,null,aligned_test40"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(*), last_value(*) from d1 GROUP BY ([1, 41), 10ms) align by device")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(ColumnHeaderConstant.DEVICE)
+ + ","
+ + resultSet.getString(count("s1"))
+ + ","
+ + resultSet.getString(count("s2"))
+ + ","
+ + resultSet.getString(count("s3"))
+ + ","
+ + resultSet.getString(count("s4"))
+ + ","
+ + resultSet.getString(count("s5"))
+ + ","
+ + resultSet.getString(lastValue("s1"))
+ + ","
+ + resultSet.getString(lastValue("s2"))
+ + ","
+ + resultSet.getString(lastValue("s3"))
+ + ","
+ + resultSet.getString(lastValue("s4"))
+ + ","
+ + resultSet.getString(lastValue("s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void groupByWithNonAlignedTimeseriesAlignByDeviceTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,d1,0,null,null",
+ "7,d1,3,34.0,8.0",
+ "13,d1,4,130045.0,32511.25",
+ "19,d1,2,39.0,19.5",
+ "25,d1,0,null,null",
+ "31,d1,0,130.0,null",
+ "37,d1,0,154.0,null",
+ "1,d2,0,null,null",
+ "7,d2,3,34.0,8.0",
+ "13,d2,4,58.0,14.5",
+ "19,d2,2,39.0,19.5",
+ "25,d2,0,null,null",
+ "31,d2,0,130.0,null",
+ "37,d2,0,154.0,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from root.sg1.* "
+ + "where time > 5 GROUP BY ([1, 41), 4ms, 6ms) align by device")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(ColumnHeaderConstant.DEVICE)
+ + ","
+ + resultSet.getString(count("s1"))
+ + ","
+ + resultSet.getString(sum("s2"))
+ + ","
+ + resultSet.getString(avg("s1"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countSumAvgPreviousFillAlignByDeviceTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,d1,4,40.0,7.5",
+ "11,d1,10,130142.0,13014.2",
+ "21,d1,1,130142.0,230000.0",
+ "31,d1,0,355.0,230000.0"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 10ms) FILL (previous) align by device")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(ColumnHeaderConstant.DEVICE)
+ + ","
+ + resultSet.getString(count("s1"))
+ + ","
+ + resultSet.getString(sum("s2"))
+ + ","
+ + resultSet.getString(avg("s1"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countSumAvgValueFillAlignByDeviceTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,d1,1,3.0,30000.0",
+ "6,d1,4,40.0,7.5",
+ "11,d1,5,130052.0,26010.4",
+ "16,d1,5,90.0,18.0",
+ "21,d1,1,3.0,230000.0",
+ "26,d1,0,3.0,3.0",
+ "31,d1,0,3.0,3.0"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + "where s3 > 5 and time < 30 GROUP BY ([1, 36), 5ms) FILL (3) align by device")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(ColumnHeaderConstant.DEVICE)
+ + ","
+ + resultSet.getString(count("s1"))
+ + ","
+ + resultSet.getString(sum("s2"))
+ + ","
+ + resultSet.getString(avg("s1"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+ }
+ }
+
+ // --------------------------GroupByWithoutValueFilter--------------------------
+ @Ignore
+ @Test
+ public void countSumAvgGroupByTest1() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,4,40.0,7.5", "11,10,130142.0,13014.2", "21,1,null,230000.0", "31,0,355.0,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 10ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d1.s1"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + " where time > 5 GROUP BY ([1, 41), 10ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d1.s1"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countSumAvgGroupByTest2() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,0,null,null", "6,4,40.0,7.5", "11,5,130052.0,26010.4", "16,5,90.0,18.0",
+ "21,1,null,230000.0", "26,0,null,null", "31,0,165.0,null", "36,0,73.0,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d1.s1"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + " where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d1.s1"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countSumAvgGroupByWithSlidingStepTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,0,null,null",
+ "7,3,34.0,8.0",
+ "13,4,130045.0,32511.25",
+ "19,2,39.0,19.5",
+ "25,0,null,null",
+ "31,0,130.0,null",
+ "37,0,154.0,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 4ms, 6ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d1.s1"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + " where time > 5 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d1.s1"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void countSumAvgGroupByWithNonAlignedTimeseriesTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,0,null,null,0,null,null",
+ "7,3,34.0,8.0,4,34.0,8.5",
+ "13,4,58.0,14.5,4,130045.0,14.5",
+ "19,2,39.0,19.5,4,39.0,20.5",
+ "25,0,null,null,4,null,26.5",
+ "31,0,130.0,null,0,130.0,null",
+ "37,0,154.0,null,0,154.0,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(d1.s1), sum(d2.s2), avg(d2.s1), count(d1.s3), sum(d1.s2), avg(d2.s3) "
+ + "from root.sg1 where time > 5 GROUP BY ([1, 41), 4ms, 6ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d2.s2"))
+ + ","
+ + resultSet.getString(avg("d2.s1"))
+ + ","
+ + resultSet.getString(count("d1.s3"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d2.s3"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(d1.s1), sum(d2.s2), avg(d2.s1), count(d1.s3), sum(d1.s2), avg(d2.s3) "
+ + "from root.sg1 where time > 5 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(sum("d2.s2"))
+ + ","
+ + resultSet.getString(avg("d2.s1"))
+ + ","
+ + resultSet.getString(count("d1.s3"))
+ + ","
+ + resultSet.getString(sum("d1.s2"))
+ + ","
+ + resultSet.getString(avg("d2.s3"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void maxMinValueTimeGroupByTest1() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,10,6.0,10,6",
+ "11,130000,11.0,20,11",
+ "21,230000,230000.0,null,21",
+ "31,null,null,40,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 10ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+ + " where time > 5 GROUP BY ([1, 41), 10ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void maxMinValueTimeGroupByTest2() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,null,null,null,null",
+ "6,10,6.0,10,6",
+ "11,130000,11.0,15,11",
+ "16,20,16.0,20,16",
+ "21,230000,230000.0,null,21",
+ "26,30,null,null,26",
+ "31,null,null,35,null",
+ "36,null,null,37,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+ + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+ + " where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void maxMinValueTimeGroupByWithSlidingStepTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,null,null,null,null",
+ "7,10,7.0,10,7",
+ "13,130000,14.0,16,13",
+ "19,22,19.0,20,19",
+ "25,28,null,null,25",
+ "31,null,null,34,null",
+ "37,null,null,40,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 4ms, 6ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+ + " where time > 5 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void maxMinValueTimeGroupByWithNonAlignedTimeseriesTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,null,null,null,null,null,null,null,null",
+ "7,10,7.0,10,7,10,7.0,10,7",
+ "13,16,14.0,16,13,130000,13.0,16,13",
+ "19,22,19.0,20,19,22,19.0,20,19",
+ "25,28,null,null,25,28,null,null,25",
+ "31,null,null,34,null,null,null,34,null",
+ "37,null,null,37,null,null,null,37,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(d2.s3), min_value(d1.s1), max_time(d2.s2), min_time(d1.s3), "
+ + "max_value(d1.s3), min_value(d2.s1), max_time(d1.s2), min_time(d2.s3) "
+ + "from root.sg1 where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d2.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d2.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"))
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d2.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d2.s3"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select max_value(d2.s3), min_value(d1.s1), max_time(d2.s2), min_time(d1.s3), "
+ + "max_value(d1.s3), min_value(d2.s1), max_time(d1.s2), min_time(d2.s3) "
+ + "from root.sg1 where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(maxValue("d2.s3"))
+ + ","
+ + resultSet.getString(minValue("d1.s1"))
+ + ","
+ + resultSet.getString(maxTime("d2.s2"))
+ + ","
+ + resultSet.getString(minTime("d1.s3"))
+ + ","
+ + resultSet.getString(maxValue("d1.s3"))
+ + ","
+ + resultSet.getString(minValue("d2.s1"))
+ + ","
+ + resultSet.getString(maxTime("d1.s2"))
+ + ","
+ + resultSet.getString(minTime("d2.s3"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void firstLastGroupByTest1() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,true,aligned_test7",
+ "11,true,aligned_unseq_test13",
+ "21,false,null",
+ "31,null,aligned_test31"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(s4), first_value(s5) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 10ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(firstValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(s4), first_value(s5) from d1 "
+ + " where time > 5 GROUP BY ([1, 41), 10ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(firstValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void firstLastGroupByTest2() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,null,null", "6,true,aligned_test7", "11,true,aligned_unseq_test13", "16,null,null",
+ "21,true,null", "26,false,null", "31,null,aligned_test31", "36,null,aligned_test36"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(s4), first_value(s5) from d1 "
+ + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(firstValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(s4), first_value(s5) from d1 "
+ + " where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(firstValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void firstLastGroupByWithSlidingStepTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,null,null",
+ "7,true,aligned_test7",
+ "13,true,aligned_unseq_test13",
+ "19,true,null",
+ "25,false,null",
+ "31,null,aligned_test31",
+ "37,null,aligned_test37"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(s4), first_value(s5) from d1 "
+ + "where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(firstValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(s4), first_value(s5) from d1 "
+ + " where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(firstValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void firstLastGroupByWithNonAlignedTimeseriesTest() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,null,null,null,null",
+ "7,non_aligned_test10,false,aligned_test10,false",
+ "13,null,true,aligned_unseq_test13,null",
+ "19,null,true,null,true",
+ "25,null,true,null,true",
+ "31,non_aligned_test34,null,aligned_test34,null",
+ "37,non_aligned_test37,null,aligned_test37,null"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(d2.s5), first_value(d1.s4), last_value(d1.s5), first_value(d2.s4) "
+ + "from root.sg1 where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d2.s5"))
+ + ","
+ + resultSet.getString(firstValue("d1.s4"))
+ + ","
+ + resultSet.getString(lastValue("d1.s5"))
+ + ","
+ + resultSet.getString(firstValue("d2.s4"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(d2.s5), first_value(d1.s4), last_value(d1.s5), first_value(d2.s4) "
+ + "from root.sg1 where time > 5 and time < 38 "
+ + "GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d2.s5"))
+ + ","
+ + resultSet.getString(firstValue("d1.s4"))
+ + ","
+ + resultSet.getString(lastValue("d1.s5"))
+ + ","
+ + resultSet.getString(firstValue("d2.s4"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void groupByWithWildcardTest1() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,9,9,8,8,9,9.0,10,10,true,aligned_test10",
+ "11,10,10,10,1,1,20.0,20,20,true,aligned_unseq_test13",
+ "21,1,0,10,10,0,230000.0,null,30,false,null",
+ "31,0,10,0,0,10,null,40,null,null,aligned_test40"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(*), last_value(*) from d1 GROUP BY ([1, 41), 10ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(count("d1.s2"))
+ + ","
+ + resultSet.getString(count("d1.s3"))
+ + ","
+ + resultSet.getString(count("d1.s4"))
+ + ","
+ + resultSet.getString(count("d1.s5"))
+ + ","
+ + resultSet.getString(lastValue("d1.s1"))
+ + ","
+ + resultSet.getString(lastValue("d1.s2"))
+ + ","
+ + resultSet.getString(lastValue("d1.s3"))
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(lastValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(*), last_value(*) from d1 "
+ + "GROUP BY ([1, 41), 10ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(count("d1.s2"))
+ + ","
+ + resultSet.getString(count("d1.s3"))
+ + ","
+ + resultSet.getString(count("d1.s4"))
+ + ","
+ + resultSet.getString(count("d1.s5"))
+ + ","
+ + resultSet.getString(lastValue("d1.s1"))
+ + ","
+ + resultSet.getString(lastValue("d1.s2"))
+ + ","
+ + resultSet.getString(lastValue("d1.s3"))
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(lastValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void groupByWithWildcardTest2() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,0,0,0,0,0",
+ "5,2,2,2,2,1",
+ "9,2,3,3,2,2",
+ "13,3,3,3,1,1",
+ "17,3,3,3,0,0",
+ "21,1,0,3,3,0",
+ "25,0,0,3,3,0",
+ "29,0,1,2,2,1",
+ "33,0,3,0,0,3",
+ "37,0,1,0,0,1"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(*) from d1 "
+ + "where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(count("d1.s2"))
+ + ","
+ + resultSet.getString(count("d1.s3"))
+ + ","
+ + resultSet.getString(count("d1.s4"))
+ + ","
+ + resultSet.getString(count("d1.s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select count(*) from d1 "
+ + " where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("d1.s1"))
+ + ","
+ + resultSet.getString(count("d1.s2"))
+ + ","
+ + resultSet.getString(count("d1.s3"))
+ + ","
+ + resultSet.getString(count("d1.s4"))
+ + ","
+ + resultSet.getString(count("d1.s5"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void groupByWithWildcardTest3() throws SQLException {
+ String[] retArray =
+ new String[] {
+ "1,null,null,null,null,null",
+ "5,7.0,7,7,false,aligned_test7",
+ "9,11.0,11,11,true,aligned_test10",
+ "13,15.0,15,15,true,aligned_unseq_test13",
+ "17,19.0,19,19,null,null",
+ "21,230000.0,null,230000,false,null",
+ "25,null,null,27,false,null",
+ "29,null,31,30,false,aligned_test31",
+ "33,null,35,null,null,aligned_test35",
+ "37,null,37,null,null,aligned_test37"
+ };
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ int cnt;
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(*) from d1 "
+ + "where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms)")) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s1"))
+ + ","
+ + resultSet.getString(lastValue("d1.s2"))
+ + ","
+ + resultSet.getString(lastValue("d1.s3"))
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(lastValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray.length, cnt);
+ }
+
+ try (ResultSet resultSet =
+ statement.executeQuery(
+ "select last_value(*) from d1 "
+ + " where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms) order by time desc")) {
+ cnt = retArray.length;
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(lastValue("d1.s1"))
+ + ","
+ + resultSet.getString(lastValue("d1.s2"))
+ + ","
+ + resultSet.getString(lastValue("d1.s3"))
+ + ","
+ + resultSet.getString(lastValue("d1.s4"))
+ + ","
+ + resultSet.getString(lastValue("d1.s5"));
+ Assert.assertEquals(retArray[cnt - 1], ans);
+ cnt--;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Ignore
+ @Test
+ public void groupByWithoutAggregationFuncTest() {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ statement.executeQuery("select s1 from d1 group by ([0, 100), 5ms)");
+
+ fail("No expected exception thrown");
+ } catch (Exception e) {
+ Assert.assertTrue(
+ e.getMessage(),
+ e.getMessage()
+ .contains(
+ "Common queries and aggregated queries are not allowed to appear at the same time"));
+ }
+ }
+
+ @Ignore
+ @Test
+ public void negativeOrZeroTimeIntervalTest() {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ statement.executeQuery(
+ "select count(s1), sum(s2), avg(s1) from d1 "
+ + "where time > 5 GROUP BY ([1, 41), 0ms)");
+ fail();
+ } catch (Exception e) {
+ Assert.assertTrue(
+ e.getMessage(),
+ e.getMessage()
+ .contains("The second parameter time interval should be a positive integer."));
+ }
+ }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable2IT.java
similarity index 76%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable2IT.java
index f19a20779e9..3b0a379d9f3 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable2IT.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,13 +31,20 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBPredicatePushDownTable2IT extends IoTDBPredicatePushDownTableIT {
@BeforeClass
public static void setUp() throws Exception {
- EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3)
+ .setMaxNumberOfPointsInPage(2);
EnvFactory.getEnv().initClusterEnvironment();
- insertData();
+ TableUtils.insertData();
}
@AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable3IT.java
similarity index 74%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable3IT.java
index f19a20779e9..72d786abf6d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable3IT.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,17 +31,24 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBPredicatePushDownTable3IT extends IoTDBPredicatePushDownTableIT {
@BeforeClass
public static void setUp() throws Exception {
- EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3)
+ .setMaxNumberOfPointsInPage(3);
EnvFactory.getEnv().initClusterEnvironment();
- insertData();
+ TableUtils.insertData();
}
@AfterClass
- public static void tearDown() throws Exception {
+ public static void tearDown() {
EnvFactory.getEnv().cleanClusterEnvironment();
}
}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable4IT.java
similarity index 76%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable4IT.java
index f19a20779e9..590f0233625 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable4IT.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,13 +31,20 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBPredicatePushDownTable4IT extends IoTDBPredicatePushDownTableIT {
@BeforeClass
public static void setUp() throws Exception {
- EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3)
+ .setDegreeOfParallelism(4);
EnvFactory.getEnv().initClusterEnvironment();
- insertData();
+ TableUtils.insertData();
}
@AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTableIT.java
new file mode 100644
index 00000000000..f1f58cd41e5
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTableIT.java
@@ -0,0 +1,683 @@
+/*
+ * 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.relational.it.query.old.aligned;
+
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import static org.apache.iotdb.relational.it.query.old.aligned.TableUtils.tableResultSetEqualTest;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBPredicatePushDownTableIT {
+
+ private final String database = "db";
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ EnvFactory.getEnv()
+ .getConfig()
+ .getCommonConfig()
+ .setEnableSeqSpaceCompaction(false)
+ .setEnableUnseqSpaceCompaction(false)
+ .setEnableCrossSpaceCompaction(false)
+ .setMaxTsBlockLineNumber(3);
+ EnvFactory.getEnv().initClusterEnvironment();
+ TableUtils.insertData();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ EnvFactory.getEnv().cleanClusterEnvironment();
+ }
+
+ @Test
+ public void testAlignedRawDataAlignByTime1() {
+ String[] expectedHeader1 = new String[] {"Time", "s2", "s3"};
+ String[] retArray1 =
+ new String[] {
+ "10,10,10,",
+ "11,11,11,",
+ "12,12,12,",
+ "14,14,14,",
+ "15,15,15,",
+ "16,16,16,",
+ "17,17,17,",
+ "18,18,18,",
+ "19,19,19,",
+ "20,20,20,"
+ };
+ tableResultSetEqualTest(
+ "select Time,s2, s3 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30",
+ expectedHeader1,
+ retArray1,
+ database);
+
+ String[] expectedHeader2 = new String[] {"Time", "s3"};
+ String[] retArray2 =
+ new String[] {
+ "10,10,", "11,11,", "12,12,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,", "19,19,",
+ "20,20,"
+ };
+ tableResultSetEqualTest(
+ "select Time,s3 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30",
+ expectedHeader2,
+ retArray2,
+ database);
+
+ String[] expectedHeader3 = new String[] {"Time", "s2"};
+ String[] retArray3 =
+ new String[] {
+ "10,10,", "11,11,", "12,12,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,", "19,19,",
+ "20,20,"
+ };
+ tableResultSetEqualTest(
+ "select Time,s2 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30",
+ expectedHeader3,
+ retArray3,
+ database);
+
+ String[] expectedHeader4 = new String[] {"Time", "s2"};
+ String[] retArray4 = new String[] {"14,14,", "15,15,"};
+ tableResultSetEqualTest(
+ "select Time,s2 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30 offset 3 limit 2",
+ expectedHeader4,
+ retArray4,
+ database);
+ }
+
+ // TODO fix it
+ @Test
+ public void testAlignedRawDataAlignByTime2() {
+ String[] expectedHeader1 = new String[] {"Time", "s2", "_col2"};
+ String[] retArray1 =
+ new String[] {
+ "3,null,30001.0,",
+ "13,130000,130001.0,",
+ "16,16,17.0,",
+ "17,17,18.0,",
+ "18,18,19.0,",
+ "19,19,20.0,",
+ "20,20,21.0,",
+ "21,null,22.0,",
+ "22,null,23.0,",
+ "23,null,230001.0,",
+ "24,null,25.0,",
+ "25,null,26.0,",
+ "26,null,27.0,",
+ "27,null,28.0,",
+ "28,null,29.0,",
+ "29,null,30.0,",
+ "30,null,31.0,",
+ };
+ tableResultSetEqualTest(
+ "select Time,s2, s3 + 1 from table0 where device='d1' and s3 + 1 > 16",
+ expectedHeader1,
+ retArray1,
+ database);
+
+ String[] expectedHeader2 = new String[] {"Time", "s2"};
+ String[] retArray2 =
+ new String[] {
+ "3,null,",
+ "13,130000,",
+ "16,16,",
+ "17,17,",
+ "18,18,",
+ "19,19,",
+ "20,20,",
+ "21,null,",
+ "22,null,",
+ "23,null,",
+ "24,null,",
+ "25,null,",
+ "26,null,",
+ "27,null,",
+ "28,null,",
+ "29,null,",
+ "30,null,",
+ };
+ tableResultSetEqualTest(
+ "select Time,s2 from table0 where device='d1' and s3 + 1 > 16",
+ expectedHeader2,
+ retArray2,
+ database);
+
+ String[] expectedHeader3 = new String[] {"Time", "s3"};
+ String[] retArray3 =
+ new String[] {
+ "3,30000,",
+ "13,130000,",
+ "16,16,",
+ "17,17,",
+ "18,18,",
+ "19,19,",
+ "20,20,",
+ "21,21,",
+ "22,22,",
+ "23,230000,",
+ "24,24,",
+ "25,25,",
+ "26,26,",
+ "27,27,",
+ "28,28,",
+ "29,29,",
+ "30,30,",
+ };
+ tableResultSetEqualTest(
+ "select Time,s3 from table0 where device='d1' and s3 + 1 > 16",
+ expectedHeader3,
+ retArray3,
+ database);
+
+ String[] expectedHeader4 = new String[] {"Time", "s3"};
+ String[] retArray4 = new String[] {"3,30000,", "13,130000,", "16,16,"};
+ tableResultSetEqualTest(
+ "select Time,s3 from table0 where device='d1' and s3 + 1 > 16 limit 3",
+ expectedHeader4,
+ retArray4,
+ database);
+ }
+
+ @Test
+ public void testNonAlignedRawDataAlignByTime1() {
+ String[] expectedHeader1 = new String[] {"Time", "s2", "s3"};
+ String[] retArray1 =
+ new String[] {
+ "10,10,10,",
+ "11,11,11,",
+ "12,12,12,",
+ "13,13,13,",
+ "14,14,14,",
+ "15,15,15,",
+ "16,16,16,",
+ "17,17,17,",
+ "18,18,18,",
+ "19,19,19,",
+ "20,20,20,"
+ };
+ tableResultSetEqualTest(
+ "select Time,s2, s3 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30",
+ expectedHeader1,
+ retArray1,
+ database);
+
+ String[] expectedHeader2 = new String[] {"Time", "s3"};
+ String[] retArray2 =
+ new String[] {
+ "10,10,", "11,11,", "12,12,", "13,13,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,",
+ "19,19,", "20,20,"
+ };
+ tableResultSetEqualTest(
+ "select Time,s3 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30",
+ expectedHeader2,
+ retArray2,
+ database);
+
+ String[] expectedHeader3 = new String[] {"Time", "s2"};
+ String[] retArray3 =
+ new String[] {
+ "10,10,", "11,11,", "12,12,", "13,13,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,",
+ "19,19,", "20,20,"
+ };
+ tableResultSetEqualTest(
+ "select Time,s2 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30",
+ expectedHeader3,
+ retArray3,
+ database);
+
+ String[] expectedHeader4 = new String[] {"Time", "s2"};
+ String[] retArray4 = new String[] {"12,12,", "13,13,", "14,14,"};
+ tableResultSetEqualTest(
+ "select Time,s2 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30 offset 2 limit 3",
+ expectedHeader4,
+ retArray4,
+ database);
+ }
+
+ @Test
+ public void testNonAlignedRawDataAlignByTime2() {
+ String[] expectedHeader1 = new String[] {"Time", "s2", "s3"};
+ String[] retArray1 =
+ new String[] {
+ "16,16,16,",
+ "17,17,17,",
+ "18,18,18,",
+ "19,19,19,",
+ "20,20,20,",
+ "21,null,21,",
+ "22,null,22,",
+ "23,null,23,",
+ "24,null,24,",
+ "25,null,25,",
+ "26,null,26,",
+ "27,null,27,",
+ "28,null,28,",
+ "29,null,29,",
+ "30,null,30,",
+ };
+ tableResultSetEqualTest(
+ "select Time,s2, s3 from table0 where device='d2' and s3 + 1 > 16",
+ expectedHeader1,
+ retArray1,
+ database);
+
+ String[] expectedHeader2 = new String[] {"Time", "s2"};
+ String[] retArray2 =
+ new String[] {
+ "16,16,",
+ "17,17,",
+ "18,18,",
+ "19,19,",
+ "20,20,",
+ "21,null,",
+ "22,null,",
+ "23,null,",
+ "24,null,",
+ "25,null,",
+ "26,null,",
+ "27,null,",
+ "28,null,",
+ "29,null,",
+ "30,null,",
+ };
+ tableResultSetEqualTest(
+ "select Time,s2 from table0 where device='d2' and s3 + 1 > 16",
+ expectedHeader2,
+ retArray2,
+ database);
+
+ String[] expectedHeader3 = new String[] {"Time", "s3"};
+ String[] retArray3 =
+ new String[] {
+ "16,16,", "17,17,", "18,18,", "19,19,", "20,20,", "21,21,", "22,22,", "23,23,", "24,24,",
+ "25,25,", "26,26,", "27,27,", "28,28,", "29,29,", "30,30,",
+ };
+ tableResultSetEqualTest(
+ "select Time,s3 from table0 where device='d2' and s3 + 1 > 16",
+ expectedHeader3,
+ retArray3,
+ database);
+
+ String[] expectedHeader4 = new String[] {"Time", "s3"};
+ String[] retArray4 =
+ new String[] {
+ "26,26,", "27,27,", "28,28,", "29,29,", "30,30,",
+ };
+ tableResultSetEqualTest(
+ "select Time,s3 from table0 where device='d2' and s3 + 1 > 16 offset 10",
+ expectedHeader4,
+ retArray4,
+ database);
+ }
+
+ @Ignore
+ @Test
+ public void testAlignedAggregationAlignByTime1() {
+ String[] expectedHeader1 = new String[] {"count(d1.s2),count(d1.s3),"};
+ String[] retArray1 =
+ new String[] {
+ "10,10,",
+ };
+ tableResultSetEqualTest(
+ "select count(s2), count(s3) from d1 where s2 - 1 >= 9 and s2 < 30",
+ expectedHeader1,
+ retArray1,
+ database);
+
+ String[] expectedHeader2 = new String[] {"count(d1.s3),"};
+ String[] retArray2 = new String[] {"10,"};
+ tableResultSetEqualTest(
+ "select count(s3) from d1 where s2 - 1 >= 9 and s2 < 30",
+ expectedHeader2,
+ retArray2,
+ database);
+
+ String[] expectedHeader3 = new String[] {"count(d1.s2),"};
+ String[] retArray3 =
+ new String[] {
+ "10,",
+ };
+ tableResultSetEqualTest(
+ "select count(s2) from d1 where s2 - 1 >= 9 and s2 < 30",
+ expectedHeader3,
+ retArray3,
+ database);
+ }
+
+ // @Ignore
+ // @Test
+ // public void testAlignedAggregationAlignByTime2() {
+ // String[] expectedHeader1 = new String[]{"count(d1.s2),count(d1.s3 + 1),"};
+ // String[] retArray1 =
+ // new String[] {
+ // "6,17,",
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s2), count(s3 + 1) from d1 where s3 + 1 > 16",
+ // expectedHeader1,
+ // retArray1, database);
+ //
+ // String[] expectedHeader2 = "count(d1.s2),";
+ // String[] retArray2 =
+ // new String[] {
+ // "6,",
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s2) from d1 where s3 + 1 > 16", expectedHeader2, retArray2, database);
+ //
+ // String[] expectedHeader3 = "count(d1.s3),";
+ // String[] retArray3 =
+ // new String[] {
+ // "17,",
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s3) from d1 where s3 + 1 > 16", expectedHeader3, retArray3, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testNonAlignedAggregationAlignByTime1() {
+ // String[] expectedHeader1 = "count(d2.s2),count(d2.s3),";
+ // String[] retArray1 = new String[] {"11,11,"};
+ // tableResultSetEqualTest(
+ // "select count(s2), count(s3) from d2 where s2 - 1 >= 9 and s2 < 30",
+ // expectedHeader1,
+ // retArray1, database);
+ //
+ // String[] expectedHeader2 = "count(d2.s3),";
+ // String[] retArray2 = new String[] {"11,"};
+ // tableResultSetEqualTest(
+ // "select count(s3) from d2 where s2 - 1 >= 9 and s2 < 30",
+ // expectedHeader2,
+ // retArray2, database);
+ //
+ // String[] expectedHeader3 = "count(d2.s2),";
+ // String[] retArray3 = new String[] {"11,"};
+ // tableResultSetEqualTest(
+ // "select count(s2) from d2 where s2 - 1 >= 9 and s2 < 30",
+ // expectedHeader3,
+ // retArray3, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testNonAlignedAggregationAlignByTime2() {
+ // String[] expectedHeader1 = "count(d2.s2),count(d2.s3),";
+ // String[] retArray1 =
+ // new String[] {
+ // "5,15,",
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s2), count(s3) from d2 where s3 + 1 > 16",
+ // expectedHeader1,
+ // retArray1, database);
+ //
+ // String[] expectedHeader2 = "count(d2.s2),";
+ // String[] retArray2 =
+ // new String[] {
+ // "5,",
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s2) from d2 where s3 + 1 > 16", expectedHeader2, retArray2, database);
+ //
+ // String[] expectedHeader3 = "count(d2.s3),";
+ // String[] retArray3 =
+ // new String[] {
+ // "15,",
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s3) from d2 where s3 + 1 > 16", expectedHeader3, retArray3, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testMixAggregationAlignByTime() {
+ // String[] expectedHeader1 =
+ // "count(d1.s2),count(d2.s2),count(d1.s3),count(d2.s3),";
+ // String[] retArray1 =
+ // new String[] {
+ // "10,10,10,10,",
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s2), count(s3) from d1, d2 where s2 - 1 >= 9 and s2 < 30",
+ // expectedHeader1,
+ // retArray1, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testAlignedGroupByTimeAlignByTime1() {
+ // String[] expectedHeader = "Time,count(d1.s2),sum(d1.s3),";
+ // String[] retArray = new String[] {"1,1,10.0,", "11,9,142.0,", "21,0,null,", "31,0,null,"};
+ // tableResultSetEqualTest(
+ // "select count(s2), sum(s3) from d1 where s2 - 1 >= 9 and s2 < 30 group by ([1, 41),
+ // 10ms)",
+ // expectedHeader,
+ // retArray, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testAlignedGroupByTimeAlignByTime2() {
+ // String[] expectedHeader = "Time,count(d1.s2),sum(d1.s3),";
+ // String[] retArray =
+ // new String[] {"1,0,30000.0,", "11,6,130090.0,", "21,0,230232.0,", "31,0,null,"};
+ // tableResultSetEqualTest(
+ // "select count(s2), sum(s3) from d1 where s3 + 1 > 16 group by ([1, 41), 10ms)",
+ // expectedHeader,
+ // retArray, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testNonAlignedGroupByTimeAlignByTime1() {
+ // String[] expectedHeader = "Time,count(d2.s2),sum(d2.s3 + 1),";
+ // String[] retArray = new String[] {"1,1,11.0,", "11,10,165.0,", "21,0,null,", "31,0,null,"};
+ // tableResultSetEqualTest(
+ // "select count(s2), sum(s3 + 1) from d2 where s2 - 1 >= 9 and s2 < 30 group by ([1, 41),
+ // 10ms)",
+ // expectedHeader,
+ // retArray, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testNonAlignedGroupByTimeAlignByTime2() {
+ // String[] expectedHeader = "Time,count(d2.s2),sum(d2.s3),";
+ // String[] retArray = new String[] {"1,0,null,", "11,5,90.0,", "21,0,255.0,", "31,0,null,"};
+ // tableResultSetEqualTest(
+ // "select count(s2), sum(s3) from d2 where s3 + 1 > 16 group by ([1, 41), 10ms)",
+ // expectedHeader,
+ // retArray, database);
+ // }
+ //
+ // @Ignore
+ // @Test
+ // public void testMixGroupByTimeAlignByTime() {
+ // String[] expectedHeader =
+ // "Time,count(d1.s2),count(d2.s2),sum(d1.s3),sum(d2.s3),";
+ // String[] retArray =
+ // new String[] {
+ // "1,1,1,10.0,10.0,", "11,9,9,142.0,142.0,", "21,0,0,null,null,", "31,0,0,null,null,"
+ // };
+ // tableResultSetEqualTest(
+ // "select count(s2), sum(s3) from d1, d2 where s2 - 1 >= 9 and s2 < 30 group by ([1, 41),
+ // 10ms)",
+ // expectedHeader,
+ // retArray, database);
+ // }
+
+ @Test
+ public void testRawDataAlignByDevice1() {
+ String[] expectedHeader = new String[] {"Time", "Device", "s2", "s3"};
+ String[] retArray =
+ new String[] {
+ "10,d2,10,10,",
+ "11,d2,11,11,",
+ "12,d2,12,12,",
+ "13,d2,13,13,",
+ "14,d2,14,14,",
+ "15,d2,15,15,",
+ "16,d2,16,16,",
+ "17,d2,17,17,",
+ "18,d2,18,18,",
+ "19,d2,19,19,",
+ "20,d2,20,20,",
+ "10,d1,10,10,",
+ "11,d1,11,11,",
+ "12,d1,12,12,",
+ "14,d1,14,14,",
+ "15,d1,15,15,",
+ "16,d1,16,16,",
+ "17,d1,17,17,",
+ "18,d1,18,18,",
+ "19,d1,19,19,",
+ "20,d1,20,20,"
+ };
+ tableResultSetEqualTest(
+ "select Time, Device,s2, s3 from table0 where s2 - 1 >= 9 and s2 < 30 order by device desc",
+ expectedHeader,
+ retArray,
+ database);
+ }
+
+ @Test
+ public void testRawDataAlignByDevice2() {
+ String[] expectedHeader = new String[] {"Time", "Device", "s2", "_col3"};
+ String[] retArray =
+ new String[] {
+ "3,d1,null,30001.0,",
+ "13,d1,130000,130001.0,",
+ "16,d1,16,17.0,",
+ "17,d1,17,18.0,",
+ "18,d1,18,19.0,",
+ "19,d1,19,20.0,",
+ "20,d1,20,21.0,",
+ "21,d1,null,22.0,",
+ "22,d1,null,23.0,",
+ "23,d1,null,230001.0,",
+ "24,d1,null,25.0,",
+ "25,d1,null,26.0,",
+ "26,d1,null,27.0,",
+ "27,d1,null,28.0,",
+ "28,d1,null,29.0,",
+ "29,d1,null,30.0,",
+ "30,d1,null,31.0,",
+ "16,d2,16,17.0,",
+ "17,d2,17,18.0,",
+ "18,d2,18,19.0,",
+ "19,d2,19,20.0,",
+ "20,d2,20,21.0,",
+ "21,d2,null,22.0,",
+ "22,d2,null,23.0,",
+ "23,d2,null,24.0,",
+ "24,d2,null,25.0,",
+ "25,d2,null,26.0,",
+ "26,d2,null,27.0,",
+ "27,d2,null,28.0,",
+ "28,d2,null,29.0,",
+ "29,d2,null,30.0,",
+ "30,d2,null,31.0,",
+ };
+ tableResultSetEqualTest(
+ "select Time,Device,s2, s3 + 1 from table0 where s3 + 1 > 16 order by device",
+ expectedHeader,
+ retArray,
+ database);
+ }
+
+ @Ignore
+ @Test
+ public void testAggregationAlignByDevice1() {
+ String[] expectedHeader = new String[] {"Device,count(s2),sum(s3),"};
+ String[] retArray = new String[] {"d2,11,165.0,", "d1,10,152.0,"};
+ tableResultSetEqualTest(
+ "select count(s2), sum(s3) from d1, d2 where s2 - 1 >= 9 and s2 < 30 order by device desc align by device",
+ expectedHeader,
+ retArray,
+ database);
+ }
+
+ @Ignore
+ @Test
+ public void testAggregationAlignByDevice2() {
+ String[] expectedHeader = new String[] {"Device,count(s2),sum(s3 + 1),"};
+ String[] retArray = new String[] {"d1,6,390339.0,", "d2,5,360.0,"};
+ tableResultSetEqualTest(
+ "select count(s2), sum(s3 + 1) from d1, d2 where s3 + 1 > 16 align by device",
+ expectedHeader,
+ retArray,
+ database);
+ }
+
+ @Ignore
+ @Test
+ public void testGroupByTimeAlignByDevice1() {
+ String[] expectedHeader = new String[] {"Time,Device,count(s2),sum(s3),"};
+ String[] retArray =
+ new String[] {
+ "1,d2,1,10.0,",
+ "11,d2,10,155.0,",
+ "21,d2,0,null,",
+ "31,d2,0,null,",
+ "1,d1,1,10.0,",
+ "11,d1,9,142.0,",
+ "21,d1,0,null,",
+ "31,d1,0,null,"
+ };
+ tableResultSetEqualTest(
+ "select count(s2), sum(s3) from d1, d2 where s2 - 1 >= 9 and s2 < 30 group by ([1, 41), 10ms) order by device desc align by device",
+ expectedHeader,
+ retArray,
+ database);
+ }
+
+ @Ignore
+ @Test
+ public void testGroupByTimeAlignByDevice2() {
+ String[] expectedHeader = new String[] {"Time,Device,count(s2),sum(s3 + 1),"};
+ String[] retArray =
+ new String[] {
+ "1,d1,0,30001.0,",
+ "11,d1,6,130096.0,",
+ "21,d1,0,230242.0,",
+ "31,d1,0,null,",
+ "1,d2,0,null,",
+ "11,d2,5,95.0,",
+ "21,d2,0,265.0,",
+ "31,d2,0,null,"
+ };
+ tableResultSetEqualTest(
+ "select count(s2), sum(s3 + 1) from d1, d2 where s3 + 1 > 16 group by ([1, 41), 10ms) align by device",
+ expectedHeader,
+ retArray,
+ database);
+ }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/TableUtils.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/TableUtils.java
new file mode 100644
index 00000000000..eba1ba84fbe
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/TableUtils.java
@@ -0,0 +1,216 @@
+/*
+ * 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.relational.it.query.old.aligned;
+
+import org.apache.iotdb.isession.ISession;
+import org.apache.iotdb.isession.SessionConfig;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.itbase.env.BaseEnv;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+/**
+ * This class generates data for test cases in aligned time series scenarios.
+ *
+ * <p>You can comprehensively view the generated data in the following online doc:
+ *
+ * <p>https://docs.google.com/spreadsheets/d/1kfrSR1_paSd9B1Z0jnPBD3WQIMDslDuNm4R0mpWx9Ms/edit?usp=sharing
+ */
+public class TableUtils {
+
+ public static final String USE_DB = "use db";
+
+ private static final String[] sqls =
+ new String[] {
+ "CREATE DATABASE db",
+ "USE db",
+ "CREATE TABLE table0 (device string id, s1 FLOAT measurement, s2 INT32 measurement, s3 INT64 measurement, s4 BOOLEAN measurement, s5 TEXT measurement)",
+ "insert into table0(device, time, s1, s2, s3, s4, s5) values('d1', 1, 1.0, 1, 1, TRUE, 'aligned_test1')",
+ "insert into table0(device, time, s1, s2, s3, s5) values('d1', 2, 2.0, 2, 2, 'aligned_test2')",
+ "insert into table0(device, time, s1, s3, s4, s5) values('d1', 3, 3.0, 3, FALSE, 'aligned_test3')",
+ "insert into table0(device, time, s1, s2, s4, s5) values('d1', 4, 4.0, 4, TRUE, 'aligned_test4')",
+ "insert into table0(device, time, s1, s2, s4, s5) values('d1', 5, 5.0, 5, TRUE, 'aligned_test5')",
+ "insert into table0(device, time, s1, s2, s3, s4) values('d1', 6, 6.0, 6, 6, TRUE)",
+ "insert into table0(device, time, s1, s2, s3, s4, s5) values('d1',7, 7.0, 7, 7, FALSE, 'aligned_test7')",
+ "insert into table0(device, time, s1, s2, s3, s5) values('d1',8, 8.0, 8, 8, 'aligned_test8')",
+ "insert into table0(device, time, s1, s2, s3, s4, s5) values('d1',9, 9.0, 9, 9, FALSE, 'aligned_test9')",
+ "insert into table0(device, time, s2, s3, s4, s5) values('d1',10, 10, 10, TRUE, 'aligned_test10')",
+ "insert into table0(device, time, s1, s2, s3, s4, s5) values('d2',1, 1.0, 1, 1, TRUE, 'non_aligned_test1')",
+ "insert into table0(device, time, s1, s2, s3, s5) values('d2',2, 2.0, 2, 2, 'non_aligned_test2')",
+ "insert into table0(device, time, s1, s3, s4, s5) values('d2',3, 3.0, 3, FALSE, 'non_aligned_test3')",
+ "insert into table0(device, time, s1, s2, s4, s5) values('d2',4, 4.0, 4, TRUE, 'non_aligned_test4')",
+ "insert into table0(device, time, s1, s2, s4, s5) values('d2',5, 5.0, 5, TRUE, 'non_aligned_test5')",
+ "insert into table0(device, time, s1, s2, s3, s4) values('d2',6, 6.0, 6, 6, TRUE)",
+ "insert into table0(device, time, s1, s2, s3, s4, s5) values('d2',7, 7.0, 7, 7, FALSE, 'non_aligned_test7')",
+ "insert into table0(device, time, s1, s2, s3, s5) values('d2',8, 8.0, 8, 8, 'non_aligned_test8')",
+ "insert into table0(device, time, s1, s2, s3, s4, s5) values('d2',9, 9.0, 9, 9, FALSE, 'non_aligned_test9')",
+ "insert into table0(device, time, s2, s3, s4, s5) values('d2',10, 10, 10, TRUE, 'non_aligned_test10')",
+ "flush",
+ "insert into table0(device,time, s1, s3, s4, s5) values('d1',3, 30000.0, 30000, TRUE, 'aligned_unseq_test3')",
+ "insert into table0(device,time, s1, s2, s3) values('d1',11, 11.0, 11, 11)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',12, 12.0, 12, 12)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',13, 13.0, 13, 13)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',14, 14.0, 14, 14)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',15, 15.0, 15, 15)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',16, 16.0, 16, 16)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',17, 17.0, 17, 17)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',18, 18.0, 18, 18)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',19, 19.0, 19, 19)",
+ "insert into table0(device,time, s1, s2, s3) values('d1',20, 20.0, 20, 20)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',11, 11.0, 11, 11)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',12, 12.0, 12, 12)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',13, 13.0, 13, 13)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',14, 14.0, 14, 14)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',15, 15.0, 15, 15)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',16, 16.0, 16, 16)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',17, 17.0, 17, 17)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',18, 18.0, 18, 18)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',19, 19.0, 19, 19)",
+ "insert into table0(device,time, s1, s2, s3) values('d2',20, 20.0, 20, 20)",
+ "flush",
+ "insert into table0(device,time, s1, s2, s3, s4, s5) values('d1',13, 130000.0, 130000, 130000, TRUE, 'aligned_unseq_test13')",
+ "insert into table0(device,time, s3, s4) values('d1',21, 21, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d1',22, 22, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d1',23, 23, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d1',24, 24, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d1',25, 25, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d1',26, 26, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d1',27, 27, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d1',28, 28, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d1',29, 29, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d1',30, 30, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d2',21, 21, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d2',22, 22, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d2',23, 23, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d2',24, 24, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d2',25, 25, TRUE)",
+ "insert into table0(device,time, s3, s4) values('d2',26, 26, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d2',27, 27, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d2',28, 28, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d2',29, 29, FALSE)",
+ "insert into table0(device,time, s3, s4) values('d2',30, 30, FALSE)",
+ "flush",
+ "insert into table0(device,time, s1, s3, s4) values('d1',23, 230000.0, 230000, FALSE)",
+ "insert into table0(device,time, s2, s5) values('d1',31, 31, 'aligned_test31')",
+ "insert into table0(device,time, s2, s5) values('d1',32, 32, 'aligned_test32')",
+ "insert into table0(device,time, s2, s5) values('d1',33, 33, 'aligned_test33')",
+ "insert into table0(device,time, s2, s5) values('d1',34, 34, 'aligned_test34')",
+ "insert into table0(device,time, s2, s5) values('d1',35, 35, 'aligned_test35')",
+ "insert into table0(device,time, s2, s5) values('d1',36, 36, 'aligned_test36')",
+ "insert into table0(device,time, s2, s5) values('d1',37, 37, 'aligned_test37')",
+ "insert into table0(device,time, s2, s5) values('d1',38, 38, 'aligned_test38')",
+ "insert into table0(device,time, s2, s5) values('d1',39, 39, 'aligned_test39')",
+ "insert into table0(device,time, s2, s5) values('d1',40, 40, 'aligned_test40')",
+ "insert into table0(device,time, s2, s5) values('d2',31, 31, 'non_aligned_test31')",
+ "insert into table0(device,time, s2, s5) values('d2',32, 32, 'non_aligned_test32')",
+ "insert into table0(device,time, s2, s5) values('d2',33, 33, 'non_aligned_test33')",
+ "insert into table0(device,time, s2, s5) values('d2',34, 34, 'non_aligned_test34')",
+ "insert into table0(device,time, s2, s5) values('d2',35, 35, 'non_aligned_test35')",
+ "insert into table0(device,time, s2, s5) values('d2',36, 36, 'non_aligned_test36')",
+ "insert into table0(device,time, s2, s5) values('d2',37, 37, 'non_aligned_test37')",
+ "insert into table0(device,time, s2, s5) values('d2',38, 38, 'non_aligned_test38')",
+ "insert into table0(device,time, s2, s5) values('d2',39, 39, 'non_aligned_test39')",
+ "insert into table0(device,time, s2, s5) values('d2',40, 40, 'non_aligned_test40')",
+ };
+
+ public static void insertData() {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+
+ for (String sql : sqls) {
+ statement.addBatch(sql);
+ }
+ statement.executeBatch();
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ public static void insertDataWithSession() {
+ try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
+ for (String sql : sqls) {
+ session.executeNonQueryStatement(sql);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ public static void tableResultSetEqualTest(
+ String sql, String[] expectedHeader, String[] expectedRetArray, String database) {
+ tableResultSetEqualTest(
+ sql,
+ expectedHeader,
+ expectedRetArray,
+ SessionConfig.DEFAULT_USER,
+ SessionConfig.DEFAULT_PASSWORD,
+ database);
+ }
+
+ public static void tableResultSetEqualTest(
+ String sql,
+ String[] expectedHeader,
+ String[] expectedRetArray,
+ String userName,
+ String password,
+ String database) {
+ try (Connection connection =
+ EnvFactory.getEnv().getConnection(userName, password, BaseEnv.TABLE_SQL_DIALECT)) {
+ connection.setClientInfo("time_zone", "+00:00");
+ try (Statement statement = connection.createStatement()) {
+ statement.execute("use " + database);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ assertEquals(expectedHeader[i - 1], resultSetMetaData.getColumnName(i));
+ }
+ assertEquals(expectedHeader.length, resultSetMetaData.getColumnCount());
+
+ int cnt = 0;
+ while (resultSet.next()) {
+ StringBuilder builder = new StringBuilder();
+
+ for (int i = 1; i <= expectedHeader.length; i++) {
+ if (i == 1) {
+ builder.append(resultSet.getLong(i)).append(",");
+ } else {
+ builder.append(resultSet.getString(i)).append(",");
+ }
+ }
+ assertEquals(expectedRetArray[cnt], builder.toString());
+ cnt++;
+ }
+ assertEquals(expectedRetArray.length, cnt);
+ }
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
index ba40f782452..f9d7e675393 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBCastFunctionIT {
+public class IoTDBCastFunctionTableIT {
private static final String DATABASE_NAME = "db";
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable2IT.java
similarity index 95%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable2IT.java
index a6fefaf68a1..1443d1a8c0d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable2IT.java
@@ -30,7 +30,7 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDiffFunction2IT extends IoTDBDiffFunctionIT {
+public class IoTDBDiffFunctionTable2IT extends IoTDBDiffFunctionTableIT {
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getCommonConfig().setDataRegionGroupExtensionPolicy("CUSTOM");
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable3IT.java
similarity index 95%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction3IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable3IT.java
index 82a298331dc..8819fbbb217 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable3IT.java
@@ -30,7 +30,7 @@ import org.junit.runner.RunWith;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDiffFunction3IT extends IoTDBDiffFunctionIT {
+public class IoTDBDiffFunctionTable3IT extends IoTDBDiffFunctionTableIT {
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getCommonConfig().setDataRegionGroupExtensionPolicy("CUSTOM");
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTableIT.java
index bb34853abf0..bc0cc0ce00d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTableIT.java
@@ -38,7 +38,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDiffFunctionIT {
+public class IoTDBDiffFunctionTableIT {
private static final String DATABASE_NAME = "db";
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionTableIT.java
index 25e0351ce42..d44636febf4 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBReplaceFunctionIT {
+public class IoTDBReplaceFunctionTableIT {
private static final String DATABASE_NAME = "db";
private static final String[] SQLs =
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionTableIT.java
index 2fe37d04ad2..7b5d658b303 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBRoundFunctionIT {
+public class IoTDBRoundFunctionTableIT {
private static final String DATABASE_NAME = "db";
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionTableIT.java
index ba19a52a937..d31c12525b8 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionTableIT.java
@@ -40,7 +40,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
@RunWith(IoTDBTestRunner.class)
@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBSubStringFunctionIT {
+public class IoTDBSubStringFunctionTableIT {
private static final String DATABASE_NAME = "db";
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBOrderByTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBOrderByTableIT.java
new file mode 100644
index 00000000000..e7d33580760
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBOrderByTableIT.java
@@ -0,0 +1,1566 @@
+/*
+ * 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.relational.it.query.old.orderBy;
+
+import org.apache.iotdb.isession.ISession;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.write.record.Tablet;
+import org.apache.tsfile.write.schema.IMeasurementSchema;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static org.apache.iotdb.itbase.env.BaseEnv.TABLE_SQL_DIALECT;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBOrderByTableIT {
+
+ // the data can be viewed in
+ // https://docs.google.com/spreadsheets/d/1OWA1bKraArCwWVnuTjuhJ5yLG0PFLdD78gD6FjquepI/edit#gid=0
+ private static final String[] sql =
+ new String[] {
+ "CREATE DATABASE sg",
+ "USE sg",
+ "CREATE TABLE table0 (device string id, attr1 string attribute, num int32 measurement, bigNum int64 measurement, "
+ + "floatNum double measurement, str TEXT measurement, bool BOOLEAN measurement);",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 0,3,2947483648,231.2121,'coconut',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 20,2,2147483648,434.12,'pineapple',TRUE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 40,1,2247483648,12.123,'apricot',TRUE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 80,9,2147483646,43.12,'apple',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 100,8,2147483964,4654.231,'papaya',TRUE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536000000,6,2147483650,1231.21,'banana',TRUE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536000100,10,3147483648,231.55,'pumelo',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536000500,4,2147493648,213.1,'peach',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536001000,5,2149783648,56.32,'orange',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536010000,7,2147983648,213.112,'lemon',TRUE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536100000,11,2147468648,54.121,'pitaya',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 41536000000,12,2146483648,45.231,'strawberry',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 41536000020,14,2907483648,231.34,'cherry',FALSE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 41536900000,13,2107483648,54.12,'lychee',TRUE)",
+ "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 51536000000,15,3147483648,235.213,'watermelon',TRUE)"
+ };
+
+ private static final String[] sql2 =
+ new String[] {
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',0,3,2947483648,231.2121,'coconut',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',20,2,2147483648,434.12,'pineapple',TRUE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',40,1,2247483648,12.123,'apricot',TRUE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',80,9,2147483646,43.12,'apple',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',100,8,2147483964,4654.231,'papaya',TRUE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536000000,6,2147483650,1231.21,'banana',TRUE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536000100,10,3147483648,231.55,'pumelo',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536000500,4,2147493648,213.1,'peach',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536001000,5,2149783648,56.32,'orange',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536010000,7,2147983648,213.112,'lemon',TRUE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536100000,11,2147468648,54.121,'pitaya',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',41536000000,12,2146483648,45.231,'strawberry',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',41536000020,14,2907483648,231.34,'cherry',FALSE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',41536900000,13,2107483648,54.12,'lychee',TRUE)",
+ "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',51536000000,15,3147483648,235.213,'watermelon',TRUE)"
+ };
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ EnvFactory.getEnv().getConfig().getDataNodeCommonConfig().setSortBufferSize(1024 * 1024L);
+ EnvFactory.getEnv().initClusterEnvironment();
+ insertData();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ EnvFactory.getEnv().cleanClusterEnvironment();
+ }
+
+ private static void insertData() {
+ insertData1();
+ insertData2();
+ }
+
+ private static String USE_DB = "use db0";
+
+ // ordinal data
+ public static final String[][] RES =
+ new String[][] {
+ {"0", "3", "2947483648", "231.2121", "coconut", "false"},
+ {"20", "2", "2147483648", "434.12", "pineapple", "true"},
+ {"40", "1", "2247483648", "12.123", "apricot", "true"},
+ {"80", "9", "2147483646", "43.12", "apple", "false"},
+ {"100", "8", "2147483964", "4654.231", "papaya", "true"},
+ {"31536000000", "6", "2147483650", "1231.21", "banana", "true"},
+ {"31536000100", "10", "3147483648", "231.55", "pumelo", "false"},
+ {"31536000500", "4", "2147493648", "213.1", "peach", "false"},
+ {"31536001000", "5", "2149783648", "56.32", "orange", "false"},
+ {"31536010000", "7", "2147983648", "213.112", "lemon", "true"},
+ {"31536100000", "11", "2147468648", "54.121", "pitaya", "false"},
+ {"41536000000", "12", "2146483648", "45.231", "strawberry", "false"},
+ {"41536000020", "14", "2907483648", "231.34", "cherry", "false"},
+ {"41536900000", "13", "2107483648", "54.12", "lychee", "true"},
+ {"51536000000", "15", "3147483648", "235.213", "watermelon", "true"},
+ };
+
+ private void checkHeader(ResultSetMetaData resultSetMetaData, String[] title)
+ throws SQLException {
+ for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+ assertEquals(title[i - 1], resultSetMetaData.getColumnName(i));
+ }
+ }
+
+ private void testNormalOrderBy(String sql, int[] ans) {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(metaData, new String[] {"Time", "num", "bigNum", "floatNum", "str", "bool"});
+ int i = 0;
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ String actualNum = resultSet.getString(2);
+ String actualBigNum = resultSet.getString(3);
+ double actualFloatNum = resultSet.getDouble(4);
+ String actualStr = resultSet.getString(5);
+ String actualBool = resultSet.getString(6);
+
+ // System.out.println(actualTime + "," + actualNum + "," + actualBigNum + "," +
+ // actualFloatNum);
+
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(RES[ans[i]][1], actualNum);
+ assertEquals(RES[ans[i]][2], actualBigNum);
+ assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+ assertEquals(RES[ans[i]][4], actualStr);
+ assertEquals(RES[ans[i]][5], actualBool);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void orderByTest1() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by num";
+ int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest2() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bigNum,time";
+ int[] ans = {13, 11, 10, 3, 1, 5, 4, 7, 9, 8, 2, 12, 0, 6, 14};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest3() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by floatNum";
+ int[] ans = {2, 3, 11, 13, 10, 8, 7, 9, 0, 12, 6, 14, 1, 5, 4};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest4() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest5() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by num desc";
+ int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+ ArrayUtils.reverse(ans);
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest6() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bigNum desc, time asc";
+ int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest7() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by floatNum desc";
+ int[] ans = {2, 3, 11, 13, 10, 8, 7, 9, 0, 12, 6, 14, 1, 5, 4};
+ ArrayUtils.reverse(ans);
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest8() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str desc";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ ArrayUtils.reverse(ans);
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest15() {
+ String sql = "select Time,num+bigNum,floatNum from table0 where device='d1' order by str";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(metaData, new String[] {"Time", "_col1", "floatNum"});
+ int i = 0;
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ double actualNum = resultSet.getDouble(2);
+ double actualFloat = resultSet.getDouble(3);
+
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(
+ Long.parseLong(RES[ans[i]][1]) + Long.parseLong(RES[ans[i]][2]), actualNum, 0.0001);
+ assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloat, 0.0001);
+
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ // 2. Multi-level order by test
+ @Test
+ public void orderByTest9() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bool asc, str asc";
+ int[] ans = {3, 12, 0, 8, 7, 10, 6, 11, 2, 5, 9, 13, 4, 1, 14};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest10() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bool asc, num desc";
+ int[] ans = {12, 11, 10, 6, 3, 8, 7, 0, 14, 13, 4, 9, 5, 1, 2};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest11() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bigNum desc, floatNum desc";
+ int[] ans = {14, 6, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest12() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str desc, floatNum desc";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderBy(sql, org.bouncycastle.util.Arrays.reverse(ans));
+ }
+
+ @Test
+ public void orderByTest13() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by num+floatNum desc, floatNum desc";
+ int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+ testNormalOrderBy(sql, ans);
+ }
+
+ @Test
+ public void orderByTest14() {
+ String sql =
+ "select Time,num+bigNum from table0 where device='d1' order by num+floatNum desc, floatNum desc";
+ int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(metaData, new String[] {"Time", "_col1"});
+ int i = 0;
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ double actualNum = resultSet.getDouble(2);
+
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(
+ Long.parseLong(RES[ans[i]][1]) + Long.parseLong(RES[ans[i]][2]), actualNum, 0.001);
+
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void orderByTest16() {
+ String sql =
+ "select Time,num+floatNum from table0 where device='d1' order by floatNum+num desc, floatNum desc";
+ int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(metaData, new String[] {"Time", "_col1"});
+ int i = 0;
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ double actualNum = resultSet.getDouble(2);
+
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(
+ Long.parseLong(RES[ans[i]][1]) + Double.parseDouble(RES[ans[i]][3]),
+ actualNum,
+ 0.001);
+
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void orderByTest17() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str desc, str asc";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderBy(sql, org.bouncycastle.util.Arrays.reverse(ans));
+ }
+
+ @Test
+ public void orderByTest18() {
+ String sql =
+ "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str, str";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderBy(sql, ans);
+ }
+
+ // limit cannot be pushed down in ORDER BY
+ @Test
+ public void orderByTest19() {
+ String sql = "select Time,num from table0 where device='d1' order by num limit 5";
+ int[] ans = {2, 1, 0, 7, 8};
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(metaData, new String[] {"Time", "num"});
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ String actualNum = resultSet.getString(2);
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(RES[ans[i]][1], actualNum);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ // 3. aggregation query
+ @Ignore
+ @Test
+ public void orderByInAggregationTest() {
+ String sql = "select avg(num) from root.sg.d group by session(10000ms) order by avg(num) desc";
+ double[][] ans = new double[][] {{15.0}, {13.0}, {13.0}, {11.0}, {6.4}, {4.6}};
+ long[] times =
+ new long[] {51536000000L, 41536000000L, 41536900000L, 31536100000L, 31536000000L, 0L};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ double actualAvg = resultSet.getDouble(2);
+ assertEquals(times[i], actualTime);
+ assertEquals(ans[i][0], actualAvg, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationTest2() {
+ String sql =
+ "select avg(num) from root.sg.d group by session(10000ms) order by max_value(floatNum)";
+ double[][] ans =
+ new double[][] {
+ {13.0, 54.12},
+ {11.0, 54.121},
+ {13.0, 231.34},
+ {15.0, 235.213},
+ {6.4, 1231.21},
+ {4.6, 4654.231}
+ };
+ long[] times =
+ new long[] {41536900000L, 31536100000L, 41536000000L, 51536000000L, 31536000000L, 0L};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ double actualAvg = resultSet.getDouble(2);
+ assertEquals(times[i], actualTime);
+ assertEquals(ans[i][0], actualAvg, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationTest3() {
+ String sql =
+ "select avg(num) from root.sg.d group by session(10000ms) order by avg(num) desc,max_value(floatNum)";
+ double[] ans = new double[] {15.0, 13.0, 13.0, 11.0, 6.4, 4.6};
+ long[] times =
+ new long[] {51536000000L, 41536900000L, 41536000000L, 31536100000L, 31536000000L, 0L};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ double actualAvg = resultSet.getDouble(2);
+ assertEquals(times[i], actualTime);
+ assertEquals(ans[i], actualAvg, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationTest4() {
+ String sql =
+ "select avg(num)+avg(floatNum) from root.sg.d group by session(10000ms) order by avg(num)+avg(floatNum)";
+ double[][] ans =
+ new double[][] {{1079.56122}, {395.4584}, {65.121}, {151.2855}, {67.12}, {250.213}};
+ long[] times =
+ new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+ int[] order = new int[] {2, 4, 3, 5, 1, 0};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ double actualAvg = resultSet.getDouble(2);
+ assertEquals(times[order[i]], actualTime);
+ assertEquals(ans[order[i]][0], actualAvg, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationTest5() {
+ String sql =
+ "select min_value(bigNum) from root.sg.d group by session(10000ms) order by avg(num)+avg(floatNum)";
+ long[] ans =
+ new long[] {2147483646L, 2147483650L, 2147468648L, 2146483648L, 2107483648L, 3147483648L};
+ long[] times =
+ new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+ int[] order = new int[] {2, 4, 3, 5, 1, 0};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ long actualMinValue = resultSet.getLong(2);
+ assertEquals(times[order[i]], actualTime);
+ assertEquals(ans[order[i]], actualMinValue, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationTest6() {
+ String sql =
+ "select min_value(num)+min_value(bigNum) from root.sg.d group by session(10000ms) order by avg(num)+avg(floatNum)";
+ long[] ans =
+ new long[] {2147483647L, 2147483654L, 2147468659L, 2146483660L, 2107483661L, 3147483663L};
+ long[] times =
+ new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+ int[] order = new int[] {2, 4, 3, 5, 1, 0};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ double actualMinValue = resultSet.getDouble(2);
+ assertEquals(times[order[i]], actualTime);
+ assertEquals(ans[order[i]], actualMinValue, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationTest7() {
+ String sql =
+ "select avg(num)+min_value(floatNum) from root.sg.d group by session(10000ms) order by max_value(floatNum)";
+ double[][] ans =
+ new double[][] {
+ {13.0, 54.12, 54.12},
+ {11.0, 54.121, 54.121},
+ {13.0, 231.34, 45.231},
+ {15.0, 235.213, 235.213},
+ {6.4, 1231.21, 56.32},
+ {4.6, 4654.231, 12.123}
+ };
+ long[] times =
+ new long[] {41536900000L, 31536100000L, 41536000000L, 51536000000L, 31536000000L, 0L};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ double actualAvg = resultSet.getDouble(2);
+ assertEquals(times[i], actualTime);
+ assertEquals(ans[i][0] + ans[i][2], actualAvg, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationTest8() {
+ String sql =
+ "select avg(num)+avg(floatNum) from root.sg.d group by session(10000ms) order by avg(floatNum)+avg(num)";
+ double[][] ans =
+ new double[][] {{1079.56122}, {395.4584}, {65.121}, {151.2855}, {67.12}, {250.213}};
+ long[] times =
+ new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+ int[] order = new int[] {2, 4, 3, 5, 1, 0};
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ double actualAvg = resultSet.getDouble(2);
+ assertEquals(times[order[i]], actualTime);
+ assertEquals(ans[order[i]][0], actualAvg, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ // 4. raw data query with align by device
+ private void testNormalOrderByAlignByDevice(String sql, int[] ans) {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(
+ metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+ int i = 0;
+ int total = 0;
+ String device = "d1";
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ String actualDevice = resultSet.getString(2);
+ String actualNum = resultSet.getString(3);
+ String actualBigNum = resultSet.getString(4);
+ double actualFloatNum = resultSet.getDouble(5);
+ String actualStr = resultSet.getString(6);
+ String actualBool = resultSet.getString(7);
+
+ assertEquals(device, actualDevice);
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(RES[ans[i]][1], actualNum);
+ assertEquals(RES[ans[i]][2], actualBigNum);
+ assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+ assertEquals(RES[ans[i]][4], actualStr);
+ assertEquals(RES[ans[i]][5], actualBool);
+
+ if (device.equals("d1")) {
+ device = "d2";
+ } else {
+ device = "d1";
+ i++;
+ }
+ total++;
+ }
+ assertEquals(i, ans.length);
+ assertEquals(total, ans.length * 2);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest1() {
+ String sql =
+ "select Time,device,num+bigNum from table0 order by num+floatNum desc, floatNum desc, device asc";
+ int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+ String device = "d1";
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ String actualDevice = resultSet.getString(2);
+ double actualNum = resultSet.getDouble(3);
+
+ assertEquals(device, actualDevice);
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(
+ Long.parseLong(RES[ans[i]][1]) + Long.parseLong(RES[ans[i]][2]), actualNum, 0.0001);
+ if (device.equals("d1")) {
+ device = "d2";
+ } else {
+ device = "d1";
+ i++;
+ }
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest2() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by num, device asc";
+ int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+ testNormalOrderByAlignByDevice(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest3() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by floatNum, device asc";
+ int[] ans = {2, 3, 11, 13, 10, 8, 7, 9, 0, 12, 6, 14, 1, 5, 4};
+ testNormalOrderByAlignByDevice(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest4() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by str, device asc";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderByAlignByDevice(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest5() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by num desc, device asc";
+ int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+ testNormalOrderByAlignByDevice(sql, org.bouncycastle.util.Arrays.reverse(ans));
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest6() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by str desc, device asc";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderByAlignByDevice(sql, org.bouncycastle.util.Arrays.reverse(ans));
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest7() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bool asc, num desc, device asc";
+ int[] ans = {12, 11, 10, 6, 3, 8, 7, 0, 14, 13, 4, 9, 5, 1, 2};
+ testNormalOrderByAlignByDevice(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest8() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, floatNum desc, device asc";
+ int[] ans = {14, 6, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+ testNormalOrderByAlignByDevice(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest9() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by str desc, floatNum desc, device asc";
+ int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+ testNormalOrderByAlignByDevice(sql, org.bouncycastle.util.Arrays.reverse(ans));
+ }
+
+ private void testNormalOrderByMixAlignBy(String sql, int[] ans) {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(
+ metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+ int i = 0;
+ int total = 0;
+ String device = "d1";
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ String actualDevice = resultSet.getString(2);
+ String actualNum = resultSet.getString(3);
+ String actualBigNum = resultSet.getString(4);
+ double actualFloatNum = resultSet.getDouble(5);
+ String actualStr = resultSet.getString(6);
+ String actualBool = resultSet.getString(7);
+
+ assertEquals(device, actualDevice);
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(RES[ans[i]][1], actualNum);
+ assertEquals(RES[ans[i]][2], actualBigNum);
+ assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+ assertEquals(RES[ans[i]][4], actualStr);
+ assertEquals(RES[ans[i]][5], actualBool);
+
+ if (device.equals("d2")) {
+ i++;
+ device = "d1";
+ } else {
+ device = "d2";
+ }
+
+ total++;
+ }
+ assertEquals(total, ans.length * 2);
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ private void testDeviceViewOrderByMixAlignBy(String sql, int[] ans) {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(
+ metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+ int i = 0;
+ int total = 0;
+ String device = "d2";
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ String actualDevice = resultSet.getString(2);
+ String actualNum = resultSet.getString(3);
+ String actualBigNum = resultSet.getString(4);
+ double actualFloatNum = resultSet.getDouble(5);
+ String actualStr = resultSet.getString(6);
+ String actualBool = resultSet.getString(7);
+
+ assertEquals(device, actualDevice);
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(RES[ans[i]][1], actualNum);
+ assertEquals(RES[ans[i]][2], actualBigNum);
+ assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+ assertEquals(RES[ans[i]][4], actualStr);
+ assertEquals(RES[ans[i]][5], actualBool);
+
+ i++;
+ total++;
+ if (total == ans.length) {
+ i = 0;
+ if (device.equals("d2")) {
+ device = "d1";
+ } else {
+ device = "d2";
+ }
+ }
+ }
+ assertEquals(total, ans.length * 2);
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ private void orderByBigNumAlignByDevice(String sql, int[] ans) {
+ try (Connection connection = EnvFactory.getEnv().getTableConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(USE_DB);
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ checkHeader(
+ metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+ int i = 0;
+ int total = 0;
+ String device = "d1";
+ while (resultSet.next()) {
+
+ long actualTime = resultSet.getLong(1);
+ String actualDevice = resultSet.getString(2);
+ String actualNum = resultSet.getString(3);
+ String actualBigNum = resultSet.getString(4);
+ double actualFloatNum = resultSet.getDouble(5);
+ String actualStr = resultSet.getString(6);
+ String actualBool = resultSet.getString(7);
+
+ if (total < 4) {
+ i = total % 2;
+ if (total < 2) {
+ device = "d2";
+ } else {
+ device = "d1";
+ }
+ }
+
+ assertEquals(device, actualDevice);
+ assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+ assertEquals(RES[ans[i]][1], actualNum);
+ assertEquals(RES[ans[i]][2], actualBigNum);
+ assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+ assertEquals(RES[ans[i]][4], actualStr);
+ assertEquals(RES[ans[i]][5], actualBool);
+
+ if (device.equals("d2")) {
+ device = "d1";
+ } else {
+ i++;
+ device = "d2";
+ }
+
+ total++;
+ }
+ assertEquals(i, ans.length);
+ assertEquals(total, ans.length * 2);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest12() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, device desc, time asc";
+ int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+ orderByBigNumAlignByDevice(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest13() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, time desc, device asc";
+ int[] ans = {14, 6, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+ testNormalOrderByMixAlignBy(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest14() {
+ int[] ans = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by time desc, bigNum desc, device asc";
+ testNormalOrderByMixAlignBy(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest15() {
+ int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by device desc, bigNum desc, time asc";
+ testDeviceViewOrderByMixAlignBy(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest16() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by device desc, time asc, bigNum desc";
+ int[] ans = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
+ testDeviceViewOrderByMixAlignBy(sql, ans);
+ }
+
+ @Test
+ public void alignByDeviceOrderByTest17() {
+ String sql =
+ "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, device desc, num asc, time asc";
+ int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+ orderByBigNumAlignByDevice(sql, ans);
+ }
+
+ // 5. aggregation query align by device
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest() {
+ String sql =
+ "select avg(num) from root.** group by session(10000ms) order by avg(num) align by device";
+
+ double[] ans = {4.6, 4.6, 6.4, 6.4, 11.0, 11.0, 13.0, 13.0, 13.0, 13.0, 15.0, 15.0};
+ long[] times =
+ new long[] {
+ 0L,
+ 0L,
+ 31536000000L,
+ 31536000000L,
+ 31536100000L,
+ 31536100000L,
+ 41536000000L,
+ 41536900000L,
+ 41536000000L,
+ 41536900000L,
+ 51536000000L,
+ 51536000000L
+ };
+ String[] device =
+ new String[] {
+ "root.sg.d",
+ "root.sg.d2",
+ "root.sg.d",
+ "root.sg.d2",
+ "root.sg.d",
+ "root.sg.d2",
+ "root.sg.d",
+ "root.sg.d",
+ "root.sg.d2",
+ "root.sg.d2",
+ "root.sg.d",
+ "root.sg.d2"
+ };
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ long actualTime = resultSet.getLong(1);
+ String actualDevice = resultSet.getString(2);
+ double actualAvg = resultSet.getDouble(3);
+
+ assertEquals(device[i], actualDevice);
+ assertEquals(times[i], actualTime);
+ assertEquals(ans[i], actualAvg, 0.0001);
+ i++;
+ }
+ assertEquals(i, ans.length);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ @Ignore
+ public void orderByInAggregationAlignByDeviceTest2() {
+ String sql = "select avg(num) from root.** order by avg(num) align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, true);
+ }
+
+ private void checkSingleDouble(String sql, Object value, boolean deviceAsc) {
+ String device = "root.sg.d";
+ if (!deviceAsc) device = "root.sg.d2";
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ String deviceName = resultSet.getString(1);
+ double actualVal = resultSet.getDouble(2);
+ assertEquals(deviceName, device);
+ assertEquals(Double.parseDouble(value.toString()), actualVal, 1);
+ if (device.equals("root.sg.d")) device = "root.sg.d2";
+ else device = "root.sg.d";
+ i++;
+ }
+ assertEquals(i, 2);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest3() {
+ String sql =
+ "select avg(num)+avg(bigNum) from root.** order by max_value(floatNum) align by device";
+ long value = 2388936669L + 8;
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest4() {
+
+ String sql =
+ "select avg(num)+avg(bigNum) from root.** order by max_value(floatNum)+min_value(num) align by device";
+ long value = 2388936669L + 8;
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest5() {
+ String sql =
+ "select avg(num) from root.** order by max_value(floatNum)+avg(num) align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest6() {
+ String sql =
+ "select avg(num) from root.** order by max_value(floatNum)+avg(num), device asc, time desc align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest7() {
+ String sql =
+ "select avg(num) from root.** order by max_value(floatNum)+avg(num), time asc, device desc align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, false);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest8() {
+ String sql =
+ "select avg(num) from root.** order by time asc, max_value(floatNum)+avg(num), device desc align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, false);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest9() {
+ String sql =
+ "select avg(num) from root.** order by device asc, max_value(floatNum)+avg(num), time desc align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest10() {
+ String sql =
+ "select avg(num) from root.** order by max_value(floatNum) desc,time asc, avg(num) asc, device desc align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, false);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest11() {
+ String sql =
+ "select avg(num) from root.** order by max_value(floatNum) desc,device asc, avg(num) asc, time desc align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest12() {
+ String sql =
+ "select avg(num+floatNum) from root.** order by time,avg(num+floatNum) align by device";
+ String value = "537.34154";
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest13() {
+ String sql = "select avg(num) from root.** order by time,avg(num+floatNum) align by device";
+ String value = "8";
+ checkSingleDouble(sql, value, true);
+ }
+
+ @Ignore
+ @Test
+ public void orderByInAggregationAlignByDeviceTest14() {
+ String sql = "select avg(num+floatNum) from root.** order by time,avg(num) align by device";
+ String value = "537.34154";
+ checkSingleDouble(sql, value, true);
+ }
+
+ String[][] UDFRes =
+ new String[][] {
+ {"0", "3", "0", "0"},
+ {"20", "2", "0", "0"},
+ {"40", "1", "0", "0"},
+ {"80", "9", "0", "0"},
+ {"100", "8", "0", "0"},
+ {"31536000000", "6", "0", "0"},
+ {"31536000100", "10", "0", "0"},
+ {"31536000500", "4", "0", "0"},
+ {"31536001000", "5", "0", "0"},
+ {"31536010000", "7", "0", "0"},
+ {"31536100000", "11", "0", "0"},
+ {"41536000000", "12", "2146483648", "0"},
+ {"41536000020", "14", "0", "14"},
+ {"41536900000", "13", "2107483648", "0"},
+ {"51536000000", "15", "0", "15"},
+ };
+
+ // UDF Test
+ private void orderByUDFTest(String sql, int[] ans) {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ String time = resultSet.getString(1);
+ String num = resultSet.getString(2);
+ String topK = resultSet.getString(3);
+ String bottomK = resultSet.getString(4);
+
+ assertEquals(time, UDFRes[ans[i]][0]);
+ assertEquals(num, UDFRes[ans[i]][1]);
+ if (Objects.equals(UDFRes[ans[i]][3], "0")) {
+ assertNull(topK);
+ } else {
+ assertEquals(topK, UDFRes[ans[i]][3]);
+ }
+
+ if (Objects.equals(UDFRes[ans[i]][2], "0")) {
+ assertNull(bottomK);
+ } else {
+ assertEquals(bottomK, UDFRes[ans[i]][2]);
+ }
+
+ i++;
+ }
+ assertEquals(i, 15);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void orderByUDFTest1() {
+ String sql =
+ "select num, top_k(num, 'k'='2'), bottom_k(bigNum, 'k'='2') from root.sg.d order by top_k(num, 'k'='2') nulls first, bottom_k(bigNum, 'k'='2') nulls first";
+ int[] ans = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 11, 12, 14};
+ orderByUDFTest(sql, ans);
+ }
+
+ @Ignore
+ @Test
+ public void orderByUDFTest2() {
+ String sql =
+ "select num, top_k(num, 'k'='2'), bottom_k(bigNum, 'k'='2') from root.sg.d order by top_k(num, 'k'='2'), bottom_k(bigNum, 'k'='2')";
+ int[] ans = {12, 14, 13, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ orderByUDFTest(sql, ans);
+ }
+
+ private void errorTest(String sql, String error) {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeQuery(sql);
+ } catch (Exception e) {
+ assertEquals(error, e.getMessage());
+ }
+ }
+
+ @Ignore
+ @Test
+ public void errorTest1() {
+ errorTest(
+ "select num from root.sg.d order by avg(bigNum)",
+ "701: Raw data and aggregation hybrid query is not supported.");
+ }
+
+ @Ignore
+ @Test
+ public void errorTest2() {
+ errorTest(
+ "select avg(num) from root.sg.d order by bigNum",
+ "701: Raw data and aggregation hybrid query is not supported.");
+ }
+
+ @Test
+ public void errorTest3() {
+ errorTest(
+ "select bigNum,floatNum from table0 order by s1",
+ "700: Error occurred while parsing SQL to physical plan: line 1:28 no viable alternative at input 'select bigNum,floatNum from table0'");
+ }
+
+ @Ignore
+ @Test
+ public void errorTest4() {
+ errorTest(
+ "select bigNum,floatNum from root.** order by bigNum",
+ "701: root.**.bigNum in order by clause shouldn't refer to more than one timeseries.");
+ }
+
+ @Ignore
+ @Test
+ public void errorTest7() {
+ errorTest(
+ "select last bigNum,floatNum from root.** order by root.sg.d.bigNum",
+ "701: root.sg.d.bigNum in order by clause doesn't exist in the result of last query.");
+ }
+
+ // last query
+ public void testLastQueryOrderBy(String sql, String[][] ans) {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
+ int i = 0;
+ while (resultSet.next()) {
+ String time = resultSet.getString(1);
+ String num = resultSet.getString(2);
+ String value = resultSet.getString(3);
+ String dataType = resultSet.getString(4);
+
+ assertEquals(time, ans[0][i]);
+ assertEquals(num, ans[1][i]);
+ assertEquals(value, ans[2][i]);
+ assertEquals(dataType, ans[3][i]);
+
+ i++;
+ }
+ assertEquals(i, 4);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void lastQueryOrderBy() {
+ String[][] ans =
+ new String[][] {
+ {"51536000000", "51536000000", "51536000000", "51536000000"},
+ {"root.sg.d.num", "root.sg.d2.num", "root.sg.d.bigNum", "root.sg.d2.bigNum"},
+ {"15", "15", "3147483648", "3147483648"},
+ {"INT32", "INT32", "INT64", "INT64"}
+ };
+ String sql = "select last bigNum,num from root.** order by value, timeseries";
+ testLastQueryOrderBy(sql, ans);
+ }
+
+ @Ignore
+ @Test
+ public void lastQueryOrderBy2() {
+ String[][] ans =
+ new String[][] {
+ {"51536000000", "51536000000", "51536000000", "51536000000"},
+ {"root.sg.d2.num", "root.sg.d2.bigNum", "root.sg.d.num", "root.sg.d.bigNum"},
+ {"15", "3147483648", "15", "3147483648"},
+ {"INT32", "INT64", "INT32", "INT64"}
+ };
+ String sql = "select last bigNum,num from root.** order by timeseries desc";
+ testLastQueryOrderBy(sql, ans);
+ }
+
+ @Ignore
+ @Test
+ public void lastQueryOrderBy3() {
+ String[][] ans =
+ new String[][] {
+ {"51536000000", "51536000000", "51536000000", "51536000000"},
+ {"root.sg.d2.num", "root.sg.d2.bigNum", "root.sg.d.num", "root.sg.d.bigNum"},
+ {"15", "3147483648", "15", "3147483648"},
+ {"INT32", "INT64", "INT32", "INT64"}
+ };
+ String sql = "select last bigNum,num from root.** order by timeseries desc, value asc";
+ testLastQueryOrderBy(sql, ans);
+ }
+
+ @Ignore
+ @Test
+ public void lastQueryOrderBy4() {
+ String[][] ans =
+ new String[][] {
+ {"51536000000", "51536000000", "51536000000", "51536000000"},
+ {"root.sg.d2.num", "root.sg.d.num", "root.sg.d2.bigNum", "root.sg.d.bigNum"},
+ {"15", "15", "3147483648", "3147483648"},
+ {"INT32", "INT32", "INT64", "INT64"}
+ };
+ String sql = "select last bigNum,num from root.** order by value, timeseries desc";
+ testLastQueryOrderBy(sql, ans);
+ }
+
+ @Ignore
+ @Test
+ public void lastQueryOrderBy5() {
+ String[][] ans =
+ new String[][] {
+ {"51536000000", "51536000000", "51536000000", "51536000000"},
+ {"root.sg.d2.num", "root.sg.d.num", "root.sg.d2.bigNum", "root.sg.d.bigNum"},
+ {"15", "15", "3147483648", "3147483648"},
+ {"INT32", "INT32", "INT64", "INT64"}
+ };
+ String sql = "select last bigNum,num from root.** order by datatype, timeseries desc";
+ testLastQueryOrderBy(sql, ans);
+ }
+
+ private static List<Long> TIMES =
+ Arrays.asList(
+ 0L,
+ 20L,
+ 40L,
+ 80L,
+ 100L,
+ 31536000000L,
+ 31536000100L,
+ 31536000500L,
+ 31536001000L,
+ 31536010000L,
+ 31536100000L,
+ 41536000000L,
+ 41536000020L,
+ 41536900000L,
+ 51536000000L);
+
+ protected static void insertData1() {
+ try (ISession session = EnvFactory.getEnv().getSessionConnection(TABLE_SQL_DIALECT)) {
+
+ session.open();
+ session.executeNonQueryStatement("CREATE DATABASE \"db0\"");
+ session.executeNonQueryStatement("USE \"db0\"");
+
+ List<IMeasurementSchema> schemaList = new ArrayList<>();
+ schemaList.add(new MeasurementSchema("device", TSDataType.STRING));
+ schemaList.add(new MeasurementSchema("attr1", TSDataType.STRING));
+ schemaList.add(new MeasurementSchema("num", TSDataType.INT32));
+ schemaList.add(new MeasurementSchema("bigNum", TSDataType.INT64));
+ schemaList.add(new MeasurementSchema("floatNum", TSDataType.DOUBLE));
+ schemaList.add(new MeasurementSchema("str", TSDataType.TEXT));
+ schemaList.add(new MeasurementSchema("bool", TSDataType.BOOLEAN));
+ final List<Tablet.ColumnType> columnTypes =
+ Arrays.asList(
+ Tablet.ColumnType.ID,
+ Tablet.ColumnType.ATTRIBUTE,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT);
+ List<String> measurementIds =
+ schemaList.stream()
+ .map(IMeasurementSchema::getMeasurementId)
+ .collect(Collectors.toList());
+ List<TSDataType> dataTypes =
+ schemaList.stream().map(IMeasurementSchema::getType).collect(Collectors.toList());
+
+ List<Object[]> values =
+ Arrays.asList(
+ new Object[] {"d1", "a1", 3, 2947483648L, 231.2121, "coconut", false},
+ new Object[] {"d1", "a1", 2, 2147483648L, 434.12, "pineapple", true},
+ new Object[] {"d1", "a1", 1, 2247483648L, 12.123, "apricot", true},
+ new Object[] {"d1", "a1", 9, 2147483646L, 43.12, "apple", false},
+ new Object[] {"d1", "a1", 8, 2147483964L, 4654.231, "papaya", true},
+ new Object[] {"d1", "a1", 6, 2147483650L, 1231.21, "banana", true},
+ new Object[] {"d1", "a1", 10, 3147483648L, 231.55, "pumelo", false},
+ new Object[] {"d1", "a1", 4, 2147493648L, 213.1, "peach", false},
+ new Object[] {"d1", "a1", 5, 2149783648L, 56.32, "orange", false},
+ new Object[] {"d1", "a1", 7, 2147983648L, 213.112, "lemon", true},
+ new Object[] {"d1", "a1", 11, 2147468648L, 54.121, "pitaya", false},
+ new Object[] {"d1", "a1", 12, 2146483648L, 45.231, "strawberry", false},
+ new Object[] {"d1", "a1", 14, 2907483648L, 231.34, "cherry", false},
+ new Object[] {"d1", "a1", 13, 2107483648L, 54.12, "lychee", true},
+ new Object[] {"d1", "a1", 15, 3147483648L, 235.213, "watermelon", true});
+ for (int i = 0; i < TIMES.size(); i++) {
+ session.insertRelationalRecord(
+ "table0", TIMES.get(i), measurementIds, dataTypes, columnTypes, values.get(i));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected static void insertData2() {
+ try (ISession session = EnvFactory.getEnv().getSessionConnection(TABLE_SQL_DIALECT)) {
+
+ session.open();
+ session.executeNonQueryStatement("USE \"db0\"");
+
+ List<IMeasurementSchema> schemaList = new ArrayList<>();
+ schemaList.add(new MeasurementSchema("device", TSDataType.STRING));
+ schemaList.add(new MeasurementSchema("attr1", TSDataType.STRING));
+ schemaList.add(new MeasurementSchema("num", TSDataType.INT32));
+ schemaList.add(new MeasurementSchema("bigNum", TSDataType.INT64));
+ schemaList.add(new MeasurementSchema("floatNum", TSDataType.DOUBLE));
+ schemaList.add(new MeasurementSchema("str", TSDataType.TEXT));
+ schemaList.add(new MeasurementSchema("bool", TSDataType.BOOLEAN));
+ final List<Tablet.ColumnType> columnTypes =
+ Arrays.asList(
+ Tablet.ColumnType.ID,
+ Tablet.ColumnType.ATTRIBUTE,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT,
+ Tablet.ColumnType.MEASUREMENT);
+ List<String> measurementIds =
+ schemaList.stream()
+ .map(IMeasurementSchema::getMeasurementId)
+ .collect(Collectors.toList());
+ List<TSDataType> dataTypes =
+ schemaList.stream().map(IMeasurementSchema::getType).collect(Collectors.toList());
+ List<Object[]> values =
+ Arrays.asList(
+ new Object[] {"d2", "a2", 3, 2947483648L, 231.2121, "coconut", false},
+ new Object[] {"d2", "a2", 2, 2147483648L, 434.12, "pineapple", true},
+ new Object[] {"d2", "a2", 1, 2247483648L, 12.123, "apricot", true},
+ new Object[] {"d2", "a2", 9, 2147483646L, 43.12, "apple", false},
+ new Object[] {"d2", "a2", 8, 2147483964L, 4654.231, "papaya", true},
+ new Object[] {"d2", "a2", 6, 2147483650L, 1231.21, "banana", true},
+ new Object[] {"d2", "a2", 10, 3147483648L, 231.55, "pumelo", false},
+ new Object[] {"d2", "a2", 4, 2147493648L, 213.1, "peach", false},
+ new Object[] {"d2", "a2", 5, 2149783648L, 56.32, "orange", false},
+ new Object[] {"d2", "a2", 7, 2147983648L, 213.112, "lemon", true},
+ new Object[] {"d2", "a2", 11, 2147468648L, 54.121, "pitaya", false},
+ new Object[] {"d2", "a2", 12, 2146483648L, 45.231, "strawberry", false},
+ new Object[] {"d2", "a2", 14, 2907483648L, 231.34, "cherry", false},
+ new Object[] {"d2", "a2", 13, 2107483648L, 54.12, "lychee", true},
+ new Object[] {"d2", "a2", 15, 3147483648L, 235.213, "watermelon", true});
+ for (int i = 0; i < TIMES.size(); i++) {
+ session.insertRelationalRecord(
+ "table0", TIMES.get(i), measurementIds, dataTypes, columnTypes, values.get(i));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index fbc40f319ae..19f30401198 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -417,7 +417,7 @@ public class TableOperatorGenerator extends PlanVisitor<Operator, LocalExecution
filterExpressionColumnTransformerMap,
commonTransformerList,
filterOutputDataTypes,
- inputLocations.size() - 1,
+ inputLocations.size(),
context.getTypeProvider(),
metadata);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java
index 3823406d1c3..1f7442cf538 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java
@@ -57,11 +57,9 @@ public final class NormalizeOrExpressionRewriter {
node.getTerms().stream()
.map(expression -> process(expression, context))
.collect(toImmutableList());
-
if (node.getOperator() == AND) {
return and(terms);
}
-
ImmutableList.Builder<InPredicate> inPredicateBuilder = ImmutableList.builder();
ImmutableSet.Builder<Expression> expressionToSkipBuilder = ImmutableSet.builder();
ImmutableList.Builder<Expression> othersExpressionBuilder = ImmutableList.builder();
@@ -74,12 +72,10 @@ public final class NormalizeOrExpressionRewriter {
expressionToSkipBuilder.add(expression);
}
});
-
Set<Expression> expressionToSkip = expressionToSkipBuilder.build();
for (Expression expression : terms) {
if (expression instanceof ComparisonExpression
&& ((ComparisonExpression) expression).getOperator() == EQUAL) {
-
if (!expressionToSkip.contains(((ComparisonExpression) expression).getLeft())) {
othersExpressionBuilder.add(expression);
}
@@ -91,7 +87,6 @@ public final class NormalizeOrExpressionRewriter {
othersExpressionBuilder.add(expression);
}
}
-
return or(
ImmutableList.<Expression>builder()
.addAll(othersExpressionBuilder.build())
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java
index 7ee9dd322fa..df80e7901e6 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java
@@ -91,7 +91,7 @@ public class StreamSortNode extends SortNode {
public static SortNode deserialize(ByteBuffer byteBuffer) {
OrderingScheme orderingScheme = OrderingScheme.deserialize(byteBuffer);
boolean partial = ReadWriteIOUtils.readBool(byteBuffer);
- int streamCompareKeyEndIndex = ReadWriteIOUtils.read(byteBuffer);
+ int streamCompareKeyEndIndex = ReadWriteIOUtils.readInt(byteBuffer);
PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
return new StreamSortNode(planNodeId, null, orderingScheme, partial, streamCompareKeyEndIndex);
}