You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/07/17 02:41:54 UTC
[incubator-iotdb] branch rel/0.10 updated: [IOTDB-798] [To
rel/0.10] fix a set rowLimit and rowOffset bug (#1508)
This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch rel/0.10
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/rel/0.10 by this push:
new 1f08d44 [IOTDB-798] [To rel/0.10] fix a set rowLimit and rowOffset bug (#1508)
1f08d44 is described below
commit 1f08d44130fc150212630b255b3e177faf50c502
Author: Haonan <hh...@outlook.com>
AuthorDate: Fri Jul 17 10:41:41 2020 +0800
[IOTDB-798] [To rel/0.10] fix a set rowLimit and rowOffset bug (#1508)
* fix rowLimit and rowOffset bug in group by
* support groupbyfill setLimit
---
.../DML Data Manipulation Language.md | 2 --
.../org/apache/iotdb/db/qp/strategy/SqlBase.g4 | 2 +-
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 4 +--
.../iotdb/db/integration/IOTDBGroupByIT.java | 39 +++++++++++++++++++++
.../iotdb/db/integration/IoTDBGroupByFillIT.java | 40 ++++++++++++++++++++++
5 files changed, 82 insertions(+), 5 deletions(-)
diff --git a/docs/zh/UserGuide/Operation Manual/DML Data Manipulation Language.md b/docs/zh/UserGuide/Operation Manual/DML Data Manipulation Language.md
index 621beda..a4929f7 100644
--- a/docs/zh/UserGuide/Operation Manual/DML Data Manipulation Language.md
+++ b/docs/zh/UserGuide/Operation Manual/DML Data Manipulation Language.md
@@ -179,8 +179,6 @@ select s1,s2 from root.sg1.* GROUP BY DEVICE
IoTDB支持根据时间间隔和自定义的滑动步长(默认值与时间间隔相同,自定义的值必须大于等于时间间隔)对结果集进行划分,默认结果按照时间升序排列。
同时,您也可以使用Java JDBC标准接口来执行相关的查询语句。
-Group By 语句不支持 limit 和 offset。
-
GROUP BY语句为用户提供三类指定参数:
* 参数1:时间轴显示时间窗参数
diff --git a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4 b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
index 1ad9962..8b03d95 100644
--- a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
+++ b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
@@ -193,7 +193,7 @@ fromClause
specialClause
: specialLimit
| groupByClause specialLimit?
- | groupByFillClause
+ | groupByFillClause specialLimit?
| fillClause slimitClause? alignByDeviceClauseOrDisableAlign?
| alignByDeviceClauseOrDisableAlign
;
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index efa68f8..b5ba4ef 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -304,10 +304,10 @@ public class PlanExecutor implements IPlanExecutor {
return new EmptyDataSet();
} else if (queryPlan instanceof GroupByFillPlan) {
GroupByFillPlan groupByFillPlan = (GroupByFillPlan) queryPlan;
- return queryRouter.groupByFill(groupByFillPlan, context);
+ queryDataSet = queryRouter.groupByFill(groupByFillPlan, context);
} else if (queryPlan instanceof GroupByPlan) {
GroupByPlan groupByPlan = (GroupByPlan) queryPlan;
- return queryRouter.groupBy(groupByPlan, context);
+ queryDataSet = queryRouter.groupBy(groupByPlan, context);
} else if (queryPlan instanceof AggregationPlan) {
AggregationPlan aggregationPlan = (AggregationPlan) queryPlan;
queryDataSet = queryRouter.aggregate(aggregationPlan, context);
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
index 8fd4e80..b008475 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
@@ -536,6 +536,45 @@ public class IOTDBGroupByIT {
}
}
+ @Test
+ public void usingLimit() {
+ String[] retArray1 = new String[]{
+ "90,0,0.0,null",
+ "120,0,0.0,null",
+ "150,1,200.2,200.2",
+ "180,0,0.0,null",
+ "210,0,0.0,null"
+ };
+
+ try (Connection connection = DriverManager.
+ getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
+ Statement statement = connection.createStatement()) {
+ boolean hasResultSet = statement.execute(
+ "select count(temperature), sum(temperature), avg(temperature) from "
+ + "root.ln.wf01.wt01 where temperature > 3 "
+ + "GROUP BY ([0, 600), 5ms, 30ms) "
+ + "limit 5 offset 3");
+
+ Assert.assertTrue(hasResultSet);
+ int cnt;
+ try (ResultSet resultSet = statement.getResultSet()) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet
+ .getString(count("root.ln.wf01.wt01.temperature")) + "," +
+ resultSet.getString(sum("root.ln.wf01.wt01.temperature")) + "," + resultSet
+ .getString(avg("root.ln.wf01.wt01.temperature"));
+ Assert.assertEquals(retArray1[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray1.length, cnt);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
@Test
public void usingNowFunction() {
try (Connection connection = DriverManager.
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByFillIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByFillIT.java
index 68d6930..9fe953f 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByFillIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByFillIT.java
@@ -570,6 +570,46 @@ public class IoTDBGroupByFillIT {
}
}
+ @Test
+ public void usingLimit() {
+
+ String[] retArray = new String[] {
+ "27,26",
+ "32,29",
+ "37,40",
+ "42,40",
+ "47,40",
+ };
+
+ try (Connection connection = DriverManager.
+ getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
+ Statement statement = connection.createStatement()) {
+ boolean hasResultSet = statement.execute(
+ "select last_value(temperature) from "
+ + "root.ln.wf01.wt01 "
+ + "GROUP BY ([17, 48), 5ms) FILL(int32[previous]) "
+ + "limit 5 offset 2");
+
+ assertTrue(hasResultSet);
+ int cnt;
+ try (ResultSet resultSet = statement.getResultSet()) {
+ cnt = 0;
+ while (resultSet.next()) {
+ String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet
+ .getString(last_value("root.ln.wf01.wt01.temperature"));
+ assertEquals(retArray[cnt], ans);
+ cnt++;
+ }
+ assertEquals(retArray.length, cnt);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+
+ }
+
private void prepareData() {
try (Connection connection = DriverManager
.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",