This is an automated email from the ASF dual-hosted git repository. caogaofei pushed a commit to branch beyyes/fix_align_by_device_slimit in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 57be2f024551e54a1a24562fedfd062dd53a5470 Author: Beyyes <[email protected]> AuthorDate: Tue Dec 12 14:53:50 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;
