Skip to content

Commit

Permalink
[fix](Nereids) dphyper support evaluate join that has one side condit…
Browse files Browse the repository at this point in the history
…ion (#33702) (#35268)
  • Loading branch information
keanji-x authored May 26, 2024
1 parent 80bb393 commit 0496785
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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<List<String>> res = hyperGraphBuilder.evaluate(plan);
Assertions.assertEquals(4, res.size());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -669,9 +669,12 @@ Boolean evaluateExpr(JoinType joinType, Expression expr, Map<Slot, List<Integer>
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);
Expand Down

0 comments on commit 0496785

Please sign in to comment.