[improve](Nereids): check same logicalProperty when insert a Group. (#12469)
This commit is contained in:
@ -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());
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user