|
21 | 21 |
|
22 | 22 | import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation; |
23 | 23 | import org.apache.iotdb.db.queryengine.plan.planner.plan.FragmentInstance; |
| 24 | +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode; |
| 25 | +import org.apache.iotdb.db.queryengine.plan.relational.planner.node.AggregationNode; |
24 | 26 | import org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode; |
25 | 27 | import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.ParsingException; |
26 | 28 |
|
|
32 | 34 |
|
33 | 35 | import static org.junit.Assert.assertEquals; |
34 | 36 | import static org.junit.Assert.assertTrue; |
| 37 | +import static org.junit.Assert.fail; |
35 | 38 |
|
36 | 39 | public class ReplicaHintPlannerTest extends PlanTester { |
37 | 40 |
|
@@ -91,6 +94,15 @@ public void testReplicaHintWithConflict() { |
91 | 94 | } |
92 | 95 | } |
93 | 96 |
|
| 97 | + @Test |
| 98 | + public void testReplicaHintWithAgg() { |
| 99 | + String sql = "SELECT /*+ REPLICA(0) */ tag1, avg(s1) FROM table1 GROUP BY tag1"; |
| 100 | + createPlan(sql); |
| 101 | + for (int fragment = 1; fragment <= 3; fragment++) { |
| 102 | + verifyReplica(fragment, ImmutableMap.of("table1", 0)); |
| 103 | + } |
| 104 | + } |
| 105 | + |
94 | 106 | @Test |
95 | 107 | public void testRegionRouteHintWithNegativeRegion() { |
96 | 108 | String sql = "SELECT /*+ REGION_ROUTE((-1, 1)) */ * FROM table1"; |
@@ -178,18 +190,29 @@ public void testParallelHint() { |
178 | 190 |
|
179 | 191 | private void verifyReplica(int fragment, Map<String, Integer> tableToReplica) { |
180 | 192 | FragmentInstance fragmentInstance = getFragmentInstance(fragment); |
181 | | - TableScanNode fragmentPlan = (TableScanNode) getFragmentPlan(fragment); |
| 193 | + PlanNode fragmentPlan = getFragmentPlan(fragment); |
| 194 | + |
| 195 | + TableScanNode tableScanNode = null; |
| 196 | + if (fragmentPlan instanceof AggregationNode) { |
| 197 | + tableScanNode = (TableScanNode) fragmentPlan.getChildren().get(0); |
| 198 | + } else if (fragmentPlan instanceof TableScanNode) { |
| 199 | + tableScanNode = (TableScanNode) fragmentPlan; |
| 200 | + } |
| 201 | + if (tableScanNode == null) { |
| 202 | + fail("tableScanNode must not be null"); |
| 203 | + } |
| 204 | + |
182 | 205 | assertEquals( |
183 | | - fragmentPlan.getRegionReplicaSet().getRegionId().getId(), |
| 206 | + tableScanNode.getRegionReplicaSet().getRegionId().getId(), |
184 | 207 | fragmentInstance.getRegionReplicaSet().getRegionId().getId()); |
185 | 208 |
|
186 | 209 | String tableName = |
187 | | - fragmentPlan.getAlias() != null |
188 | | - ? fragmentPlan.getAlias().getValue() |
189 | | - : fragmentPlan.getQualifiedObjectName().getObjectName(); |
| 210 | + tableScanNode.getAlias() != null |
| 211 | + ? tableScanNode.getAlias().getValue() |
| 212 | + : tableScanNode.getQualifiedObjectName().getObjectName(); |
190 | 213 |
|
191 | 214 | List<TDataNodeLocation> replicaNodes = |
192 | | - fragmentPlan.getRegionReplicaSet().getDataNodeLocations(); |
| 215 | + tableScanNode.getRegionReplicaSet().getDataNodeLocations(); |
193 | 216 | TDataNodeLocation queryNode = fragmentInstance.getHostDataNode(); |
194 | 217 |
|
195 | 218 | assertEquals(2, replicaNodes.size()); |
|
0 commit comments