This is an automated email from the ASF dual-hosted git repository. caogaofei pushed a commit to branch fix_template_offset_limit_align_by_device in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 08616f40f61355106c9339355d981ba6d5262601 Author: Beyyes <[email protected]> AuthorDate: Thu Dec 19 16:55:28 2024 +0800 fix error in template + sort + offset + limit + align by device --- .../IoTDBAlignByDeviceWithTemplateIT.java | 28 ++++++++++++++++++++-- .../queryengine/plan/analyze/AnalyzeVisitor.java | 11 +++++---- .../plan/analyze/TemplatedAggregationAnalyze.java | 6 ++--- .../queryengine/plan/analyze/TemplatedAnalyze.java | 7 +++--- 4 files changed, 38 insertions(+), 14 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 05e2104b904..a71cb773713 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 @@ -59,6 +59,9 @@ public class IoTDBAlignByDeviceWithTemplateIT { "INSERT INTO root.sg2.d4(timestamp,s1,s2,s3) values(1,1111.1,true,1111), (5,5555.5,false,5555);", }; + String[] expectedHeader; + String[] retArray; + @BeforeClass public static void setUp() throws Exception { EnvFactory.getEnv().initClusterEnvironment(); @@ -70,11 +73,32 @@ public class IoTDBAlignByDeviceWithTemplateIT { EnvFactory.getEnv().cleanClusterEnvironment(); } + @Test + public void singleDeviceTest() { + expectedHeader = new String[] {"Time,Device,s3,s1,s2"}; + retArray = + new String[] { + "1,root.sg1.d1,1,1.1,false,", + }; + resultSetEqualTest( + "SELECT * FROM root.sg1.d1 order by time desc offset 1 limit 1 ALIGN BY DEVICE;", + expectedHeader, + retArray); + retArray = + new String[] { + "1,root.sg2.d1,1,1.1,false,", + }; + resultSetEqualTest( + "SELECT * FROM root.sg2.d1 order by time desc offset 1 limit 1 ALIGN BY DEVICE;", + expectedHeader, + retArray); + } + @Test public void selectWildcardNoFilterTest() { // 1. order by device - String[] expectedHeader = new String[] {"Time,Device,s3,s1,s2"}; - String[] retArray = + expectedHeader = new String[] {"Time,Device,s3,s1,s2"}; + retArray = new String[] { "1,root.sg1.d1,1,1.1,false,", "2,root.sg1.d1,2,2.2,false,", diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java index 224d22520a0..ed441e9dc00 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java @@ -319,13 +319,16 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> List<Pair<Expression, String>> outputExpressions; if (queryStatement.isAlignByDevice()) { - if (TemplatedAnalyze.canBuildPlanUseTemplate( - analysis, queryStatement, partitionFetcher, schemaTree, context)) { + List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree); + + if (deviceList.size() > 1 + && TemplatedAnalyze.canBuildPlanUseTemplate( + analysis, queryStatement, partitionFetcher, schemaTree, context, deviceList)) { + // when device size is less than 1, there is no need to use template optimization, i.e. no + // need to extract common variables return analysis; } - List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree); - if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) { // remove the device which won't appear in resultSet after limit/offset deviceList = diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java index 495d144a80d..dc7df32007f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAggregationAnalyze.java @@ -54,7 +54,6 @@ import static org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.se import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDataPartition; import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceToWhere; import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeDeviceViewOutput; -import static org.apache.iotdb.db.queryengine.plan.analyze.TemplatedAnalyze.analyzeFrom; import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.canPushDownLimitOffsetInGroupByTimeForDevice; import static org.apache.iotdb.db.queryengine.plan.optimization.LimitOffsetPushDown.pushDownLimitOffsetInGroupByTimeForDevice; import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME; @@ -68,7 +67,8 @@ public class TemplatedAggregationAnalyze { IPartitionFetcher partitionFetcher, ISchemaTree schemaTree, MPPQueryContext context, - Template template) { + Template template, + List<PartialPath> deviceList) { // not support order by expression and non-aligned template if (queryStatement.hasOrderByExpression() || !template.isDirectAligned()) { @@ -77,8 +77,6 @@ public class TemplatedAggregationAnalyze { analysis.setNoWhereAndAggregation(false); - List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree); - if (canPushDownLimitOffsetInGroupByTimeForDevice(queryStatement)) { // remove the device which won't appear in resultSet after limit/offset deviceList = 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 c1f0971b293..ea70fcb0e3a 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 @@ -97,7 +97,8 @@ public class TemplatedAnalyze { QueryStatement queryStatement, IPartitionFetcher partitionFetcher, ISchemaTree schemaTree, - MPPQueryContext context) { + MPPQueryContext context, + List<PartialPath> deviceList) { if (queryStatement.getGroupByComponent() != null || queryStatement.isSelectInto() || queryStatement.hasFill() @@ -114,7 +115,7 @@ public class TemplatedAnalyze { if (queryStatement.isAggregationQuery()) { return canBuildAggregationPlanUseTemplate( - analysis, queryStatement, partitionFetcher, schemaTree, context, template); + analysis, queryStatement, partitionFetcher, schemaTree, context, template, deviceList); } List<Pair<Expression, String>> outputExpressions = new ArrayList<>(); @@ -174,8 +175,6 @@ public class TemplatedAnalyze { analyzeSelect(queryStatement, analysis, outputExpressions, template); - List<PartialPath> deviceList = analyzeFrom(queryStatement, schemaTree); - analyzeDeviceToWhere(analysis, queryStatement); if (analysis.getWhereExpression() != null && analysis.getWhereExpression().equals(ConstantOperand.FALSE)) {
