This is an automated email from the ASF dual-hosted git repository.

huajianlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 7ca6f8b6a2 [refactor](Nereids)split rewrite and insert into memo to 2 
functions (#11342)
7ca6f8b6a2 is described below

commit 7ca6f8b6a293c39d1eac658f1485243dd739b060
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Mon Aug 1 14:44:01 2022 +0800

    [refactor](Nereids)split rewrite and insert into memo to 2 functions 
(#11342)
    
    Split rewrite and insert into memo to 2 functions to make the code easy to 
read.
---
 .../main/java/org/apache/doris/catalog/Table.java  |   2 +-
 .../java/org/apache/doris/nereids/memo/Memo.java   |  68 +++++----
 .../nereids/{ => datasets}/ssb/AnalyzeSSBTest.java |   2 +-
 .../{ => datasets}/ssb/SSBJoinReorderTest.java     |   2 +-
 .../nereids/{ => datasets}/ssb/SSBTestBase.java    |   4 +-
 .../doris/nereids/{ => datasets}/ssb/SSBUtils.java |   2 +-
 .../{ => datasets}/tpch/AnalyzeCheckTestBase.java  |   2 +-
 .../{ => datasets}/tpch/AnalyzeTPCHTest.java       |   2 +-
 .../nereids/{ => datasets}/tpch/TPCHTestBase.java  |   2 +-
 .../nereids/{ => datasets}/tpch/TPCHUtils.java     |   2 +-
 .../org/apache/doris/nereids/memo/MemoTest.java    | 152 ++++++++++++++-------
 .../nereids/trees/expressions/SubqueryTest.java    |   2 +-
 .../{plan => trees/plans}/TestPlanOutput.java      |   4 +-
 13 files changed, 161 insertions(+), 85 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java
index e41b835d07..c7fdfce7fd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java
@@ -269,7 +269,7 @@ public class Table extends MetaObject implements Writable, 
TableIf {
         if (full) {
             return fullSchema;
         } else {
-            return fullSchema.stream().filter(column -> 
column.isVisible()).collect(Collectors.toList());
+            return 
fullSchema.stream().filter(Column::isVisible).collect(Collectors.toList());
         }
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
index aa96af697d..16d02e8fa9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
@@ -26,7 +26,6 @@ import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.qe.ConnectContext;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -92,8 +91,11 @@ public class Memo {
         node = replaceChildrenToGroupPlan(node, childrenGroups);
         GroupExpression newGroupExpression = new GroupExpression(node);
         newGroupExpression.setChildren(childrenGroups);
-        return insertOrRewriteGroupExpression(newGroupExpression, target, 
rewrite,
-                node.getLogicalProperties());
+        if (rewrite) {
+            return rewriteGroupExpression(newGroupExpression, target, 
node.getLogicalProperties());
+        } else {
+            return insertGroupExpression(newGroupExpression, target, 
node.getLogicalProperties());
+        }
         // TODO: need to derive logical property if generate new group. 
currently we not copy logical plan into
     }
 
@@ -122,44 +124,64 @@ public class Memo {
     }
 
     /**
-     * Insert or rewrite groupExpression to target group.
+     * Insert groupExpression to target group.
      * If group expression is already in memo and target group is not null, we 
merge two groups.
      * If target is null, generate new group.
-     * If rewrite is true, rewrite the groupExpression to target group.
+     * If target is not null, add group expression to target group
      *
      * @param groupExpression groupExpression to insert
-     * @param target target group to insert or rewrite groupExpression
-     * @param rewrite whether to rewrite the groupExpression to target group
+     * @param target target group to insert groupExpression
      * @return a pair, in which the first element is true if a newly generated 
groupExpression added into memo,
      *         and the second element is a reference of node in Memo
      */
-    private Pair<Boolean, GroupExpression> 
insertOrRewriteGroupExpression(GroupExpression groupExpression, Group target,
-            boolean rewrite, LogicalProperties logicalProperties) {
+    private Pair<Boolean, GroupExpression> insertGroupExpression(
+            GroupExpression groupExpression, Group target, LogicalProperties 
logicalProperties) {
         GroupExpression existedGroupExpression = 
groupExpressions.get(groupExpression);
         if (existedGroupExpression != null) {
-            Group mergedGroup = existedGroupExpression.getOwnerGroup();
             if (target != null && 
!target.getGroupId().equals(existedGroupExpression.getOwnerGroup().getGroupId()))
 {
-                mergedGroup = mergeGroup(target, 
existedGroupExpression.getOwnerGroup());
-            }
-            if (rewrite) {
-                mergedGroup.setLogicalProperties(logicalProperties);
+                mergeGroup(existedGroupExpression.getOwnerGroup(), target);
             }
-            return new Pair(false, existedGroupExpression);
+            return new Pair<>(false, existedGroupExpression);
         }
         if (target != null) {
-            if (rewrite) {
-                GroupExpression oldExpression = 
target.rewriteLogicalExpression(groupExpression, logicalProperties);
-                groupExpressions.remove(oldExpression);
-            } else {
-                target.addGroupExpression(groupExpression);
-            }
+            target.addGroupExpression(groupExpression);
+        } else {
+            Group group = new Group(groupIdGenerator.getNextId(), 
groupExpression, logicalProperties);
+            groups.add(group);
+        }
+        groupExpressions.put(groupExpression, groupExpression);
+        return new Pair<>(true, groupExpression);
+    }
+
+    /**
+     * Rewrite groupExpression to target group.
+     * If group expression is already in memo, we replace logical properties 
regardless the target group present or not
+     *     for replace UnboundLogicalProperties to LogicalProperties
+     * If target is null, generate new group.
+     * If target is not null, rewrite the groupExpression to target group.
+     *
+     * @param groupExpression groupExpression to rewrite old one
+     * @param target target group to rewrite groupExpression
+     * @return a pair, in which the first element is true if a newly generated 
groupExpression added into memo,
+     *         and the second element is a reference of node in Memo
+     */
+    private Pair<Boolean, GroupExpression> rewriteGroupExpression(
+            GroupExpression groupExpression, Group target, LogicalProperties 
logicalProperties) {
+        boolean newGroupExpressionGenerated = true;
+        GroupExpression existedGroupExpression = 
groupExpressions.get(groupExpression);
+        if (existedGroupExpression != null) {
+            target = existedGroupExpression.getOwnerGroup();
+            newGroupExpressionGenerated = false;
+        }
+        if (target != null) {
+            GroupExpression oldExpression = 
target.rewriteLogicalExpression(groupExpression, logicalProperties);
+            groupExpressions.remove(oldExpression);
         } else {
             Group group = new Group(groupIdGenerator.getNextId(), 
groupExpression, logicalProperties);
-            Preconditions.checkArgument(!groups.contains(group), "new group 
with already exist output");
             groups.add(group);
         }
         groupExpressions.put(groupExpression, groupExpression);
-        return new Pair(true, groupExpression);
+        return new Pair<>(newGroupExpressionGenerated, groupExpression);
     }
 
     /**
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/AnalyzeSSBTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/AnalyzeSSBTest.java
similarity index 97%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/AnalyzeSSBTest.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/AnalyzeSSBTest.java
index 6065f2159f..6d5b9a65cc 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/AnalyzeSSBTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/AnalyzeSSBTest.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.ssb;
+package org.apache.doris.nereids.datasets.ssb;
 
 import org.junit.jupiter.api.Test;
 
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBJoinReorderTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBJoinReorderTest.java
similarity index 99%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBJoinReorderTest.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBJoinReorderTest.java
index b78de68a5a..77a78c8529 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBJoinReorderTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBJoinReorderTest.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.ssb;
+package org.apache.doris.nereids.datasets.ssb;
 
 import org.apache.doris.nereids.analyzer.NereidsAnalyzer;
 import org.apache.doris.nereids.rules.rewrite.logical.ReorderJoin;
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBTestBase.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBTestBase.java
similarity index 90%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBTestBase.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBTestBase.java
index 87a620e0e1..691da60173 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBTestBase.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBTestBase.java
@@ -15,9 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.ssb;
+package org.apache.doris.nereids.datasets.ssb;
 
-import org.apache.doris.nereids.tpch.AnalyzeCheckTestBase;
+import org.apache.doris.nereids.datasets.tpch.AnalyzeCheckTestBase;
 
 public abstract class SSBTestBase extends AnalyzeCheckTestBase {
     @Override
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBUtils.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBUtils.java
similarity index 99%
rename from fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBUtils.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBUtils.java
index 97de88afd3..a728d01dce 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/ssb/SSBUtils.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/ssb/SSBUtils.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.ssb;
+package org.apache.doris.nereids.datasets.ssb;
 
 import org.apache.doris.utframe.TestWithFeService;
 
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeCheckTestBase.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeCheckTestBase.java
similarity index 98%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeCheckTestBase.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeCheckTestBase.java
index bfd01077d6..a994faaeb9 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeCheckTestBase.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeCheckTestBase.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.tpch;
+package org.apache.doris.nereids.datasets.tpch;
 
 import org.apache.doris.nereids.analyzer.NereidsAnalyzer;
 import org.apache.doris.nereids.analyzer.Unbound;
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeTPCHTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeTPCHTest.java
similarity index 98%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeTPCHTest.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeTPCHTest.java
index d4185d67d7..44de365d5d 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/AnalyzeTPCHTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/AnalyzeTPCHTest.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.tpch;
+package org.apache.doris.nereids.datasets.tpch;
 
 /**
  * There are still many functions that have not been implemented,
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHTestBase.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHTestBase.java
similarity index 95%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHTestBase.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHTestBase.java
index 64df88841d..71dddf165c 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHTestBase.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHTestBase.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.tpch;
+package org.apache.doris.nereids.datasets.tpch;
 
 public abstract class TPCHTestBase extends AnalyzeCheckTestBase {
     @Override
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHUtils.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHUtils.java
similarity index 99%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHUtils.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHUtils.java
index 5bc571cf97..ee8c4b25e4 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/tpch/TPCHUtils.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/tpch/TPCHUtils.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.tpch;
+package org.apache.doris.nereids.datasets.tpch;
 
 import org.apache.doris.utframe.TestWithFeService;
 
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java
index ecf1aa3729..d31b455a6c 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/MemoTest.java
@@ -18,9 +18,14 @@
 package org.apache.doris.nereids.memo;
 
 import org.apache.doris.nereids.analyzer.UnboundRelation;
-import org.apache.doris.nereids.trees.expressions.ExprId;
+import org.apache.doris.nereids.trees.expressions.BooleanLiteral;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.plans.GroupPlan;
+import org.apache.doris.nereids.trees.plans.JoinType;
+import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
+import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.types.StringType;
 
@@ -31,7 +36,7 @@ import org.junit.jupiter.api.Test;
 
 public class MemoTest {
     @Test
-    public void testCopyIn() {
+    public void testInsert() {
         UnboundRelation unboundRelation = new 
UnboundRelation(Lists.newArrayList("test"));
         LogicalProject insideProject = new LogicalProject(
                 ImmutableList.of(new SlotReference("name", 
StringType.INSTANCE, true, ImmutableList.of("test"))),
@@ -59,61 +64,112 @@ public class MemoTest {
     }
 
     /**
-     * initial Memo status:
-     *      group#1(project1)-->group#0(relationA)
-     *      group#3(project2)-->group#2(relationB)
-     *      group#4(project3)-->group#2(relationB)
-     * copy relationA into group#2
-     * after merge:
-     *      group#1(project1)-->group#0(relationA, relationB)
-     *      group#4(project3)-->group#0
-     * merging group#2 and group#0 recursively invoke merging group#3 and 
group#1 and merging group#4 and group#1
+     * Original:
+     * |---Project(name)
+     *     |---Project(name)
+     *         |---UnboundRelation
+     *
+     * After rewrite:
+     * Project(name)
+     * |---Project(rewrite)
+     *     |---Project(rewrite_inside)
+     *         |---UnboundRelation
      */
     @Test
-    public void testMergeGroup() {
-        UnboundRelation relation1 = new 
UnboundRelation(Lists.newArrayList("A"));
-        LogicalProject project1 = new LogicalProject(
-                ImmutableList.of(new SlotReference(new ExprId(1), "name", 
StringType.INSTANCE, true, ImmutableList.of("test"))),
-                relation1
+    public void testRewrite() {
+        UnboundRelation unboundRelation = new 
UnboundRelation(Lists.newArrayList("test"));
+        LogicalProject insideProject = new LogicalProject<>(
+                ImmutableList.of(new SlotReference("name", 
StringType.INSTANCE, true, ImmutableList.of("test"))),
+                unboundRelation
         );
-
-        Memo memo = new Memo(project1);
-
-        UnboundRelation relation2 = new 
UnboundRelation(Lists.newArrayList("B"));
-        LogicalProject project2 = new LogicalProject(
-                ImmutableList.of(new SlotReference(new ExprId(1), "name", 
StringType.INSTANCE, true, ImmutableList.of("test"))),
-                relation2
+        LogicalProject rootProject = new LogicalProject<>(
+                ImmutableList.of(new SlotReference("name", 
StringType.INSTANCE, true, ImmutableList.of("test"))),
+                insideProject
         );
-        memo.copyIn(project2, null, false);
-        Assertions.assertEquals(4, memo.getGroups().size());
 
-        LogicalProject project3 = new LogicalProject(
-                ImmutableList.of(new SlotReference(new ExprId(1), "other", 
StringType.INSTANCE, true, ImmutableList.of("other"))),
-                relation2
+        // Project -> Project -> Relation
+        Memo memo = new Memo(rootProject);
+        Group leafGroup = memo.getGroups().stream().filter(g -> 
g.getGroupId().asInt() == 0).findFirst().get();
+        Group targetGroup = memo.getGroups().stream().filter(g -> 
g.getGroupId().asInt() == 1).findFirst().get();
+        LogicalProject rewriteInsideProject = new LogicalProject<>(
+                ImmutableList.of(new SlotReference("rewrite_inside", 
StringType.INSTANCE,
+                        false, ImmutableList.of("test"))),
+                new GroupPlan(leafGroup)
         );
+        LogicalProject rewriteProject = new LogicalProject<>(
+                ImmutableList.of(new SlotReference("rewrite", 
StringType.INSTANCE,
+                        true, ImmutableList.of("test"))),
+                rewriteInsideProject
+        );
+        memo.copyIn(rewriteProject, targetGroup, true);
 
-        memo.copyIn(project3, null, false);
-
-        //after copyIn, group#2 contains relationA and relationB
-        memo.copyIn(relation1, memo.getGroups().get(2), true);
-
+        Assertions.assertEquals(4, memo.getGroups().size());
+        Plan node = memo.copyOut();
+        Assertions.assertTrue(node instanceof LogicalProject);
+        Assertions.assertEquals("name", ((LogicalProject<?>) 
node).getProjects().get(0).getName());
+        node = node.child(0);
+        Assertions.assertTrue(node instanceof LogicalProject);
+        Assertions.assertEquals("rewrite", ((LogicalProject<?>) 
node).getProjects().get(0).getName());
+        node = node.child(0);
+        Assertions.assertTrue(node instanceof LogicalProject);
+        Assertions.assertEquals("rewrite_inside", ((LogicalProject<?>) 
node).getProjects().get(0).getName());
+        node = node.child(0);
+        Assertions.assertTrue(node instanceof UnboundRelation);
+        Assertions.assertEquals("test", ((UnboundRelation) 
node).getTableName());
+    }
 
-        Assertions.assertEquals(3, memo.getGroups().size());
+    /**
+     * Original:
+     * Group 0: UnboundRelation C
+     * Group 1: UnboundRelation B
+     * Group 2: UnboundRelation A
+     * Group 3: Join(Group 1, Group 2)
+     * Group 4: Join(Group 0, Group 3)
+     * Group 5: Filter(Group 4)
+     * Group 6: Join(Group 2, Group 1)
+     * Group 7: Join(Group 0, Group 6)
+     *
+     * Then:
+     * Copy In Join(Group 2, Group 1) into Group 3
+     *
+     * Expected:
+     * Group 0: UnboundRelation C
+     * Group 1: UnboundRelation B
+     * Group 2: UnboundRelation A
+     * Group 5: Filter(Group 7)
+     * Group 6: Join(Group 2, Group 1), Join(Group 1, Group 2)
+     * Group 7: Join(Group 0, Group 6)
+     */
+    @Test
+    public void testMergeGroup() {
+        UnboundRelation unboundRelationA = new 
UnboundRelation(Lists.newArrayList("A"));
+        UnboundRelation unboundRelationB = new 
UnboundRelation(Lists.newArrayList("B"));
+        UnboundRelation unboundRelationC = new 
UnboundRelation(Lists.newArrayList("C"));
+        LogicalJoin logicalJoinAB = new LogicalJoin<>(JoinType.INNER_JOIN, 
unboundRelationA, unboundRelationB);
+        LogicalJoin logicalJoinBA = new LogicalJoin<>(JoinType.INNER_JOIN, 
unboundRelationB, unboundRelationA);
+        LogicalJoin logicalJoinCAB = new LogicalJoin<>(JoinType.INNER_JOIN, 
unboundRelationC, logicalJoinAB);
+        LogicalJoin logicalJoinCBA = new LogicalJoin<>(JoinType.INNER_JOIN, 
unboundRelationC, logicalJoinBA);
+        LogicalFilter logicalFilter = new LogicalFilter<>(new 
BooleanLiteral(true), logicalJoinCBA);
+
+        Memo memo = new Memo(logicalFilter);
+        memo.copyIn(logicalJoinCAB, null, false);
+        Assertions.assertEquals(8, memo.getGroups().size());
+        Assertions.assertEquals(8, memo.getGroupExpressions().size());
+
+        Group target = 
memo.getRoot().getLogicalExpression().child(0).getLogicalExpression().child(1);
+        LogicalJoin repeat = new LogicalJoin<>(JoinType.INNER_JOIN, 
unboundRelationA, unboundRelationB);
+        memo.copyIn(repeat, target, false);
+        Assertions.assertEquals(6, memo.getGroups().size());
+        Assertions.assertEquals(7, memo.getGroupExpressions().size());
         Group root = memo.getRoot();
         Assertions.assertEquals(1, root.getLogicalExpressions().size());
-        Assertions.assertEquals(PlanType.LOGICAL_PROJECT, 
root.logicalExpressionsAt(0).getPlan().getType());
-        GroupExpression rootExpression = root.logicalExpressionsAt(0);
-        Assertions.assertEquals(1, rootExpression.children().size());
-        //two expressions: relationA and relationB
-        Assertions.assertEquals(2, 
rootExpression.child(0).getLogicalExpressions().size());
-        GroupExpression childExpression = 
rootExpression.child(0).logicalExpressionsAt(0);
-        Assertions.assertEquals(PlanType.LOGICAL_UNBOUND_RELATION, 
childExpression.getPlan().getType());
-
-        Group groupProjct3 = memo.getGroups().get(2); //group for project3
-        Group groupRelation = memo.getGroups().get(0); //group for relation
-        //group0 is child of group4
-        Assertions.assertEquals(groupRelation, 
groupProjct3.logicalExpressionsAt(0).child(0));
-        Assertions.assertEquals(1, 
groupProjct3.getLogicalExpressions().size());
-        Assertions.assertEquals(1, 
groupProjct3.logicalExpressionsAt(0).children().size());
+        GroupExpression filter = root.getLogicalExpression();
+        GroupExpression joinCBA = filter.child(0).getLogicalExpression();
+        Assertions.assertEquals(1, 
joinCBA.child(0).getLogicalExpressions().size());
+        Assertions.assertEquals(2, 
joinCBA.child(1).getLogicalExpressions().size());
+        GroupExpression joinBA = 
joinCBA.child(1).getLogicalExpressions().get(0);
+        GroupExpression joinAB = 
joinCBA.child(1).getLogicalExpressions().get(1);
+        Assertions.assertTrue(joinAB.getPlan() instanceof LogicalJoin);
+        Assertions.assertTrue(joinBA.getPlan() instanceof LogicalJoin);
     }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java
index e731c26776..ef082e48c5 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/SubqueryTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.doris.nereids.trees.expressions;
 
-import org.apache.doris.nereids.tpch.AnalyzeCheckTestBase;
+import org.apache.doris.nereids.datasets.tpch.AnalyzeCheckTestBase;
 
 import org.junit.jupiter.api.Test;
 
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/plan/TestPlanOutput.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/TestPlanOutput.java
similarity index 97%
rename from 
fe/fe-core/src/test/java/org/apache/doris/nereids/plan/TestPlanOutput.java
rename to 
fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/TestPlanOutput.java
index 2d93b1b802..6278ac14b3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/plan/TestPlanOutput.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/TestPlanOutput.java
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.plan;
+package org.apache.doris.nereids.trees.plans;
 
 import org.apache.doris.catalog.AggregateType;
 import org.apache.doris.catalog.Column;
@@ -26,8 +26,6 @@ import org.apache.doris.nereids.exceptions.UnboundException;
 import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.plans.Plan;
-import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalRelation;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalRelation;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to