Skip to content

Commit 236c098

Browse files
authored
[To dev/1.3]Support order by time for Agg align by device query with cross region data
1 parent 0bb345c commit 236c098

3 files changed

Lines changed: 34 additions & 3 deletions

File tree

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,8 +1174,8 @@ public Operator visitAggregationMergeSort(
11741174

11751175
List<SortItem> sortItemList = node.getMergeOrderParameter().getSortItemList();
11761176
if (!sortItemList.get(0).getSortKey().equalsIgnoreCase("Device")) {
1177-
throw new IllegalArgumentException(
1178-
"Only order by device align by device support AggregationMergeSortNode.");
1177+
throw new IllegalStateException(
1178+
"AggregationMergeSortNode without order by device should not appear here");
11791179
}
11801180

11811181
boolean timeAscending = true;

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
8383
import org.apache.iotdb.db.utils.constant.SqlConstant;
8484

85+
import com.google.common.collect.ImmutableList;
8586
import org.apache.tsfile.enums.TSDataType;
8687

8788
import java.util.ArrayList;
@@ -330,12 +331,23 @@ public List<PlanNode> visitDeviceView(DeviceViewNode node, DistributionPlanConte
330331
}
331332
}
332333

334+
OrderByParameter orderByParameter;
335+
List<SortItem> sortItemList = node.getMergeOrderParameter().getSortItemList();
336+
if (!sortItemList.get(0).getSortKey().equalsIgnoreCase("Device")) {
337+
// When reach here, it means DeviceView is order by time with only one device, it is no
338+
// problem to transform order by time to order by device.
339+
// SortItems here will only be Time and Device, see planDeviceView().
340+
orderByParameter =
341+
new OrderByParameter(ImmutableList.of(sortItemList.get(1), sortItemList.get(0)));
342+
} else {
343+
orderByParameter = node.getMergeOrderParameter();
344+
}
333345
boolean hasGroupBy =
334346
analysis.getGroupByTimeParameter() != null || analysis.hasGroupByParameter();
335347
AggregationMergeSortNode mergeSortNode =
336348
new AggregationMergeSortNode(
337349
context.queryContext.getQueryId().genPlanNodeId(),
338-
node.getMergeOrderParameter(),
350+
orderByParameter,
339351
node.getOutputColumnNames(),
340352
deviceViewOutputExpressions,
341353
hasGroupBy);

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AggregationAlignByDeviceTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,13 @@
3939
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.sink.IdentitySinkNode;
4040
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.sink.ShuffleSinkNode;
4141
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.SeriesAggregationScanNode;
42+
import org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
4243

4344
import com.google.common.collect.ImmutableList;
4445
import org.junit.Test;
4546

47+
import java.util.List;
48+
4649
import static org.junit.Assert.assertEquals;
4750
import static org.junit.Assert.assertTrue;
4851

@@ -465,5 +468,21 @@ public void crossRegionTest() {
465468
"last_value(root.sg.d1.s2)",
466469
"max_time(root.sg.d1.s2)"));
467470
}
471+
472+
// order by time
473+
sql = "select last_value(s1),last_value(s2)from root.sg.d1 order by time align by device";
474+
analysis = Util.analyze(sql, context);
475+
logicalPlanNode = Util.genLogicalPlan(analysis, context);
476+
planner = new DistributionPlanner(analysis, new LogicalQueryPlan(context, logicalPlanNode));
477+
plan = planner.planFragments();
478+
assertEquals(2, plan.getInstances().size());
479+
480+
firstFiRoot = plan.getInstances().get(0).getFragment().getPlanNodeTree().getChildren().get(0);
481+
assertTrue(firstFiRoot instanceof AggregationMergeSortNode);
482+
assertTrue(firstFiRoot.getChildren().get(0) instanceof DeviceViewNode);
483+
List<SortItem> sortItemList =
484+
((AggregationMergeSortNode) firstFiRoot).getMergeOrderParameter().getSortItemList();
485+
assertEquals(sortItemList.get(0).getSortKey().toLowerCase(), "device");
486+
assertEquals(sortItemList.get(1).getSortKey().toLowerCase(), "time");
468487
}
469488
}

0 commit comments

Comments
 (0)