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

hui pushed a commit to branch lmh/SupportQueryWithView
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 31dab493d8fcfbf4753ae9d582f484cc853da980
Author: Minghui Liu <[email protected]>
AuthorDate: Fri May 26 19:45:37 2023 +0800

    refactor Expression & implement copy()
---
 .../iotdb/db/mpp/plan/expression/Expression.java   | 88 ++++++++++++++++------
 .../plan/expression/binary/AdditionExpression.java |  5 ++
 .../plan/expression/binary/BinaryExpression.java   |  6 +-
 .../plan/expression/binary/DivisionExpression.java |  5 ++
 .../plan/expression/binary/EqualToExpression.java  |  5 ++
 .../expression/binary/GreaterEqualExpression.java  |  5 ++
 .../expression/binary/GreaterThanExpression.java   |  5 ++
 .../expression/binary/LessEqualExpression.java     |  5 ++
 .../plan/expression/binary/LessThanExpression.java |  5 ++
 .../plan/expression/binary/LogicAndExpression.java |  5 ++
 .../plan/expression/binary/LogicOrExpression.java  |  5 ++
 .../plan/expression/binary/ModuloExpression.java   |  5 ++
 .../binary/MultiplicationExpression.java           |  5 ++
 .../plan/expression/binary/NonEqualExpression.java |  5 ++
 .../expression/binary/SubtractionExpression.java   |  5 ++
 .../plan/expression/binary/WhenThenExpression.java | 11 ++-
 .../mpp/plan/expression/leaf/ConstantOperand.java  |  6 ++
 .../db/mpp/plan/expression/leaf/LeafOperand.java   |  2 +-
 .../db/mpp/plan/expression/leaf/NullOperand.java   |  6 ++
 .../plan/expression/leaf/TimeSeriesOperand.java    |  6 ++
 .../mpp/plan/expression/leaf/TimestampOperand.java |  6 ++
 .../plan/expression/multi/FunctionExpression.java  | 15 +++-
 .../expression/other/CaseWhenThenExpression.java   | 18 +++--
 .../plan/expression/ternary/BetweenExpression.java | 14 +++-
 .../db/mpp/plan/expression/unary/InExpression.java | 15 ++--
 .../plan/expression/unary/IsNullExpression.java    |  9 ++-
 .../mpp/plan/expression/unary/LikeExpression.java  |  9 ++-
 .../plan/expression/unary/LogicNotExpression.java  | 11 ++-
 .../plan/expression/unary/NegationExpression.java  | 11 ++-
 .../plan/expression/unary/RegularExpression.java   |  9 ++-
 30 files changed, 246 insertions(+), 61 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
index 519e1dc67c2..47dd65a21ba 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.mpp.plan.expression;
 
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.path.PathDeserializeUtil;
 import org.apache.iotdb.db.mpp.common.NodeRef;
 import org.apache.iotdb.db.mpp.plan.expression.binary.AdditionExpression;
 import org.apache.iotdb.db.mpp.plan.expression.binary.DivisionExpression;
@@ -133,22 +134,55 @@ public abstract class Expression extends StatementNode {
   public abstract void updateStatisticsForMemoryAssigner(LayerMemoryAssigner 
memoryAssigner);
 
   
/////////////////////////////////////////////////////////////////////////////////////////////////
-  // toString
+  // For analyzing logical view
   
/////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private String expressionStringCache;
+  protected PartialPath viewPath = null;
+
+  public void setViewPath(PartialPath viewPath) {
+    this.viewPath = viewPath;
+  }
+
+  public PartialPath getViewPath() {
+    return viewPath;
+  }
+
+  
/////////////////////////////////////////////////////////////////////////////////////////////////
+  // For representing expression in string
+  
/////////////////////////////////////////////////////////////////////////////////////////////////
 
-  /** Sub-classes must not override this method. */
   @Override
   public final String toString() {
-    return getExpressionString();
+    throw new UnsupportedOperationException(
+        "The Expression class does not support toString() method, please use 
getOutputSymbol() or getExpressionString().");
+  }
+
+  private String outputSymbolCache;
+
+  /**
+   * Get the output symbol of the expression.
+   *
+   * <p>The hash code of the returned value will be the hash code of this 
object. See {@link
+   * #hashCode()} and {@link #equals(Object)}.
+   */
+  public String getOutputSymbol() {
+    if (outputSymbolCache == null) {
+      outputSymbolCache = viewPath != null ? viewPath.getFullPath() : 
getOutputSymbolInternal();
+    }
+    return outputSymbolCache;
   }
 
   /**
-   * Get the representation of the expression in string. The hash code of the 
returned value will be
-   * the hash code of this object. See {@link #hashCode()} and {@link 
#equals(Object)}. In other
-   * words, same expressions should have exactly the same string 
representation, and different
-   * expressions must have different string representations.
+   * Sub-classes should override this method to provide valid output symbol of 
this object. See
+   * {@link #getOutputSymbol()}
+   */
+  public abstract String getOutputSymbolInternal();
+
+  private String expressionStringCache;
+
+  /**
+   * Get the representation of the expression in string. Compared to output 
symbol, it does not
+   * consider logical views.
    */
   public final String getExpressionString() {
     if (expressionStringCache == null) {
@@ -170,7 +204,7 @@ public abstract class Expression extends StatementNode {
   /** Sub-classes must not override this method. */
   @Override
   public final int hashCode() {
-    return getExpressionString().hashCode();
+    return getOutputSymbol().hashCode();
   }
 
   /** Sub-classes must not override this method. */
@@ -184,7 +218,7 @@ public abstract class Expression extends StatementNode {
       return false;
     }
 
-    return getExpressionString().equals(((Expression) 
o).getExpressionString());
+    return getOutputSymbol().equals(((Expression) o).getOutputSymbol());
   }
 
   
/////////////////////////////////////////////////////////////////////////////////////////////////
@@ -201,6 +235,11 @@ public abstract class Expression extends StatementNode {
     if (expression.inputColumnIndex != null) {
       ReadWriteIOUtils.write(expression.inputColumnIndex, byteBuffer);
     }
+
+    ReadWriteIOUtils.write(expression.viewPath != null, byteBuffer);
+    if (expression.viewPath != null) {
+      expression.viewPath.serialize(byteBuffer);
+    }
   }
 
   public static void serialize(Expression expression, DataOutputStream stream) 
throws IOException {
@@ -212,6 +251,11 @@ public abstract class Expression extends StatementNode {
     if (expression.inputColumnIndex != null) {
       ReadWriteIOUtils.write(expression.inputColumnIndex, stream);
     }
+
+    ReadWriteIOUtils.write(expression.viewPath != null, stream);
+    if (expression.viewPath != null) {
+      expression.viewPath.serialize(stream);
+    }
   }
 
   public static Expression deserialize(ByteBuffer byteBuffer) {
@@ -323,6 +367,11 @@ public abstract class Expression extends StatementNode {
       expression.inputColumnIndex = ReadWriteIOUtils.readInt(byteBuffer);
     }
 
+    boolean hasViewPath = ReadWriteIOUtils.readBool(byteBuffer);
+    if (hasViewPath) {
+      expression.viewPath = (PartialPath) 
PathDeserializeUtil.deserialize(byteBuffer);
+    }
+
     return expression;
   }
 
@@ -374,21 +423,16 @@ public abstract class Expression extends StatementNode {
   }
 
   
/////////////////////////////////////////////////////////////////////////////////////////////////
-  // For analyzing logical view
+  // copy expression
   
/////////////////////////////////////////////////////////////////////////////////////////////////
 
-  protected PartialPath viewPathOfThisExpression = null;
-
-  public void setViewPathOfThisExpression(PartialPath 
viewPathOfThisExpression) {
-    this.viewPathOfThisExpression = viewPathOfThisExpression;
-  }
-
-  public String getStringWithViewOfThisExpression() {
-    if (this.viewPathOfThisExpression == null) {
-      return this.getStringWithViewOfThisExpressionInternal();
+  public Expression copy() {
+    Expression copiedExpression = doCopy();
+    if (viewPath != null) {
+      copiedExpression.setViewPath(viewPath.copy());
     }
-    return this.viewPathOfThisExpression.getFullPath();
+    return copiedExpression;
   }
 
-  public abstract String getStringWithViewOfThisExpressionInternal();
+  protected abstract Expression doCopy();
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/AdditionExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/AdditionExpression.java
index 01591f6dfc8..663e75e5cee 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/AdditionExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/AdditionExpression.java
@@ -43,4 +43,9 @@ public class AdditionExpression extends 
ArithmeticBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.ADDITION;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new AdditionExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java
index 111e956fce5..2721bf2c374 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/BinaryExpression.java
@@ -147,9 +147,9 @@ public abstract class BinaryExpression extends Expression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
-    String left = this.getLeftExpression().getStringWithViewOfThisExpression();
-    String right = 
this.getRightExpression().getStringWithViewOfThisExpression();
+  public String getOutputSymbolInternal() {
+    String left = this.getLeftExpression().getOutputSymbol();
+    String right = this.getRightExpression().getOutputSymbol();
 
     StringBuilder builder = new StringBuilder();
     if (leftExpression.getExpressionType().getPriority() < 
this.getExpressionType().getPriority()) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/DivisionExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/DivisionExpression.java
index ee444a134b5..2e1f167d765 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/DivisionExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/DivisionExpression.java
@@ -43,4 +43,9 @@ public class DivisionExpression extends 
ArithmeticBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.DIVISION;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new DivisionExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/EqualToExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/EqualToExpression.java
index 54f9882d4a3..a483d4463e0 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/EqualToExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/EqualToExpression.java
@@ -43,4 +43,9 @@ public class EqualToExpression extends 
CompareBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.EQUAL_TO;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new EqualToExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterEqualExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterEqualExpression.java
index f065198f6b5..69a60ce9d07 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterEqualExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterEqualExpression.java
@@ -43,4 +43,9 @@ public class GreaterEqualExpression extends 
CompareBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.GREATER_EQUAL;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new GreaterEqualExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterThanExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterThanExpression.java
index c7fa4a26351..7911ab19cea 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterThanExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/GreaterThanExpression.java
@@ -43,4 +43,9 @@ public class GreaterThanExpression extends 
CompareBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.GREATER_THAN;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new GreaterThanExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessEqualExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessEqualExpression.java
index a765c20c372..2cece8551ef 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessEqualExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessEqualExpression.java
@@ -43,4 +43,9 @@ public class LessEqualExpression extends 
CompareBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.LESS_EQUAL;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new LessEqualExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessThanExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessThanExpression.java
index b3d8ba0caec..75943b8d133 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessThanExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LessThanExpression.java
@@ -43,4 +43,9 @@ public class LessThanExpression extends 
CompareBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.LESS_THAN;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new LessThanExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicAndExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicAndExpression.java
index 311ae5046bb..2ad0a2d8315 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicAndExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicAndExpression.java
@@ -43,4 +43,9 @@ public class LogicAndExpression extends LogicBinaryExpression 
{
   public ExpressionType getExpressionType() {
     return ExpressionType.LOGIC_AND;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new LogicAndExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicOrExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicOrExpression.java
index c0b877af474..3bbb02403e4 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicOrExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/LogicOrExpression.java
@@ -43,4 +43,9 @@ public class LogicOrExpression extends LogicBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.LOGIC_OR;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new LogicOrExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/ModuloExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/ModuloExpression.java
index c2ba296cfa0..ed4cd9bf1aa 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/ModuloExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/ModuloExpression.java
@@ -43,4 +43,9 @@ public class ModuloExpression extends 
ArithmeticBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.MODULO;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new ModuloExpression(leftExpression.copy(), rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/MultiplicationExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/MultiplicationExpression.java
index a6bf85d42d8..93865b432cb 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/MultiplicationExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/MultiplicationExpression.java
@@ -43,4 +43,9 @@ public class MultiplicationExpression extends 
ArithmeticBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.MULTIPLICATION;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new MultiplicationExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/NonEqualExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/NonEqualExpression.java
index e5665be10d2..caf8a639568 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/NonEqualExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/NonEqualExpression.java
@@ -43,4 +43,9 @@ public class NonEqualExpression extends 
CompareBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.NON_EQUAL;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new NonEqualExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/SubtractionExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/SubtractionExpression.java
index a9832fcca52..6cc2f5ba4da 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/SubtractionExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/SubtractionExpression.java
@@ -43,4 +43,9 @@ public class SubtractionExpression extends 
ArithmeticBinaryExpression {
   public ExpressionType getExpressionType() {
     return ExpressionType.SUBTRACTION;
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new SubtractionExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/WhenThenExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/WhenThenExpression.java
index c61ff03c3bd..0c6214768f5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/WhenThenExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/binary/WhenThenExpression.java
@@ -67,9 +67,9 @@ public class WhenThenExpression extends BinaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
-    String when = this.getWhen().getStringWithViewOfThisExpression();
-    String then = this.getThen().getStringWithViewOfThisExpression();
+  public String getOutputSymbolInternal() {
+    String when = this.getWhen().getOutputSymbol();
+    String then = this.getThen().getOutputSymbol();
     return "WHEN " + when + " THEN " + then;
   }
 
@@ -77,4 +77,9 @@ public class WhenThenExpression extends BinaryExpression {
   public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
     return visitor.visitWhenThenExpression(this, context);
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new WhenThenExpression(leftExpression.copy(), 
rightExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/ConstantOperand.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/ConstantOperand.java
index ea11e4e04b2..463684c062f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/ConstantOperand.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/ConstantOperand.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.mpp.plan.expression.leaf;
 
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
@@ -108,4 +109,9 @@ public class ConstantOperand extends LeafOperand {
     dataType.serializeTo(stream);
     ReadWriteIOUtils.write(valueString, stream);
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new ConstantOperand(dataType, valueString);
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java
index cc3b068d4ba..a10e3b6fb67 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/LeafOperand.java
@@ -48,7 +48,7 @@ public abstract class LeafOperand extends Expression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
+  public String getOutputSymbolInternal() {
     return this.getExpressionString();
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/NullOperand.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/NullOperand.java
index 997d627696e..8ee56cfc3ea 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/NullOperand.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/NullOperand.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.mpp.plan.expression.leaf;
 
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
@@ -71,4 +72,9 @@ public class NullOperand extends LeafOperand {
   protected void serialize(DataOutputStream stream) throws IOException {
     // do nothing
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new NullOperand();
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimeSeriesOperand.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimeSeriesOperand.java
index 2d54d9555c0..b933d943f2e 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimeSeriesOperand.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimeSeriesOperand.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.mpp.plan.expression.leaf;
 import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathDeserializeUtil;
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
@@ -105,4 +106,9 @@ public class TimeSeriesOperand extends LeafOperand {
   protected void serialize(DataOutputStream stream) throws IOException {
     path.serialize(stream);
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new TimeSeriesOperand(path.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimestampOperand.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimestampOperand.java
index ac9ded130c3..a077d8955af 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimestampOperand.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/leaf/TimestampOperand.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.mpp.plan.expression.leaf;
 
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
@@ -83,4 +84,9 @@ public class TimestampOperand extends LeafOperand {
   protected void serialize(DataOutputStream stream) throws IOException {
     // do nothing
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new TimestampOperand();
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
index 39a15b6a723..ba2a7500b68 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/multi/FunctionExpression.java
@@ -176,12 +176,12 @@ public class FunctionExpression extends Expression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
+  public String getOutputSymbolInternal() {
     StringBuilder builder = new StringBuilder();
     if (!expressions.isEmpty()) {
-      builder.append(expressions.get(0).getStringWithViewOfThisExpression());
+      builder.append(expressions.get(0).getOutputSymbol());
       for (int i = 1; i < expressions.size(); ++i) {
-        builder.append(", 
").append(expressions.get(i).getStringWithViewOfThisExpression());
+        builder.append(", ").append(expressions.get(i).getOutputSymbol());
       }
     }
     if (!functionAttributes.isEmpty()) {
@@ -196,6 +196,15 @@ public class FunctionExpression extends Expression {
     return functionName + "(" + builder + ")";
   }
 
+  @Override
+  protected Expression doCopy() {
+    List<Expression> copiedChildren = new ArrayList<>();
+    for (Expression expression : expressions) {
+      copiedChildren.add(expression.copy());
+    }
+    return new FunctionExpression(functionName, functionAttributes, 
copiedChildren);
+  }
+
   @Override
   public void constructUdfExecutors(
       Map<String, UDTFExecutor> expressionName2Executor, ZoneId zoneId) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/other/CaseWhenThenExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/other/CaseWhenThenExpression.java
index 616c2394e19..a3166ff0918 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/other/CaseWhenThenExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/other/CaseWhenThenExpression.java
@@ -166,22 +166,28 @@ public class CaseWhenThenExpression extends Expression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
+  public String getOutputSymbolInternal() {
     StringBuilder builder = new StringBuilder();
     builder.append("CASE ");
     for (Expression expression : this.whenThenExpressions) {
-      builder.append(expression.getStringWithViewOfThisExpression()).append(" 
");
+      builder.append(expression.getOutputSymbol()).append(" ");
     }
     if (!(this.elseExpression instanceof NullOperand)) {
-      builder
-          .append("ELSE ")
-          .append(this.elseExpression.getStringWithViewOfThisExpression())
-          .append(" ");
+      builder.append("ELSE 
").append(this.elseExpression.getOutputSymbol()).append(" ");
     }
     builder.append("END");
     return builder.toString();
   }
 
+  @Override
+  protected Expression doCopy() {
+    List<WhenThenExpression> copiedWhenThenExpressions = new ArrayList<>();
+    for (WhenThenExpression whenThenExpression : whenThenExpressions) {
+      copiedWhenThenExpressions.add((WhenThenExpression) 
whenThenExpression.copy());
+    }
+    return new CaseWhenThenExpression(copiedWhenThenExpressions, 
elseExpression.copy());
+  }
+
   @Override
   public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
     return visitor.visitCaseWhenThenExpression(this, context);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/BetweenExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/BetweenExpression.java
index 392d9c2418c..94d02482ef5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/BetweenExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/BetweenExpression.java
@@ -85,16 +85,22 @@ public class BetweenExpression extends TernaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
-    return firstExpression.getStringWithViewOfThisExpression()
+  public String getOutputSymbolInternal() {
+    return firstExpression.getOutputSymbol()
         + " BETWEEN "
-        + secondExpression.getStringWithViewOfThisExpression()
+        + secondExpression.getOutputSymbol()
         + " AND "
-        + thirdExpression.getStringWithViewOfThisExpression();
+        + thirdExpression.getOutputSymbol();
   }
 
   @Override
   public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
     return visitor.visitBetweenExpression(this, context);
   }
+
+  @Override
+  protected Expression doCopy() {
+    return new BetweenExpression(
+        firstExpression.copy(), secondExpression.copy(), 
thirdExpression.copy());
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/InExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/InExpression.java
index be7bb54977a..534bfee18b4 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/InExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/InExpression.java
@@ -121,22 +121,23 @@ public class InExpression extends UnaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
+  public String getOutputSymbolInternal() {
     StringBuilder stringBuilder = new StringBuilder();
     if (expression instanceof FunctionExpression
         || expression instanceof ConstantOperand
         || expression instanceof TimeSeriesOperand) {
-      
stringBuilder.append(expression.getStringWithViewOfThisExpression()).append(" 
IN (");
+      stringBuilder.append(expression.getOutputSymbol()).append(" IN (");
     } else {
-      stringBuilder
-          .append('(')
-          .append(expression.getStringWithViewOfThisExpression())
-          .append(')')
-          .append(" IN (");
+      
stringBuilder.append('(').append(expression.getOutputSymbol()).append(')').append("
 IN (");
     }
     return appendValuesToBuild(stringBuilder).toString();
   }
 
+  @Override
+  protected Expression doCopy() {
+    return new InExpression(expression.copy(), isNotIn, values);
+  }
+
   @Override
   public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
     return visitor.visitInExpression(this, context);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/IsNullExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/IsNullExpression.java
index 97a45e10b8f..832e4cd66c4 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/IsNullExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/IsNullExpression.java
@@ -73,8 +73,13 @@ public class IsNullExpression extends UnaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
-    return expression.getStringWithViewOfThisExpression() + " IS " + (isNot ? 
"NOT " : "") + "NULL";
+  public String getOutputSymbolInternal() {
+    return expression.getOutputSymbol() + " IS " + (isNot ? "NOT " : "") + 
"NULL";
+  }
+
+  @Override
+  protected Expression doCopy() {
+    return new IsNullExpression(expression.copy(), isNot);
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LikeExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LikeExpression.java
index 9ef4b420f44..4e69bf01a23 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LikeExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LikeExpression.java
@@ -143,8 +143,13 @@ public class LikeExpression extends UnaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
-    return expression.getStringWithViewOfThisExpression() + " LIKE '" + 
pattern + "'";
+  public String getOutputSymbolInternal() {
+    return expression.getOutputSymbol() + " LIKE '" + pattern + "'";
+  }
+
+  @Override
+  protected Expression doCopy() {
+    return new LikeExpression(expression.copy(), patternString, pattern);
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LogicNotExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LogicNotExpression.java
index 1186d0097d3..a9996a072ce 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LogicNotExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/LogicNotExpression.java
@@ -53,12 +53,17 @@ public class LogicNotExpression extends UnaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
+  public String getOutputSymbolInternal() {
     return expression instanceof FunctionExpression
             || expression instanceof ConstantOperand
             || expression instanceof TimeSeriesOperand
-        ? "!" + expression.getStringWithViewOfThisExpression()
-        : "!(" + expression.getStringWithViewOfThisExpression() + ")";
+        ? "!" + expression.getOutputSymbol()
+        : "!(" + expression.getOutputSymbol() + ")";
+  }
+
+  @Override
+  protected Expression doCopy() {
+    return new LogicNotExpression(expression.copy());
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/NegationExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/NegationExpression.java
index 70fb48958a5..070cf8bfb8f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/NegationExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/NegationExpression.java
@@ -56,14 +56,19 @@ public class NegationExpression extends UnaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
+  public String getOutputSymbolInternal() {
     return expression instanceof TimeSeriesOperand
             || expression instanceof FunctionExpression
             || expression instanceof NullOperand
             || (expression instanceof ConstantOperand
                 && !((ConstantOperand) expression).isNegativeNumber())
-        ? "-" + expression.getStringWithViewOfThisExpression()
-        : "-(" + expression.getStringWithViewOfThisExpression() + ")";
+        ? "-" + expression.getOutputSymbol()
+        : "-(" + expression.getOutputSymbol() + ")";
+  }
+
+  @Override
+  protected Expression doCopy() {
+    return new NegationExpression(expression.copy());
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/RegularExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/RegularExpression.java
index 6afbf688747..05c4ffd4e68 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/RegularExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/RegularExpression.java
@@ -90,8 +90,13 @@ public class RegularExpression extends UnaryExpression {
   }
 
   @Override
-  public String getStringWithViewOfThisExpressionInternal() {
-    return expression.getStringWithViewOfThisExpression() + " REGEXP '" + 
patternString + "'";
+  public String getOutputSymbolInternal() {
+    return expression.getOutputSymbol() + " REGEXP '" + patternString + "'";
+  }
+
+  @Override
+  protected Expression doCopy() {
+    return new RegularExpression(expression.copy(), patternString, pattern);
   }
 
   @Override


Reply via email to