|
35 | 35 | import org.apache.doris.nereids.trees.plans.physical.PhysicalProject; |
36 | 36 | import org.apache.doris.nereids.types.IntegerType; |
37 | 37 | import org.apache.doris.nereids.util.PlanConstructor; |
| 38 | +import org.apache.doris.planner.AggregationNode; |
38 | 39 | import org.apache.doris.planner.OlapScanNode; |
39 | 40 | import org.apache.doris.planner.PlanFragment; |
40 | 41 | import org.apache.doris.planner.PlanNode; |
| 42 | +import org.apache.doris.planner.Planner; |
| 43 | +import org.apache.doris.utframe.TestWithFeService; |
41 | 44 |
|
42 | 45 | import com.google.common.collect.ImmutableList; |
43 | 46 | import com.google.common.collect.ImmutableSet; |
44 | 47 | import mockit.Injectable; |
45 | 48 | import org.junit.jupiter.api.Assertions; |
46 | 49 | import org.junit.jupiter.api.Test; |
47 | 50 |
|
| 51 | +import java.lang.reflect.Field; |
48 | 52 | import java.util.ArrayList; |
49 | 53 | import java.util.Collections; |
50 | 54 | import java.util.List; |
51 | 55 | import java.util.Optional; |
52 | 56 |
|
53 | | -public class PhysicalPlanTranslatorTest { |
| 57 | +public class PhysicalPlanTranslatorTest extends TestWithFeService { |
54 | 58 |
|
55 | 59 | @Test |
56 | 60 | public void testOlapPrune(@Injectable LogicalProperties placeHolder) throws Exception { |
@@ -86,4 +90,39 @@ public void testOlapPrune(@Injectable LogicalProperties placeHolder) throws Exce |
86 | 90 | planNode.collect(OlapScanNode.class::isInstance, scanNodeList); |
87 | 91 | Assertions.assertEquals(2, scanNodeList.get(0).getTupleDesc().getSlots().size()); |
88 | 92 | } |
| 93 | + |
| 94 | + @Test |
| 95 | + public void testAggNeedsFinalize() throws Exception { |
| 96 | + createDatabase("test_db"); |
| 97 | + createTable("create table test_db.t(a int, b int) distributed by hash(a) buckets 3 " |
| 98 | + + "properties('replication_num' = '1');"); |
| 99 | + connectContext.getSessionVariable().setDisableNereidsRules("prune_empty_partition"); |
| 100 | + String querySql = "select b from test_db.t group by b"; |
| 101 | + Planner planner = getSQLPlanner(querySql); |
| 102 | + Assertions.assertNotNull(planner); |
| 103 | + |
| 104 | + List<PlanFragment> fragments = planner.getFragments(); |
| 105 | + Assertions.assertNotNull(fragments); |
| 106 | + Assertions.assertFalse(fragments.isEmpty()); |
| 107 | + |
| 108 | + List<AggregationNode> aggNodes = new ArrayList<>(); |
| 109 | + for (PlanFragment fragment : fragments) { |
| 110 | + PlanNode root = fragment.getPlanRoot(); |
| 111 | + if (root != null) { |
| 112 | + root.collect(AggregationNode.class::isInstance, aggNodes); |
| 113 | + } |
| 114 | + } |
| 115 | + Assertions.assertEquals(2, aggNodes.size()); |
| 116 | + Field needsFinalizeField = AggregationNode.class.getDeclaredField("needsFinalize"); |
| 117 | + needsFinalizeField.setAccessible(true); |
| 118 | + AggregationNode upperAggNode = aggNodes.get(0); |
| 119 | + AggregationNode lowerAggNode = aggNodes.get(1); |
| 120 | + |
| 121 | + boolean lowerNeedsFinalize = needsFinalizeField.getBoolean(lowerAggNode); |
| 122 | + Assertions.assertFalse(lowerNeedsFinalize, |
| 123 | + "lower AggregationNode needsFinalize should be false"); |
| 124 | + boolean upperNeedsFinalize = needsFinalizeField.getBoolean(upperAggNode); |
| 125 | + Assertions.assertTrue(upperNeedsFinalize, |
| 126 | + "upper AggregationNode needsFinalize should be true"); |
| 127 | + } |
89 | 128 | } |
0 commit comments