diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/node/StructInfoNode.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/node/StructInfoNode.java index 29618fbd4a..d71a08ea13 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/node/StructInfoNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/node/StructInfoNode.java @@ -19,8 +19,11 @@ package org.apache.doris.nereids.jobs.joinorder.hypergraph.node; import org.apache.doris.nereids.jobs.joinorder.hypergraph.Edge; import org.apache.doris.nereids.jobs.joinorder.hypergraph.HyperGraph; +import org.apache.doris.nereids.trees.plans.GroupPlan; import org.apache.doris.nereids.trees.plans.Plan; +import com.google.common.collect.ImmutableList; + import java.util.ArrayList; import java.util.List; @@ -32,7 +35,7 @@ public class StructInfoNode extends AbstractNode { private List graphs = new ArrayList<>(); public StructInfoNode(int index, Plan plan, List edges) { - super(plan, index, edges); + super(extractPlan(plan), index, edges); } public StructInfoNode(int index, Plan plan) { @@ -44,6 +47,18 @@ public class StructInfoNode extends AbstractNode { this.graphs = graphs; } + private static Plan extractPlan(Plan plan) { + if (plan instanceof GroupPlan) { + //TODO: Note mv can be in logicalExpression, how can we choose it + plan = ((GroupPlan) plan).getGroup().getLogicalExpressions().get(0) + .getPlan(); + } + List children = plan.children().stream() + .map(StructInfoNode::extractPlan) + .collect(ImmutableList.toImmutableList()); + return plan.withChildren(children); + } + public boolean needToFlat() { return !graphs.isEmpty(); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/BuildStructInfoTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/BuildStructInfoTest.java index 816186a486..d6f4f4ac2e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/BuildStructInfoTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/BuildStructInfoTest.java @@ -19,10 +19,14 @@ package org.apache.doris.nereids.rules.exploration.mv; import org.apache.doris.nereids.jobs.joinorder.hypergraph.HyperGraph; import org.apache.doris.nereids.sqltest.SqlTestBase; +import org.apache.doris.nereids.trees.plans.GroupPlan; import org.apache.doris.nereids.util.PlanChecker; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.List; + class BuildStructInfoTest extends SqlTestBase { @Test void testSimpleSQL() { @@ -42,4 +46,24 @@ class BuildStructInfoTest extends SqlTestBase { })); } + + @Test + void testStructInfoNode() { + String sql = "select * from T1 inner join " + + "(select sum(id) as id from T2 where id = 1) T2 " + + "on T1.id = T2.id"; + PlanChecker.from(connectContext) + .analyze(sql) + .rewrite() + .deriveStats() + .matches(logicalJoin() + .when(j -> { + List hyperGraph = HyperGraph.toStructInfo(j); + Assertions.assertTrue(hyperGraph.get(0).getNodes().stream() + .allMatch(n -> n.getPlan() + .collectToList(GroupPlan.class::isInstance).isEmpty())); + return true; + })); + + } }