[feature](Nereids) support complex project in graph simplifier (#26002)
Reject the edge which has an alias when ordering edge
This commit is contained in:
@ -18,15 +18,55 @@
|
||||
package org.apache.doris.nereids.jobs.joinorder.hypergraph;
|
||||
|
||||
import org.apache.doris.nereids.jobs.joinorder.hypergraph.receiver.Counter;
|
||||
import org.apache.doris.nereids.trees.expressions.Alias;
|
||||
import org.apache.doris.nereids.trees.expressions.EqualTo;
|
||||
import org.apache.doris.nereids.trees.plans.JoinType;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
|
||||
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
|
||||
import org.apache.doris.nereids.util.HyperGraphBuilder;
|
||||
import org.apache.doris.nereids.util.LogicalPlanBuilder;
|
||||
import org.apache.doris.nereids.util.PlanConstructor;
|
||||
import org.apache.doris.statistics.Statistics;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import org.apache.hadoop.util.Lists;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
class GraphSimplifierTest {
|
||||
private static final LogicalOlapScan scan1 = PlanConstructor.newLogicalOlapScan(0, "t1", 0);
|
||||
private static final LogicalOlapScan scan2 = PlanConstructor.newLogicalOlapScan(1, "t2", 0);
|
||||
private static final LogicalOlapScan scan3 = PlanConstructor.newLogicalOlapScan(2, "t3", 0);
|
||||
|
||||
@Test
|
||||
void testComplexProject() {
|
||||
Alias alias1 = new Alias(scan1.getOutput().get(0), "p1");
|
||||
LogicalPlan project1 = new LogicalPlanBuilder(scan1)
|
||||
.projectExprs(Lists.newArrayList(alias1)).build();
|
||||
Alias alias2 = new Alias(scan2.getOutput().get(0), "p2");
|
||||
LogicalPlan project2 = new LogicalPlanBuilder(scan2)
|
||||
.projectExprs(Lists.newArrayList(alias2)).build();
|
||||
Alias alias3 = new Alias(scan3.getOutput().get(0), "p3");
|
||||
LogicalPlan project3 = new LogicalPlanBuilder(scan3)
|
||||
.projectExprs(Lists.newArrayList(alias3)).build();
|
||||
LogicalPlan join = new LogicalPlanBuilder(project1)
|
||||
.join(project2, JoinType.INNER_JOIN, Lists.newArrayList(new EqualTo(alias1.toSlot(), alias2.toSlot())), new ArrayList<>())
|
||||
.join(project3, JoinType.INNER_JOIN, Lists.newArrayList(new EqualTo(alias2.toSlot(), alias3.toSlot())), new ArrayList<>())
|
||||
.build();
|
||||
HyperGraph hyperGraph = HyperGraphBuilder.buildHyperGraphFromPlan(join);
|
||||
for (Node node : hyperGraph.getNodes()) {
|
||||
node.getGroup().setStatistics(new Statistics(1, new HashMap<>()));
|
||||
}
|
||||
GraphSimplifier graphSimplifier = new GraphSimplifier(hyperGraph);
|
||||
while (graphSimplifier.applySimplificationStep()) {
|
||||
}
|
||||
Assertions.assertNull(graphSimplifier.getLastAppliedSteps());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testStarQuery() {
|
||||
// t1
|
||||
@ -48,6 +88,7 @@ class GraphSimplifierTest {
|
||||
SubgraphEnumerator subgraphEnumerator = new SubgraphEnumerator(counter, hyperGraph);
|
||||
subgraphEnumerator.enumerate();
|
||||
for (int count : counter.getAllCount().values()) {
|
||||
System.out.println(count);
|
||||
Assertions.assertTrue(count < 10);
|
||||
}
|
||||
Assertions.assertTrue(graphSimplifier.isTotalOrder());
|
||||
|
||||
@ -324,6 +324,17 @@ public class HyperGraphBuilder {
|
||||
return hyperGraph;
|
||||
}
|
||||
|
||||
public static HyperGraph buildHyperGraphFromPlan(Plan plan) {
|
||||
CascadesContext cascadesContext = MemoTestUtils.createCascadesContext(MemoTestUtils.createConnectContext(),
|
||||
plan);
|
||||
JoinOrderJob joinOrderJob = new JoinOrderJob(cascadesContext.getMemo().getRoot(),
|
||||
cascadesContext.getCurrentJobContext());
|
||||
cascadesContext.getJobScheduler().executeJobPool(cascadesContext);
|
||||
HyperGraph hyperGraph = new HyperGraph();
|
||||
joinOrderJob.buildGraph(cascadesContext.getMemo().getRoot(), hyperGraph);
|
||||
return hyperGraph;
|
||||
}
|
||||
|
||||
private void injectRowcount(Group group) {
|
||||
if (!group.isValidJoinGroup()) {
|
||||
LogicalOlapScan scanPlan = (LogicalOlapScan) group.getLogicalExpression().getPlan();
|
||||
|
||||
Reference in New Issue
Block a user