diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/OtherJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/OtherJoinTest.java index a4062d2edff9c5..4265c637d7dc01 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/OtherJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/OtherJoinTest.java @@ -19,12 +19,17 @@ import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.datasets.tpch.TPCHTestBase; +import org.apache.doris.nereids.trees.expressions.EqualTo; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import org.apache.doris.nereids.util.HyperGraphBuilder; import org.apache.doris.nereids.util.MemoTestUtils; import org.apache.doris.nereids.util.PlanChecker; +import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -68,4 +73,17 @@ private void randomTest(int tableNum, int edgeNum) { Assertions.assertTrue(res1.equals(res2)); } + + @Test + void testOneSideJoin() { + HyperGraphBuilder hyperGraphBuilder = new HyperGraphBuilder(); + Plan plan = hyperGraphBuilder.init(1, 2, 3) + .addEdge(JoinType.LEFT_OUTER_JOIN, 0, 1) + .addEdge(JoinType.LEFT_OUTER_JOIN, 0, 2) + .buildPlan(); + Expression oneSideCond = new EqualTo(plan.child(0).getOutput().get(0), plan.child(0).getOutput().get(2)); + plan = ((LogicalJoin) plan).withJoinConjuncts(ImmutableList.of(), ImmutableList.of(oneSideCond)); + Set> res = hyperGraphBuilder.evaluate(plan); + Assertions.assertEquals(4, res.size()); + } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java index 46660fa07c33c3..1ca771fcafc861 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilder.java @@ -669,9 +669,12 @@ Boolean evaluateExpr(JoinType joinType, Expression expr, Map Integer rv; if (left.containsKey(slots.get(0))) { lv = left.get(slots.get(0)).get(leftIndex); - rv = right.get(slots.get(1)).get(rightIndex); } else { lv = right.get(slots.get(0)).get(rightIndex); + } + if (right.containsKey(slots.get(1))) { + rv = right.get(slots.get(1)).get(rightIndex); + } else { rv = left.get(slots.get(1)).get(leftIndex); } Boolean res = (lv == rv) && (lv != null) && (rv != null);