This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new b57f320153b Make slimit and soffset available in align by device with
template
b57f320153b is described below
commit b57f320153baac97f9b97ba25f8789bc7b0400c2
Author: Beyyes <[email protected]>
AuthorDate: Tue Dec 12 18:06:13 2023 +0800
Make slimit and soffset available in align by device with template
---
.../IoTDBAlignByDeviceWithTemplateIT.java | 82 ++++++++++++++++++++++
.../queryengine/plan/analyze/TemplatedAnalyze.java | 42 +++++++----
2 files changed, 112 insertions(+), 12 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
index 78cda6b40e6..9d64fa89f50 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
@@ -577,6 +577,88 @@ public class IoTDBAlignByDeviceWithTemplateIT {
"select count(s1+1) from root.sg1.** align by device;",
expectedHeader, retArray);
}
+ @Test
+ public void sLimitOffsetTest() {
+ // 1. original
+ String[] expectedHeader = new String[] {"Time,Device,s1"};
+ String[] retArray =
+ new String[] {
+ "1,root.sg1.d1,1.1,",
+ "2,root.sg1.d1,2.2,",
+ "1,root.sg1.d2,11.1,",
+ "2,root.sg1.d2,22.2,",
+ "1,root.sg1.d3,111.1,",
+ "4,root.sg1.d3,444.4,",
+ "1,root.sg1.d4,1111.1,",
+ "5,root.sg1.d4,5555.5,",
+ };
+ resultSetEqualTest(
+ "SELECT * FROM root.sg1.** slimit 1 soffset 1 ALIGN BY DEVICE;",
expectedHeader, retArray);
+ retArray =
+ new String[] {
+ "1,root.sg2.d1,1.1,",
+ "2,root.sg2.d1,2.2,",
+ "1,root.sg2.d2,11.1,",
+ "2,root.sg2.d2,22.2,",
+ "1,root.sg2.d3,111.1,",
+ "4,root.sg2.d3,444.4,",
+ "1,root.sg2.d4,1111.1,",
+ "5,root.sg2.d4,5555.5,",
+ };
+ resultSetEqualTest(
+ "SELECT * FROM root.sg2.** slimit 1 soffset 1 ALIGN BY DEVICE;",
expectedHeader, retArray);
+
+ expectedHeader = new String[] {"Time,Device,s1,s2"};
+ retArray =
+ new String[] {
+ "1,root.sg1.d1,1.1,false,",
+ "2,root.sg1.d1,2.2,false,",
+ "1,root.sg1.d2,11.1,false,",
+ "2,root.sg1.d2,22.2,false,",
+ "1,root.sg1.d3,111.1,true,",
+ "4,root.sg1.d3,444.4,true,",
+ "1,root.sg1.d4,1111.1,true,",
+ "5,root.sg1.d4,5555.5,false,",
+ };
+ resultSetEqualTest(
+ "SELECT *, s1 FROM root.sg1.** slimit 2 soffset 1 ALIGN BY DEVICE;",
+ expectedHeader,
+ retArray);
+ retArray =
+ new String[] {
+ "1,root.sg2.d1,1.1,false,",
+ "2,root.sg2.d1,2.2,false,",
+ "1,root.sg2.d2,11.1,false,",
+ "2,root.sg2.d2,22.2,false,",
+ "1,root.sg2.d3,111.1,true,",
+ "4,root.sg2.d3,444.4,true,",
+ "1,root.sg2.d4,1111.1,true,",
+ "5,root.sg2.d4,5555.5,false,",
+ };
+ resultSetEqualTest(
+ "SELECT *, s1 FROM root.sg2.** slimit 2 soffset 1 ALIGN BY DEVICE;",
+ expectedHeader,
+ retArray);
+
+ expectedHeader = new String[] {"Time,Device,s1"};
+ retArray =
+ new String[] {
+ "1,root.sg1.d1,1.1,", "2,root.sg1.d1,2.2,", "1,root.sg1.d2,11.1,",
"2,root.sg1.d2,22.2,",
+ };
+ resultSetEqualTest(
+ "SELECT * FROM root.sg1.d1,root.sg1.d2,root.sg1.d6 soffset 1 slimit 1
ALIGN BY DEVICE;",
+ expectedHeader,
+ retArray);
+ retArray =
+ new String[] {
+ "1,root.sg2.d1,1.1,", "2,root.sg2.d1,2.2,", "1,root.sg2.d2,11.1,",
"2,root.sg2.d2,22.2,",
+ };
+ resultSetEqualTest(
+ "SELECT * FROM root.sg2.d1,root.sg2.d2,root.sg2.d6 soffset 1 slimit 1
ALIGN BY DEVICE;",
+ expectedHeader,
+ retArray);
+ }
+
@Test
public void emptyResultTest() {
String[] expectedHeader = new String[] {"Time,Device,s3,s1,s2"};
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
index 5ec7997fdfc..a98503ded40 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
@@ -113,29 +113,47 @@ public class TemplatedAnalyze {
Template template = templates.get(0);
List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
+ ColumnPaginationController paginationController =
+ new ColumnPaginationController(
+ queryStatement.getSeriesLimit(), queryStatement.getSeriesOffset(),
false);
if (template != null) {
for (ResultColumn resultColumn :
queryStatement.getSelectComponent().getResultColumns()) {
Expression expression = resultColumn.getExpression();
if ("*".equals(expression.getOutputSymbol())) {
for (Map.Entry<String, IMeasurementSchema> entry :
template.getSchemaMap().entrySet()) {
- String measurementName = entry.getKey();
- IMeasurementSchema measurementSchema = entry.getValue();
- TimeSeriesOperand measurementPath =
- new TimeSeriesOperand(
- new MeasurementPath(new String[] {measurementName},
measurementSchema));
- outputExpressions.add(new Pair<>(measurementPath, null));
+ if (paginationController.hasCurOffset()) {
+ paginationController.consumeOffset();
+ } else if (paginationController.hasCurLimit()) {
+ String measurementName = entry.getKey();
+ IMeasurementSchema measurementSchema = entry.getValue();
+ TimeSeriesOperand measurementPath =
+ new TimeSeriesOperand(
+ new MeasurementPath(new String[] {measurementName},
measurementSchema));
+ outputExpressions.add(new Pair<>(measurementPath, null));
+ paginationController.consumeLimit();
+ } else {
+ break;
+ }
}
- if (queryStatement.getSelectComponent().getResultColumns().size() ==
1) {
+ if (queryStatement.getSelectComponent().getResultColumns().size() ==
1
+ && !paginationController.hasCurOffset()
+ && !paginationController.hasCurLimit()) {
analysis.setTemplateWildCardQuery();
}
} else if (expression instanceof TimeSeriesOperand) {
String measurementName = ((TimeSeriesOperand)
expression).getPath().getMeasurement();
if (template.getSchemaMap().containsKey(measurementName)) {
- IMeasurementSchema measurementSchema =
template.getSchemaMap().get(measurementName);
- TimeSeriesOperand measurementPath =
- new TimeSeriesOperand(
- new MeasurementPath(new String[] {measurementName},
measurementSchema));
- outputExpressions.add(new Pair<>(measurementPath,
resultColumn.getAlias()));
+ if (paginationController.hasCurOffset()) {
+ paginationController.consumeOffset();
+ } else if (paginationController.hasCurLimit()) {
+ IMeasurementSchema measurementSchema =
template.getSchemaMap().get(measurementName);
+ TimeSeriesOperand measurementPath =
+ new TimeSeriesOperand(
+ new MeasurementPath(new String[] {measurementName},
measurementSchema));
+ outputExpressions.add(new Pair<>(measurementPath,
resultColumn.getAlias()));
+ } else {
+ break;
+ }
}
} else {
return false;