[improve](Nereids): check same logicalProperty when insert a Group. (#12469)

This commit is contained in:
jakevin
2022-09-09 00:00:11 +08:00
committed by GitHub
parent 2ccbbb5392
commit 8478efad44
3 changed files with 16 additions and 8 deletions

View File

@ -219,6 +219,10 @@ public class Memo {
* and the second element is a reference of node in Memo
*/
private CopyInResult doCopyIn(Plan plan, @Nullable Group targetGroup) {
// check logicalproperties, must same output in a Group.
if (targetGroup != null && !plan.getLogicalProperties().equals(targetGroup.getLogicalProperties())) {
throw new IllegalStateException("Insert a plan into targetGroup but differ in logicalproperties");
}
Optional<GroupExpression> groupExpr = plan.getGroupExpression();
if (groupExpr.isPresent() && groupExpressions.containsKey(groupExpr.get())) {
return CopyInResult.of(false, groupExpr.get());

View File

@ -20,11 +20,13 @@ package org.apache.doris.nereids.memo;
import org.apache.doris.nereids.trees.plans.JoinType;
import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
import org.apache.doris.nereids.util.MemoTestUtils;
import org.apache.doris.nereids.util.PatternMatchSupported;
import org.apache.doris.nereids.util.PlanChecker;
import org.apache.doris.nereids.util.PlanConstructor;
import com.google.common.collect.Lists;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@ -58,10 +60,11 @@ public class MemoCopyInTest implements PatternMatchSupported {
.transform(
// swap join's children
logicalJoin(logicalOlapScan(), logicalOlapScan()).then(joinBA ->
new LogicalJoin<>(JoinType.INNER_JOIN, joinBA.right(), joinBA.left())
new LogicalProject<>(Lists.newArrayList(joinBA.getOutput()),
new LogicalJoin<>(JoinType.INNER_JOIN, joinBA.right(), joinBA.left()))
))
.checkGroupNum(5)
.checkGroupExpressionNum(6)
.checkGroupNum(6)
.checkGroupExpressionNum(7)
.checkMemo(memo -> {
Group root = memo.getRoot();
Assertions.assertEquals(1, root.getLogicalExpressions().size());
@ -69,7 +72,8 @@ public class MemoCopyInTest implements PatternMatchSupported {
Assertions.assertEquals(2, joinABC.child(0).getLogicalExpressions().size());
Assertions.assertEquals(1, joinABC.child(1).getLogicalExpressions().size());
GroupExpression joinAB = joinABC.child(0).getLogicalExpressions().get(0);
GroupExpression joinBA = joinABC.child(0).getLogicalExpressions().get(1);
GroupExpression project = joinABC.child(0).getLogicalExpressions().get(1);
GroupExpression joinBA = project.child(0).getLogicalExpression();
Assertions.assertTrue(joinAB.getPlan() instanceof LogicalJoin);
Assertions.assertTrue(joinBA.getPlan() instanceof LogicalJoin);
});

View File

@ -163,19 +163,20 @@ public class PlanChecker {
return transform(cascadesContext.getMemo().getRoot(), rule);
}
// Exploration Rule.
public PlanChecker transform(Group group, Rule rule) {
// copy groupExpressions can prevent ConcurrentModificationException
for (GroupExpression logicalExpression : Lists.newArrayList(group.getLogicalExpressions())) {
transform(logicalExpression, rule);
transformApply(logicalExpression, rule);
}
for (GroupExpression physicalExpression : Lists.newArrayList(group.getPhysicalExpressions())) {
transform(physicalExpression, rule);
transformApply(physicalExpression, rule);
}
return this;
}
public PlanChecker transform(GroupExpression groupExpression, Rule rule) {
private void transformApply(GroupExpression groupExpression, Rule rule) {
GroupExpressionMatching matchResult = new GroupExpressionMatching(rule.getPattern(), groupExpression);
for (Plan before : matchResult) {
@ -188,7 +189,6 @@ public class PlanChecker {
for (Group childGroup : groupExpression.children()) {
transform(childGroup, rule);
}
return this;
}
public PlanChecker matchesFromRoot(PatternDescriptor<? extends Plan> patternDesc) {