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
