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 04:33:17 UTC
[incubator-iotdb] branch master updated: fix limit in group by
This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 0af58a0 fix limit in group by
0af58a0 is described below
commit 0af58a097bd70fd0bbfa69239b56548f67589d3c
Author: qiaojialin <64...@qq.com>
AuthorDate: Fri Jul 17 10:51:33 2020 +0800
fix limit in group by
---
.../org/apache/iotdb/db/qp/strategy/SqlBase.g4 | 2 +-
.../DML Data Manipulation Language.md | 2 --
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 7 ++--
.../iotdb/db/integration/IOTDBGroupByIT.java | 39 +++++++++++++++++++++
.../iotdb/db/integration/IoTDBGroupByFillIT.java | 40 ++++++++++++++++++++++
5 files changed, 82 insertions(+), 8 deletions(-)
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
index e9ae14e..7b9efd5 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
@@ -208,7 +208,7 @@ fromClause
specialClause
: specialLimit
| groupByTimeClause specialLimit?
- | groupByFillClause
+ | groupByFillClause specialLimit?
| fillClause slimitClause? alignByDeviceClauseOrDisableAlign?
| alignByDeviceClauseOrDisableAlign
| groupByLevelClause specialLimit?
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 b13c660..cc20267 100644
--- a/docs/zh/UserGuide/Operation Manual/DML Data Manipulation Language.md
+++ b/docs/zh/UserGuide/Operation Manual/DML Data Manipulation Language.md
@@ -221,8 +221,6 @@ select count(status) from root.ln.wf01.wt01 group by level=2;
IoTDB支持根据时间间隔和自定义的滑动步长(默认值与时间间隔相同,自定义的值必须大于等于时间间隔)对结果集进行划分,默认结果按照时间升序排列。
同时,您也可以使用Java JDBC标准接口来执行相关的查询语句。
-Group By 语句不支持 limit 和 offset。
-
GROUP BY语句为用户提供三类指定参数:
* 参数1:时间轴显示时间窗参数
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 e6314ad..76b4609 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
@@ -154,9 +154,6 @@ public class PlanExecutor implements IPlanExecutor {
// for administration
private IAuthorizer authorizer;
- private boolean enablePartialInsert = IoTDBDescriptor.getInstance().getConfig()
- .isEnablePartialInsert();
-
public PlanExecutor() throws QueryProcessException {
queryRouter = new QueryRouter();
mManager = IoTDB.metaManager;
@@ -325,10 +322,10 @@ public class PlanExecutor implements IPlanExecutor {
return new EmptyDataSet();
} else if (queryPlan instanceof GroupByTimeFillPlan) {
GroupByTimeFillPlan groupByFillPlan = (GroupByTimeFillPlan) queryPlan;
- return queryRouter.groupByFill(groupByFillPlan, context);
+ queryDataSet = queryRouter.groupByFill(groupByFillPlan, context);
} else if (queryPlan instanceof GroupByTimePlan) {
GroupByTimePlan groupByTimePlan = (GroupByTimePlan) queryPlan;
- return queryRouter.groupBy(groupByTimePlan, context);
+ queryDataSet = queryRouter.groupBy(groupByTimePlan, 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",