[feature](Nereids) support complex project in graph simplifier (#26002)

Reject the edge which has an alias when ordering edge
This commit is contained in:
谢健
2023-10-27 14:38:54 +08:00
committed by GitHub
parent a6d64c6b25
commit 4aebe879a6
5 changed files with 92 additions and 3 deletions

View File

@ -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());

View File

@ -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();