|
71 | 71 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.aggregation; |
72 | 72 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.aggregationFunction; |
73 | 73 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.aggregationTableScan; |
| 74 | +import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.exchange; |
74 | 75 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.filter; |
75 | 76 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.join; |
| 77 | +import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.mergeSort; |
76 | 78 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.output; |
77 | 79 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.project; |
78 | 80 | import static org.apache.iotdb.db.queryengine.plan.relational.planner.assertions.PlanMatchPattern.singleGroupingSet; |
@@ -635,4 +637,126 @@ public void otherInnerJoinTests() { |
635 | 637 | + "ON t1.time = t2.time ORDER BY t1.tag1 OFFSET 3 LIMIT 6", |
636 | 638 | false); |
637 | 639 | } |
| 640 | + |
| 641 | + @Test |
| 642 | + public void testJoinSortProperties() { |
| 643 | + // FULL JOIN |
| 644 | + PlanTester planTester = new PlanTester(); |
| 645 | + sql = |
| 646 | + "select * from table1 t1 " |
| 647 | + + "full join table1 t2 using (time, s1)" |
| 648 | + + "full join table1 t3 using (time, s1)"; |
| 649 | + logicalQueryPlan = planTester.createPlan(sql); |
| 650 | + assertPlan( |
| 651 | + logicalQueryPlan.getRootNode(), |
| 652 | + output( |
| 653 | + project( |
| 654 | + join( |
| 655 | + sort( |
| 656 | + project( |
| 657 | + join( |
| 658 | + sort(tableScan("testdb.table1")), |
| 659 | + sort(tableScan("testdb.table1"))))), |
| 660 | + sort(tableScan("testdb.table1")))))); |
| 661 | + |
| 662 | + assertPlan(planTester.getFragmentPlan(0), output(project(join(exchange(), exchange())))); |
| 663 | + |
| 664 | + // the sort node above JoinNode has been eliminated |
| 665 | + assertPlan(planTester.getFragmentPlan(1), project(join(exchange(), exchange()))); |
| 666 | + |
| 667 | + assertPlan(planTester.getFragmentPlan(2), mergeSort(exchange(), exchange(), exchange())); |
| 668 | + |
| 669 | + assertPlan(planTester.getFragmentPlan(3), sort(tableScan("testdb.table1"))); |
| 670 | + |
| 671 | + assertPlan(planTester.getFragmentPlan(4), sort(tableScan("testdb.table1"))); |
| 672 | + |
| 673 | + assertPlan(planTester.getFragmentPlan(5), sort(tableScan("testdb.table1"))); |
| 674 | + |
| 675 | + assertPlan(planTester.getFragmentPlan(6), mergeSort(exchange(), exchange(), exchange())); |
| 676 | + |
| 677 | + assertPlan(planTester.getFragmentPlan(7), sort(tableScan("testdb.table1"))); |
| 678 | + |
| 679 | + assertPlan(planTester.getFragmentPlan(8), sort(tableScan("testdb.table1"))); |
| 680 | + |
| 681 | + assertPlan(planTester.getFragmentPlan(9), sort(tableScan("testdb.table1"))); |
| 682 | + |
| 683 | + assertPlan(planTester.getFragmentPlan(10), mergeSort(exchange(), exchange(), exchange())); |
| 684 | + |
| 685 | + // LEFT |
| 686 | + sql = |
| 687 | + "select * from table1 t1 " |
| 688 | + + "left join table1 t2 using (time, s1)" |
| 689 | + + "left join table1 t3 using (time, s1)"; |
| 690 | + assertLeftOrInner(planTester); |
| 691 | + |
| 692 | + // INNER JOIN |
| 693 | + sql = |
| 694 | + "select * from table1 t1 " |
| 695 | + + "inner join table1 t2 using (time, s1)" |
| 696 | + + "inner join table1 t3 using (time, s1)"; |
| 697 | + assertLeftOrInner(planTester); |
| 698 | + |
| 699 | + // RIGHT JOIN |
| 700 | + sql = |
| 701 | + "select * from table1 t1 " |
| 702 | + + "right join table1 t2 using (time, s1)" |
| 703 | + + "right join table1 t3 using (time, s1)"; |
| 704 | + logicalQueryPlan = planTester.createPlan(sql); |
| 705 | + assertPlan( |
| 706 | + logicalQueryPlan.getRootNode(), |
| 707 | + output( |
| 708 | + join( |
| 709 | + sort(tableScan("testdb.table1")), |
| 710 | + sort(join(sort(tableScan("testdb.table1")), sort(tableScan("testdb.table1"))))))); |
| 711 | + |
| 712 | + assertPlan(planTester.getFragmentPlan(0), output(join(exchange(), exchange()))); |
| 713 | + |
| 714 | + assertPlan(planTester.getFragmentPlan(1), mergeSort(exchange(), exchange(), exchange())); |
| 715 | + |
| 716 | + assertPlan(planTester.getFragmentPlan(2), sort(tableScan("testdb.table1"))); |
| 717 | + |
| 718 | + assertPlan(planTester.getFragmentPlan(3), sort(tableScan("testdb.table1"))); |
| 719 | + |
| 720 | + assertPlan(planTester.getFragmentPlan(4), sort(tableScan("testdb.table1"))); |
| 721 | + |
| 722 | + // the sort node above JoinNode has been eliminated |
| 723 | + assertPlan(planTester.getFragmentPlan(5), join(exchange(), exchange())); |
| 724 | + |
| 725 | + assertPlan(planTester.getFragmentPlan(6), mergeSort(exchange(), exchange(), exchange())); |
| 726 | + |
| 727 | + assertPlan(planTester.getFragmentPlan(10), mergeSort(exchange(), exchange(), exchange())); |
| 728 | + } |
| 729 | + |
| 730 | + private void assertLeftOrInner(PlanTester planTester) { |
| 731 | + logicalQueryPlan = planTester.createPlan(sql); |
| 732 | + assertPlan( |
| 733 | + logicalQueryPlan.getRootNode(), |
| 734 | + output( |
| 735 | + join( |
| 736 | + sort(join(sort(tableScan("testdb.table1")), sort(tableScan("testdb.table1")))), |
| 737 | + sort(tableScan("testdb.table1"))))); |
| 738 | + |
| 739 | + assertPlan(planTester.getFragmentPlan(0), output(join(exchange(), exchange()))); |
| 740 | + |
| 741 | + // the sort node above JoinNode has been eliminated |
| 742 | + assertPlan(planTester.getFragmentPlan(1), join(exchange(), exchange())); |
| 743 | + |
| 744 | + assertPlan(planTester.getFragmentPlan(2), mergeSort(exchange(), exchange(), exchange())); |
| 745 | + |
| 746 | + assertPlan(planTester.getFragmentPlan(3), sort(tableScan("testdb.table1"))); |
| 747 | + |
| 748 | + assertPlan(planTester.getFragmentPlan(4), sort(tableScan("testdb.table1"))); |
| 749 | + |
| 750 | + assertPlan(planTester.getFragmentPlan(5), sort(tableScan("testdb.table1"))); |
| 751 | + |
| 752 | + assertPlan(planTester.getFragmentPlan(6), mergeSort(exchange(), exchange(), exchange())); |
| 753 | + |
| 754 | + assertPlan(planTester.getFragmentPlan(7), sort(tableScan("testdb.table1"))); |
| 755 | + |
| 756 | + assertPlan(planTester.getFragmentPlan(8), sort(tableScan("testdb.table1"))); |
| 757 | + |
| 758 | + assertPlan(planTester.getFragmentPlan(9), sort(tableScan("testdb.table1"))); |
| 759 | + |
| 760 | + assertPlan(planTester.getFragmentPlan(10), mergeSort(exchange(), exchange(), exchange())); |
| 761 | + } |
638 | 762 | } |
0 commit comments