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

morrysnow 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 8999ba34ae [improve](Nereids)unify all plan toString() function 
(#12132)
8999ba34ae is described below

commit 8999ba34ae73aabe65054d7f63a1390e27042848
Author: jakevin <[email protected]>
AuthorDate: Wed Aug 31 14:28:44 2022 +0800

    [improve](Nereids)unify all plan toString() function (#12132)
    
    Add a Util function to generate uniform format plan toString for easy 
reading and debugging
---
 .../trees/plans/logical/LogicalAggregate.java      |  12 ++-
 .../nereids/trees/plans/logical/LogicalApply.java  |   3 +-
 .../trees/plans/logical/LogicalCorrelatedJoin.java |  11 ++-
 .../plans/logical/LogicalEnforceSingleRow.java     |   8 +-
 .../nereids/trees/plans/logical/LogicalFilter.java |   5 +-
 .../nereids/trees/plans/logical/LogicalJoin.java   |  16 ++--
 .../nereids/trees/plans/logical/LogicalLimit.java  |  10 +-
 .../trees/plans/logical/LogicalOlapScan.java       |  10 +-
 .../trees/plans/logical/LogicalProject.java        |   8 +-
 .../nereids/trees/plans/logical/LogicalSort.java   |   5 +-
 .../trees/plans/logical/LogicalSubQueryAlias.java  |   5 +-
 .../nereids/trees/plans/logical/LogicalTopN.java   |  11 ++-
 .../trees/plans/physical/PhysicalAggregate.java    |  26 ++---
 .../trees/plans/physical/PhysicalDistribution.java |  14 ++-
 .../trees/plans/physical/PhysicalFilter.java       |   7 +-
 .../trees/plans/physical/PhysicalHashJoin.java     |  15 +--
 .../trees/plans/physical/PhysicalLimit.java        |  17 ++--
 .../plans/physical/PhysicalNestedLoopJoin.java     |  10 +-
 .../trees/plans/physical/PhysicalOlapScan.java     |   7 +-
 .../trees/plans/physical/PhysicalProject.java      |   7 +-
 .../trees/plans/physical/PhysicalQuickSort.java    |   7 +-
 .../nereids/trees/plans/physical/PhysicalTopN.java |  11 ++-
 .../java/org/apache/doris/nereids/util/Utils.java  |  29 +++++-
 .../nereids/trees/plans/PlanToStringTest.java      | 105 +++++++++++++++++++++
 24 files changed, 263 insertions(+), 96 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java
index 9338c30036..acdcbd173b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalAggregate.java
@@ -27,10 +27,10 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Aggregate;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -112,9 +112,11 @@ public class LogicalAggregate<CHILD_TYPE extends Plan> 
extends LogicalUnary<CHIL
 
     @Override
     public String toString() {
-        return "LogicalAggregate (phase: [" + aggPhase.name() + "], output: ["
-                + StringUtils.join(outputExpressions, ", ")
-                + "], groupBy: [" + StringUtils.join(groupByExpressions, ", ") 
+ "])";
+        return Utils.toSqlString("LogicalAggregate",
+                "phase", aggPhase,
+                "outputExpr", outputExpressions,
+                "groupByExpr", groupByExpressions
+        );
     }
 
     @Override
@@ -186,7 +188,7 @@ public class LogicalAggregate<CHILD_TYPE extends Plan> 
extends LogicalUnary<CHIL
     }
 
     public LogicalAggregate<Plan> withGroupByAndOutput(List<Expression> 
groupByExprList,
-                                                 List<NamedExpression> 
outputExpressionList) {
+            List<NamedExpression> outputExpressionList) {
         return new LogicalAggregate<>(groupByExprList, outputExpressionList,
                 disassembled, normalized, aggPhase, child());
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
index 01bc42f456..df9aaeeb34 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalApply.java
@@ -24,6 +24,7 @@ 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.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -69,7 +70,7 @@ public class LogicalApply<LEFT_CHILD_TYPE extends Plan, 
RIGHT_CHILD_TYPE extends
 
     @Override
     public String toString() {
-        return "LogicalApply (" + this.child(1).toString() + ")";
+        return Utils.toSqlString("LogicalApply");
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCorrelatedJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCorrelatedJoin.java
index 47eacbd34b..93ed2b7083 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCorrelatedJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalCorrelatedJoin.java
@@ -24,6 +24,7 @@ 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.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -34,6 +35,7 @@ import java.util.Optional;
 
 /**
  * A relational algebra node with join type converted from apply node to 
subquery.
+ *
  * @param <LEFT_CHILD_TYPE> input.
  * @param <RIGHT_CHILD_TYPE> subquery.
  */
@@ -76,11 +78,10 @@ public class LogicalCorrelatedJoin<LEFT_CHILD_TYPE extends 
Plan, RIGHT_CHILD_TYP
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder("LogicalCorrelated ((correlation: 
").append(type);
-        correlation.stream().map(c -> sb.append(", ").append(c));
-        sb.append("), (filter: ");
-        filter.ifPresent(expression -> sb.append(", ").append(expression));
-        return sb.append("))").toString();
+        return Utils.toSqlString("LogicalCorrelated",
+                "correlation", correlation,
+                "filter", filter
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEnforceSingleRow.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEnforceSingleRow.java
index 3a138158e1..4ab50449d3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEnforceSingleRow.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEnforceSingleRow.java
@@ -24,6 +24,7 @@ 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.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -59,7 +60,7 @@ public class LogicalEnforceSingleRow<CHILD_TYPE extends Plan> 
extends LogicalUna
 
     @Override
     public String toString() {
-        return "LogicalEnforceSingleRow (" + this.child(0).toString() + ")";
+        return Utils.toSqlString("LogicalEnforceSingleRow");
     }
 
     @Override
@@ -67,7 +68,10 @@ public class LogicalEnforceSingleRow<CHILD_TYPE extends 
Plan> extends LogicalUna
         if (this == o) {
             return true;
         }
-        return false;
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        return true;
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
index d61cbf8efc..97dbc6d0e9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFilter.java
@@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Filter;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -61,7 +62,9 @@ public class LogicalFilter<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_T
 
     @Override
     public String toString() {
-        return "LogicalFilter (" + predicates + ")";
+        return Utils.toSqlString("LogicalFilter",
+                "predicates", predicates
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java
index dd8bbf532e..7963a24ab8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java
@@ -28,10 +28,10 @@ import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Join;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
 import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -173,18 +173,14 @@ public class LogicalJoin<LEFT_CHILD_TYPE extends Plan, 
RIGHT_CHILD_TYPE extends
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder("LogicalJoin 
([").append(joinType).append("]");
-        sb.append("hashJoinCondition:[");
-        sb.append(StringUtils.join(hashJoinConjuncts, ", "));
-        sb.append("] ");
-        otherJoinCondition.ifPresent(
-                expression -> sb.append(", nonHashJoinCondition 
[").append(expression).append("]")
+        return Utils.toSqlString("LogicalJoin",
+                "type", joinType,
+                "hashJoinCondition", hashJoinConjuncts,
+                "otherJoinCondition", otherJoinCondition
         );
-        sb.append(")");
-        return sb.toString();
     }
 
-    //TODO:
+    // TODO:
     // 1. consider the order of conjucts in otherJoinCondition and 
hashJoinConditions
     @Override
     public boolean equals(Object o) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java
index d83742cd81..7e57229c34 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalLimit.java
@@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Limit;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -37,7 +38,7 @@ import java.util.Optional;
  * Logical limit plan
  * eg: select * from table limit 10
  * limit: 10
- *
+ * <p>
  * eg: select * from table order by a limit 100, 10
  * limit: 10
  * offset 100
@@ -51,7 +52,7 @@ public class LogicalLimit<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_TY
     }
 
     public LogicalLimit(long limit, long offset, Optional<GroupExpression> 
groupExpression,
-                        Optional<LogicalProperties> logicalProperties, 
CHILD_TYPE child) {
+            Optional<LogicalProperties> logicalProperties, CHILD_TYPE child) {
         super(PlanType.LOGICAL_LIMIT, groupExpression, logicalProperties, 
child);
         this.limit = limit;
         this.offset = offset;
@@ -72,7 +73,10 @@ public class LogicalLimit<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_TY
 
     @Override
     public String toString() {
-        return "LogicalLimit (offset=" + offset + ", limit=" + limit + ")";
+        return Utils.toSqlString("LogicalLimit",
+                "limit", limit,
+                "offset", offset
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
index 2a4cfab07f..fc4e5d082f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java
@@ -25,15 +25,14 @@ import 
org.apache.doris.nereids.properties.LogicalProperties;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
 import java.util.List;
-import java.util.Objects;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Logical OlapScan.
@@ -85,9 +84,10 @@ public class LogicalOlapScan extends LogicalRelation {
 
     @Override
     public String toString() {
-        return "LogicalOlapScan (" + qualifiedName() + ", output: "
-                + getOutput().stream().map(Objects::toString)
-                .collect(Collectors.joining(", ", "[", "]")) + ")";
+        return Utils.toSqlString("LogicalOlapScan",
+                "qualifier", qualifiedName(),
+                "output", getOutput()
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
index 96b10698b9..738c2a53e1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java
@@ -26,10 +26,10 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Project;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -52,7 +52,7 @@ public class LogicalProject<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_
      * @param projects project list
      */
     public LogicalProject(List<NamedExpression> projects, 
Optional<GroupExpression> groupExpression,
-                          Optional<LogicalProperties> logicalProperties, 
CHILD_TYPE child) {
+            Optional<LogicalProperties> logicalProperties, CHILD_TYPE child) {
         super(PlanType.LOGICAL_PROJECT, groupExpression, logicalProperties, 
child);
         this.projects = ImmutableList.copyOf(Objects.requireNonNull(projects, 
"projects can not be null"));
     }
@@ -76,7 +76,9 @@ public class LogicalProject<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_
 
     @Override
     public String toString() {
-        return "LogicalProject (" + StringUtils.join(projects, ", ") + ")";
+        return Utils.toSqlString("LogicalProject",
+                "projects", projects
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
index 5c00a653d8..d77baf33ef 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSort.java
@@ -26,10 +26,10 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Sort;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -70,7 +70,8 @@ public class LogicalSort<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_TYP
 
     @Override
     public String toString() {
-        return "LogicalSort (" + StringUtils.join(orderKeys, ", ") + ")";
+        return Utils.toSqlString("LogicalSort",
+                "orderKeys", orderKeys);
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
index 45f0add041..fc71a8fedc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalSubQueryAlias.java
@@ -24,6 +24,7 @@ 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.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -65,7 +66,9 @@ public class LogicalSubQueryAlias<CHILD_TYPE extends Plan> 
extends LogicalUnary<
 
     @Override
     public String toString() {
-        return "LogicalSubQueryAlias (" + alias + ")";
+        return Utils.toSqlString("LogicalSubQueryAlias",
+                "alias", alias
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java
index fa0c523626..5718baaae0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalTopN.java
@@ -26,10 +26,10 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.TopN;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -78,10 +78,11 @@ public class LogicalTopN<CHILD_TYPE extends Plan> extends 
LogicalUnary<CHILD_TYP
 
     @Override
     public String toString() {
-        return "LogicalTopN ("
-                + "limit=" + limit
-                + ", offset=" + offset
-                + ", " + StringUtils.join(orderKeys, ", ") + ")";
+        return Utils.toSqlString("LogicalTopN",
+                "limit", limit,
+                "offset", offset,
+                "orderKeys", orderKeys
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java
index 05a97c19ff..052428afca 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalAggregate.java
@@ -26,10 +26,10 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Aggregate;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -52,8 +52,8 @@ public class PhysicalAggregate<CHILD_TYPE extends Plan> 
extends PhysicalUnary<CH
 
 
     public PhysicalAggregate(List<Expression> groupByExpressions, 
List<NamedExpression> outputExpressions,
-                             List<Expression> partitionExpressions, AggPhase 
aggPhase, boolean usingStream,
-                             LogicalProperties logicalProperties, CHILD_TYPE 
child) {
+            List<Expression> partitionExpressions, AggPhase aggPhase, boolean 
usingStream,
+            LogicalProperties logicalProperties, CHILD_TYPE child) {
         this(groupByExpressions, outputExpressions, partitionExpressions, 
aggPhase, usingStream,
                 Optional.empty(), logicalProperties, child);
     }
@@ -67,9 +67,9 @@ public class PhysicalAggregate<CHILD_TYPE extends Plan> 
extends PhysicalUnary<CH
      * @param usingStream whether it's stream agg.
      */
     public PhysicalAggregate(List<Expression> groupByExpressions, 
List<NamedExpression> outputExpressions,
-                             List<Expression> partitionExpressions, AggPhase 
aggPhase, boolean usingStream,
-                             Optional<GroupExpression> groupExpression, 
LogicalProperties logicalProperties,
-                             CHILD_TYPE child) {
+            List<Expression> partitionExpressions, AggPhase aggPhase, boolean 
usingStream,
+            Optional<GroupExpression> groupExpression, LogicalProperties 
logicalProperties,
+            CHILD_TYPE child) {
         super(PlanType.PHYSICAL_AGGREGATE, groupExpression, logicalProperties, 
child);
         this.groupByExpressions = groupByExpressions;
         this.outputExpressions = outputExpressions;
@@ -112,9 +112,11 @@ public class PhysicalAggregate<CHILD_TYPE extends Plan> 
extends PhysicalUnary<CH
 
     @Override
     public String toString() {
-        return "PhysicalAggregate (phase: [" + aggPhase.name() + "], output: ["
-                + StringUtils.join(outputExpressions, ", ")
-                + "], groupBy: [" + StringUtils.join(groupByExpressions, ", ") 
+ "])";
+        return Utils.toSqlString("PhysicalAggregate",
+                "phase", aggPhase,
+                "outputExpr", outputExpressions,
+                "groupByExpr", groupByExpressions
+        );
     }
 
     /**
@@ -144,18 +146,18 @@ public class PhysicalAggregate<CHILD_TYPE extends Plan> 
extends PhysicalUnary<CH
     public PhysicalUnary<Plan> withChildren(List<Plan> children) {
         Preconditions.checkArgument(children.size() == 1);
         return new PhysicalAggregate<>(groupByExpressions, outputExpressions, 
partitionExpressions, aggPhase,
-            usingStream, logicalProperties, children.get(0));
+                usingStream, logicalProperties, children.get(0));
     }
 
     @Override
     public Plan withGroupExpression(Optional<GroupExpression> groupExpression) 
{
         return new PhysicalAggregate<>(groupByExpressions, outputExpressions, 
partitionExpressions, aggPhase,
-            usingStream, groupExpression, logicalProperties, child());
+                usingStream, groupExpression, logicalProperties, child());
     }
 
     @Override
     public Plan withLogicalProperties(Optional<LogicalProperties> 
logicalProperties) {
         return new PhysicalAggregate<>(groupByExpressions, outputExpressions, 
partitionExpressions, aggPhase,
-            usingStream, Optional.empty(), logicalProperties.get(), child());
+                usingStream, Optional.empty(), logicalProperties.get(), 
child());
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribution.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribution.java
index 7dd4651061..8f9d89d350 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribution.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDistribution.java
@@ -24,6 +24,7 @@ import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -43,11 +44,18 @@ public class PhysicalDistribution<CHILD_TYPE extends Plan> 
extends PhysicalUnary
     }
 
     public PhysicalDistribution(DistributionSpec spec, 
Optional<GroupExpression> groupExpression,
-                                LogicalProperties logicalProperties, 
CHILD_TYPE child) {
+            LogicalProperties logicalProperties, CHILD_TYPE child) {
         super(PlanType.PHYSICAL_DISTRIBUTION, groupExpression, 
logicalProperties, child);
         this.distributionSpec = spec;
     }
 
+    @Override
+    public String toString() {
+        return Utils.toSqlString("PhysicalDistribution",
+                "distributionSpec", distributionSpec
+        );
+    }
+
     @Override
     public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
         return visitor.visitPhysicalDistribution((PhysicalDistribution<Plan>) 
this, context);
@@ -62,7 +70,7 @@ public class PhysicalDistribution<CHILD_TYPE extends Plan> 
extends PhysicalUnary
     public Plan withChildren(List<Plan> children) {
         Preconditions.checkArgument(children.size() == 1);
         return new PhysicalDistribution<>(distributionSpec, Optional.empty(),
-            logicalProperties, children.get(0));
+                logicalProperties, children.get(0));
     }
 
     @Override
@@ -73,6 +81,6 @@ public class PhysicalDistribution<CHILD_TYPE extends Plan> 
extends PhysicalUnary
     @Override
     public Plan withLogicalProperties(Optional<LogicalProperties> 
logicalProperties) {
         return new PhysicalDistribution<>(distributionSpec, Optional.empty(),
-            logicalProperties.get(), child());
+                logicalProperties.get(), child());
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java
index c2eb461bd5..d51c870586 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFilter.java
@@ -24,6 +24,7 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Filter;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -44,7 +45,7 @@ public class PhysicalFilter<CHILD_TYPE extends Plan> extends 
PhysicalUnary<CHILD
     }
 
     public PhysicalFilter(Expression predicates, Optional<GroupExpression> 
groupExpression,
-                          LogicalProperties logicalProperties, CHILD_TYPE 
child) {
+            LogicalProperties logicalProperties, CHILD_TYPE child) {
         super(PlanType.PHYSICAL_FILTER, groupExpression, logicalProperties, 
child);
         this.predicates = Objects.requireNonNull(predicates, "predicates can 
not be null");
     }
@@ -55,7 +56,9 @@ public class PhysicalFilter<CHILD_TYPE extends Plan> extends 
PhysicalUnary<CHILD
 
     @Override
     public String toString() {
-        return "PhysicalFilter (" + predicates + ")";
+        return Utils.toSqlString("PhysicalFilter",
+                "predicates", predicates
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
index a714dac003..c3c7b0507b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalHashJoin.java
@@ -24,9 +24,9 @@ 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.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
-import org.apache.commons.lang.StringUtils;
 
 import java.util.List;
 import java.util.Optional;
@@ -66,16 +66,11 @@ public class PhysicalHashJoin<
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("PhysicalHashJoin ([").append(joinType).append("]");
-        sb.append("hashJoinCondition:[");
-        sb.append(StringUtils.join(hashJoinConjuncts, ", "));
-        sb.append("] ");
-        otherJoinCondition.ifPresent(
-                expression -> sb.append(", nonHashJoinCondition 
[").append(expression).append("]")
+        return Utils.toSqlString("PhysicalHashJoin",
+                "type", joinType,
+                "hashJoinCondition", hashJoinConjuncts,
+                "otherJoinCondition", otherJoinCondition
         );
-        sb.append(")");
-        return sb.toString();
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java
index 727dc18054..2dfd1b06c2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalLimit.java
@@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Limit;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
@@ -44,20 +45,21 @@ public class PhysicalLimit<CHILD_TYPE extends Plan> extends 
PhysicalUnary<CHILD_
     /**
      * constructor
      * select * from t order by a limit [offset], [limit];
+     *
      * @param limit the number of tuples retrieved.
      * @param offset the number of tuples skipped.
      */
     public PhysicalLimit(long limit, long offset,
-                         Optional<GroupExpression> groupExpression, 
LogicalProperties logicalProperties,
-                         CHILD_TYPE child) {
+            Optional<GroupExpression> groupExpression, LogicalProperties 
logicalProperties,
+            CHILD_TYPE child) {
         super(PlanType.PHYSICAL_LIMIT, groupExpression, logicalProperties, 
child);
         this.limit = limit;
         this.offset = offset;
     }
 
     public PhysicalLimit(long limit, long offset,
-                         LogicalProperties logicalProperties,
-                         CHILD_TYPE child) {
+            LogicalProperties logicalProperties,
+            CHILD_TYPE child) {
         this(limit, offset, Optional.empty(), logicalProperties, child);
     }
 
@@ -115,8 +117,11 @@ public class PhysicalLimit<CHILD_TYPE extends Plan> 
extends PhysicalUnary<CHILD_
         return visitor.visitPhysicalLimit((PhysicalLimit<Plan>) this, context);
     }
 
+    @Override
     public String toString() {
-        return "PhysicalLimit ( offset=" + offset + ", limit=" + limit + ")";
+        return Utils.toSqlString("PhysicalLimit",
+                "limit", limit,
+                "offset", offset
+        );
     }
-
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java
index 55f862ac95..a158bdd03b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalNestedLoopJoin.java
@@ -24,6 +24,7 @@ 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.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 
@@ -67,13 +68,10 @@ public class PhysicalNestedLoopJoin<
     @Override
     public String toString() {
         // TODO: Maybe we could pull up this to the abstract class in the 
future.
-        StringBuilder sb = new StringBuilder();
-        sb.append("PhysicalNestedLoopJoin ([").append(joinType).append("]");
-        otherJoinCondition.ifPresent(
-                expression -> sb.append(", [").append(expression).append("]")
+        return Utils.toSqlString("PhysicalNestedLoopJoin",
+                "type", joinType,
+                "otherJoinCondition", otherJoinCondition
         );
-        sb.append(")");
-        return sb.toString();
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java
index 2146cf7aac..5ae5adc343 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalOlapScan.java
@@ -80,9 +80,10 @@ public class PhysicalOlapScan extends PhysicalRelation {
 
     @Override
     public String toString() {
-        return "PhysicalOlapScan (["
-                + Utils.qualifiedName(qualifier, olapTable.getName())
-                + "], [index id=" + selectedIndexId + "] )";
+        return Utils.toSqlString("PhysicalOlapScan",
+                "qualifier", Utils.qualifiedName(qualifier, 
olapTable.getName()),
+                "output", getOutput()
+        );
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java
index fd9b66bba3..2a3a81afc0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalProject.java
@@ -25,9 +25,9 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.Project;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -56,9 +56,12 @@ public class PhysicalProject<CHILD_TYPE extends Plan> 
extends PhysicalUnary<CHIL
 
     @Override
     public String toString() {
-        return "Project (" + StringUtils.join(projects, ", ") + ")";
+        return Utils.toSqlString("PhysicalProject",
+                "projects", projects
+        );
     }
 
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java
index b1748480d7..3f512e6671 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalQuickSort.java
@@ -24,10 +24,10 @@ import 
org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Optional;
@@ -81,7 +81,8 @@ public class PhysicalQuickSort<CHILD_TYPE extends Plan> 
extends AbstractPhysical
 
     @Override
     public String toString() {
-        return "PhysicalQuickSort ("
-                + StringUtils.join(orderKeys, ", ") + ")";
+        return Utils.toSqlString("PhysicalQuickSort",
+                "orderKeys", orderKeys
+        );
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java
index 7a93e3b41c..10e158c208 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalTopN.java
@@ -25,10 +25,10 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.PlanType;
 import org.apache.doris.nereids.trees.plans.algebra.TopN;
 import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.nereids.util.Utils;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Objects;
@@ -117,9 +117,10 @@ public class PhysicalTopN<CHILD_TYPE extends Plan> extends 
AbstractPhysicalSort<
 
     @Override
     public String toString() {
-        return "PhysicalTopN ("
-                + "limit=" + limit
-                + ", offset=" + offset
-                + ", " + StringUtils.join(orderKeys, ", ") + ")";
+        return Utils.toSqlString("PhysicalTopN",
+                "limit", limit,
+                "offset", offset,
+                "orderKeys", orderKeys
+        );
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
index cba61cac71..02033f4e28 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/Utils.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.util;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.plans.Plan;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang3.StringUtils;
 
@@ -48,7 +49,7 @@ public class Utils {
      *
      * @param f function which would invoke the logic of
      *        stale code from old optimizer that could throw
-     *        a checked exception
+     *        a checked exception.
      */
     public static void execWithUncheckedException(FuncWrapper f) {
         try {
@@ -119,4 +120,30 @@ public class Utils {
         return plan.getOutput().stream().map(SlotReference.class::cast)
                 .collect(Collectors.toList());
     }
+
+    /**
+     * Get sql string for plan.
+     *
+     * @param planName name of plan, like LogicalJoin.
+     * @param variables variable needed to add into sqlString.
+     * @return the string of PlanNode.
+     */
+    public static String toSqlString(String planName, Object... variables) {
+        Preconditions.checkState(variables.length % 2 == 0);
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append(planName).append(" ( ");
+
+        if (variables.length == 0) {
+            return stringBuilder.append(" )").toString();
+        }
+
+        for (int i = 0; i < variables.length - 1; i += 2) {
+            stringBuilder.append(variables[i]).append("=").append(variables[i 
+ 1]);
+            if (i < variables.length - 2) {
+                stringBuilder.append(", ");
+            }
+        }
+
+        return stringBuilder.append(" )").toString();
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanToStringTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanToStringTest.java
new file mode 100644
index 0000000000..63822eeaaf
--- /dev/null
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanToStringTest.java
@@ -0,0 +1,105 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.trees.plans;
+
+import org.apache.doris.nereids.properties.OrderKey;
+import org.apache.doris.nereids.trees.expressions.EqualTo;
+import org.apache.doris.nereids.trees.expressions.ExprId;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
+import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
+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.LogicalLimit;
+import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
+import org.apache.doris.nereids.types.BigIntType;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.util.PlanConstructor;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import mockit.Mocked;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+import java.util.Optional;
+
+public class PlanToStringTest {
+
+    @Test
+    public void testLogicalLimit(@Mocked Plan child) {
+        LogicalLimit<Plan> plan = new LogicalLimit<>(0, 0, child);
+
+        Assertions.assertEquals("LogicalLimit ( limit=0, offset=0 )", 
plan.toString());
+    }
+
+    @Test
+    public void testLogicalAggregate(@Mocked Plan child) {
+        LogicalAggregate<Plan> plan = new 
LogicalAggregate<>(Lists.newArrayList(), ImmutableList.of(
+                new SlotReference(new ExprId(0), "a", BigIntType.INSTANCE, 
true, Lists.newArrayList())), child);
+
+        Assertions.assertTrue(plan.toString()
+                .matches("LogicalAggregate \\( phase=GLOBAL, 
outputExpr=\\[a#\\d+], groupByExpr=\\[] \\)"));
+    }
+
+    @Test
+    public void testLogicalFilter(@Mocked Plan child) {
+        LogicalFilter<Plan> plan = new LogicalFilter<>(new 
EqualTo(Literal.of(1), Literal.of(1)), child);
+
+        Assertions.assertEquals("LogicalFilter ( predicates=(1 = 1) )", 
plan.toString());
+    }
+
+    @Test
+    public void testLogicalJoin(@Mocked Plan left, @Mocked Plan right) {
+        LogicalJoin<Plan, Plan> plan = new LogicalJoin<>(JoinType.INNER_JOIN, 
Lists.newArrayList(
+                new EqualTo(new SlotReference(new ExprId(0), "a", 
BigIntType.INSTANCE, true, Lists.newArrayList()),
+                        new SlotReference(new ExprId(1), "b", 
BigIntType.INSTANCE, true, Lists.newArrayList()))),
+                Optional.empty(), left, right);
+
+        Assertions.assertTrue(plan.toString().matches(
+                "LogicalJoin \\( type=INNER_JOIN, 
hashJoinCondition=\\[\\(a#\\d+ = b#\\d+\\)], otherJoinCondition=Optional.empty 
\\)"));
+    }
+
+    @Test
+    public void testLogicalOlapScan() {
+        LogicalOlapScan plan = PlanConstructor.newLogicalOlapScan(0, "table", 
0);
+        Assertions.assertTrue(
+                plan.toString().matches("LogicalOlapScan \\( 
qualifier=db\\.table, output=\\[id#\\d+, name#\\d+] \\)"));
+    }
+
+    @Test
+    public void testLogicalProject(@Mocked Plan child) {
+        LogicalProject<Plan> plan = new LogicalProject<>(ImmutableList.of(
+                new SlotReference(new ExprId(0), "a", BigIntType.INSTANCE, 
true, Lists.newArrayList())), child);
+
+        Assertions.assertTrue(plan.toString().matches("LogicalProject \\( 
projects=\\[a#\\d+] \\)"));
+    }
+
+    @Test
+    public void testLogicalSort(@Mocked Plan child) {
+        List<OrderKey> orderKeyList = Lists.newArrayList(
+                new OrderKey(new SlotReference("col1", IntegerType.INSTANCE), 
true, true),
+                new OrderKey(new SlotReference("col2", IntegerType.INSTANCE), 
true, true));
+
+        LogicalSort<Plan> plan = new LogicalSort<>(orderKeyList, child);
+        Assertions.assertTrue(plan.toString().matches("LogicalSort \\( 
orderKeys=\\[col1#\\d+, col2#\\d+] \\)"));
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to