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

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


The following commit(s) were added to refs/heads/master by this push:
     new ea70aea230 [IOTDB-4025] Implement IntermediateLayerVisitor for 
Expression (#6891)
ea70aea230 is described below

commit ea70aea230deedb9275dbeca1f87098f23cde999
Author: Liao Lanyu <[email protected]>
AuthorDate: Fri Aug 12 10:43:53 2022 +0800

    [IOTDB-4025] Implement IntermediateLayerVisitor for Expression (#6891)
---
 .../iotdb/db/mpp/plan/expression/Expression.java   |  28 +-
 .../plan/expression/binary/AdditionExpression.java |  10 -
 .../plan/expression/binary/BinaryExpression.java   | 110 -----
 .../plan/expression/binary/DivisionExpression.java |  10 -
 .../plan/expression/binary/EqualToExpression.java  |   9 -
 .../expression/binary/GreaterEqualExpression.java  |  10 -
 .../expression/binary/GreaterThanExpression.java   |  10 -
 .../expression/binary/LessEqualExpression.java     |   9 -
 .../plan/expression/binary/LessThanExpression.java |   9 -
 .../plan/expression/binary/LogicAndExpression.java |   9 -
 .../plan/expression/binary/LogicOrExpression.java  |   9 -
 .../plan/expression/binary/ModuloExpression.java   |   9 -
 .../binary/MultiplicationExpression.java           |  10 -
 .../plan/expression/binary/NonEqualExpression.java |   9 -
 .../expression/binary/SubtractionExpression.java   |  10 -
 .../mpp/plan/expression/leaf/ConstantOperand.java  |  42 --
 .../plan/expression/leaf/TimeSeriesOperand.java    |  62 ---
 .../mpp/plan/expression/leaf/TimestampOperand.java |  60 ---
 .../plan/expression/multi/FunctionExpression.java  | 234 -----------
 .../plan/expression/ternary/BetweenExpression.java |  15 -
 .../plan/expression/ternary/TernaryExpression.java | 130 ------
 .../db/mpp/plan/expression/unary/InExpression.java |   8 -
 .../plan/expression/unary/IsNullExpression.java    |   8 -
 .../mpp/plan/expression/unary/LikeExpression.java  |   8 -
 .../plan/expression/unary/LogicNotExpression.java  |   8 -
 .../plan/expression/unary/NegationExpression.java  |   8 -
 .../plan/expression/unary/RegularExpression.java   |   8 -
 .../mpp/plan/expression/unary/UnaryExpression.java |  86 ----
 .../visitor/IntermediateLayerVisitor.java          | 454 ++++++++++++++++++++
 .../visitor/OldIntermediateLayerVisitor.java       | 461 +++++++++++++++++++++
 .../mpp/transformation/dag/builder/DAGBuilder.java |  24 +-
 .../dag/builder/EvaluationDAGBuilder.java          |  21 +-
 32 files changed, 942 insertions(+), 956 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 3436370342..829873d941 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
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.binary.AdditionExpression;
@@ -50,10 +49,7 @@ import 
org.apache.iotdb.db.mpp.plan.expression.unary.NegationExpression;
 import org.apache.iotdb.db.mpp.plan.expression.unary.RegularExpression;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -184,27 +180,11 @@ public abstract class Expression {
   public abstract void bindInputLayerColumnIndexWithExpression(
       Map<String, List<InputLocation>> inputLocations);
 
-  public abstract void updateStatisticsForMemoryAssigner(LayerMemoryAssigner 
memoryAssigner);
+  public Integer getInputColumnIndex() {
+    return inputColumnIndex;
+  }
 
-  // TODO: remove after MPP finish
-  @Deprecated
-  public abstract IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException;
-
-  public abstract IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException;
+  public abstract void updateStatisticsForMemoryAssigner(LayerMemoryAssigner 
memoryAssigner);
 
   
/////////////////////////////////////////////////////////////////////////////////////////////////
   // toString
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 d4c80fe955..01591f6dfc 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticAdditionTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticBinaryTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,13 +34,6 @@ public class AdditionExpression extends 
ArithmeticBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected ArithmeticBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new ArithmeticAdditionTransformer(
-        leftParentLayerPointReader, rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "+";
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 8e1ce8d452..0ee8b1ab84 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
@@ -21,23 +21,13 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.BinaryTransformer;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -225,111 +215,11 @@ public abstract class BinaryExpression extends 
Expression {
     memoryAssigner.increaseExpressionReference(this);
   }
 
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      IntermediateLayer leftParentIntermediateLayer =
-          leftExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              expressionDataTypeMap,
-              memoryAssigner);
-      IntermediateLayer rightParentIntermediateLayer =
-          rightExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              expressionDataTypeMap,
-              memoryAssigner);
-      Transformer transformer =
-          constructTransformer(
-              leftParentIntermediateLayer.constructPointReader(),
-              rightParentIntermediateLayer.constructPointReader());
-      expressionDataTypeMap.put(this, transformer.getDataType());
-
-      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
-      // yet. And since a ConstantLayerPointReader won't produce too much IO,
-      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1 || isConstantOperand()
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      IntermediateLayer leftParentIntermediateLayer =
-          leftExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              typeProvider,
-              memoryAssigner);
-      IntermediateLayer rightParentIntermediateLayer =
-          rightExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              typeProvider,
-              memoryAssigner);
-      Transformer transformer =
-          constructTransformer(
-              leftParentIntermediateLayer.constructPointReader(),
-              rightParentIntermediateLayer.constructPointReader());
-
-      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
-      // yet. And since a ConstantLayerPointReader won't produce too much IO,
-      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1 || isConstantOperand()
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
   @Override
   public boolean isMappable(TypeProvider typeProvider) {
     return leftExpression.isMappable(typeProvider) && 
rightExpression.isMappable(typeProvider);
   }
 
-  protected abstract BinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader);
-
   @Override
   public final String getExpressionStringInternal() {
     StringBuilder builder = new StringBuilder();
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 26ecfdb071..ee444a134b 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticDivisionTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,13 +34,6 @@ public class DivisionExpression extends 
ArithmeticBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected ArithmeticBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new ArithmeticDivisionTransformer(
-        leftParentLayerPointReader, rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "/";
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 a9a683ce87..54f9882d4a 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareEqualToTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,12 +34,6 @@ public class EqualToExpression extends 
CompareBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected CompareBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new CompareEqualToTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "=";
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 d87a42046f..f065198f6b 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareGreaterEqualTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,13 +34,6 @@ public class GreaterEqualExpression extends 
CompareBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected CompareBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new CompareGreaterEqualTransformer(
-        leftParentLayerPointReader, rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return ">=";
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 848557695c..c7fa4a2635 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareGreaterThanTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,13 +34,6 @@ public class GreaterThanExpression extends 
CompareBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected CompareBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new CompareGreaterThanTransformer(
-        leftParentLayerPointReader, rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return ">";
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 36c9e12294..a765c20c37 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareLessEqualTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,12 +34,6 @@ public class LessEqualExpression extends 
CompareBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected CompareBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new CompareLessEqualTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "<=";
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 630b7a4edc..b3d8ba0cae 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareLessThanTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,12 +34,6 @@ public class LessThanExpression extends 
CompareBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected CompareBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new CompareLessThanTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "<";
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 68addddc49..311ae5046b 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicAndTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicBinaryTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,12 +34,6 @@ public class LogicAndExpression extends 
LogicBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected LogicBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new LogicAndTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "&";
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 785263b210..c0b877af47 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicOrTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,12 +34,6 @@ public class LogicOrExpression extends LogicBinaryExpression 
{
     super(byteBuffer);
   }
 
-  @Override
-  protected LogicBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new LogicOrTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "|";
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 24f7ab6b40..c2ba296cfa 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticModuloTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,12 +34,6 @@ public class ModuloExpression extends 
ArithmeticBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected ArithmeticBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new ArithmeticModuloTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "%";
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 adc381612d..a6bf85d42d 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticMultiplicationTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,13 +34,6 @@ public class MultiplicationExpression extends 
ArithmeticBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected ArithmeticBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new ArithmeticMultiplicationTransformer(
-        leftParentLayerPointReader, rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "*";
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 2a25f392f2..e5665be10d 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareNonEqualTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,12 +34,6 @@ public class NonEqualExpression extends 
CompareBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected CompareBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new CompareNonEqualTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "!=";
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 946179f782..a9832fcca5 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
@@ -21,9 +21,6 @@ package org.apache.iotdb.db.mpp.plan.expression.binary;
 
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticBinaryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticSubtractionTransformer;
 
 import java.nio.ByteBuffer;
 
@@ -37,13 +34,6 @@ public class SubtractionExpression extends 
ArithmeticBinaryExpression {
     super(byteBuffer);
   }
 
-  @Override
-  protected ArithmeticBinaryTransformer constructTransformer(
-      LayerPointReader leftParentLayerPointReader, LayerPointReader 
rightParentLayerPointReader) {
-    return new ArithmeticSubtractionTransformer(
-        leftParentLayerPointReader, rightParentLayerPointReader);
-  }
-
   @Override
   protected String operator() {
     return "-";
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 de0584f4fe..8056c963a8 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
@@ -20,17 +20,12 @@
 package org.apache.iotdb.db.mpp.plan.expression.leaf;
 
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 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;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.ConstantIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
@@ -123,43 +118,6 @@ public class ConstantOperand extends LeafOperand {
     // Do nothing
   }
 
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      expressionDataTypeMap.put(this, this.getDataType());
-      IntermediateLayer intermediateLayer =
-          new ConstantIntermediateLayer(this, queryId, 
memoryAssigner.assign());
-      expressionIntermediateLayerMap.put(this, intermediateLayer);
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      IntermediateLayer intermediateLayer =
-          new ConstantIntermediateLayer(this, queryId, 
memoryAssigner.assign());
-      expressionIntermediateLayerMap.put(this, intermediateLayer);
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
   @Override
   public String getExpressionStringInternal() {
     return valueString;
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 06baccbce1..264bb5381b 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
@@ -21,20 +21,13 @@ package org.apache.iotdb.db.mpp.plan.expression.leaf;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.path.PathDeserializeUtil;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 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;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
@@ -121,61 +114,6 @@ public class TimeSeriesOperand extends LeafOperand {
     memoryAssigner.increaseExpressionReference(this);
   }
 
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      LayerPointReader parentLayerPointReader =
-          rawTimeSeriesInputLayer.constructValuePointReader(inputColumnIndex);
-      expressionDataTypeMap.put(this, parentLayerPointReader.getDataType());
-
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      LayerPointReader parentLayerPointReader =
-          rawTimeSeriesInputLayer.constructValuePointReader(inputColumnIndex);
-
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
   @Override
   public String getExpressionStringInternal() {
     return path.isMeasurementAliasExists() ? path.getFullPathWithAlias() : 
path.getFullPath();
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 5adecbe211..076d7594d2 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
@@ -21,19 +21,12 @@ package org.apache.iotdb.db.mpp.plan.expression.leaf;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 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;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
@@ -106,59 +99,6 @@ public class TimestampOperand extends LeafOperand {
     memoryAssigner.increaseExpressionReference(this);
   }
 
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      LayerPointReader parentLayerPointReader = 
rawTimeSeriesInputLayer.constructTimePointReader();
-      expressionDataTypeMap.put(this, parentLayerPointReader.getDataType());
-
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      LayerPointReader parentLayerPointReader = 
rawTimeSeriesInputLayer.constructTimePointReader();
-
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, parentLayerPointReader));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
   @Override
   protected boolean isConstantOperandInternal() {
     return false;
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 259b50565f..2d6fad00d9 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
@@ -23,7 +23,6 @@ import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
@@ -31,19 +30,7 @@ import 
org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.MultiInputColumnIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.MappableUDFQueryRowTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryRowTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryRowWindowTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.TransparentTransformer;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFInformationInferrer;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
@@ -322,113 +309,6 @@ public class FunctionExpression extends Expression {
     memoryAssigner.increaseExpressionReference(this);
   }
 
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-      Transformer transformer;
-      if (isBuiltInAggregationFunctionExpression) {
-        transformer =
-            new TransparentTransformer(
-                
rawTimeSeriesInputLayer.constructValuePointReader(inputColumnIndex));
-      } else {
-        IntermediateLayer udfInputIntermediateLayer =
-            constructUdfInputIntermediateLayer(
-                queryId,
-                udtfContext,
-                rawTimeSeriesInputLayer,
-                expressionIntermediateLayerMap,
-                typeProvider,
-                memoryAssigner);
-        transformer =
-            constructUdfTransformer(
-                queryId, udtfContext, typeProvider, memoryAssigner, 
udfInputIntermediateLayer);
-      }
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  private IntermediateLayer constructUdfInputIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    List<IntermediateLayer> intermediateLayers = new ArrayList<>();
-    for (Expression expression : expressions) {
-      intermediateLayers.add(
-          expression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              typeProvider,
-              memoryAssigner));
-    }
-    return intermediateLayers.size() == 1
-        ? intermediateLayers.get(0)
-        : new MultiInputColumnIntermediateLayer(
-            this,
-            queryId,
-            memoryAssigner.assign(),
-            intermediateLayers.stream()
-                .map(IntermediateLayer::constructPointReader)
-                .collect(Collectors.toList()));
-  }
-
-  private UDFQueryTransformer constructUdfTransformer(
-      long queryId,
-      UDTFContext udtfContext,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner,
-      IntermediateLayer udfInputIntermediateLayer)
-      throws QueryProcessException, IOException {
-    UDTFExecutor executor = udtfContext.getExecutorByFunctionExpression(this);
-
-    executor.beforeStart(
-        queryId,
-        memoryAssigner.assign(),
-        
expressions.stream().map(Expression::toString).collect(Collectors.toList()),
-        expressions.stream()
-            .map(f -> typeProvider.getType(f.toString()))
-            .collect(Collectors.toList()),
-        functionAttributes);
-
-    AccessStrategy accessStrategy = 
executor.getConfigurations().getAccessStrategy();
-    switch (accessStrategy.getAccessStrategyType()) {
-      case MAPPABLE_ROW_BY_ROW:
-        return new MappableUDFQueryRowTransformer(
-            udfInputIntermediateLayer.constructRowReader(), executor);
-      case ROW_BY_ROW:
-        return new 
UDFQueryRowTransformer(udfInputIntermediateLayer.constructRowReader(), 
executor);
-      case SLIDING_SIZE_WINDOW:
-      case SLIDING_TIME_WINDOW:
-        return new UDFQueryRowWindowTransformer(
-            udfInputIntermediateLayer.constructRowWindowReader(
-                accessStrategy, memoryAssigner.assign()),
-            executor);
-      default:
-        throw new UnsupportedOperationException("Unsupported transformer 
access strategy");
-    }
-  }
-
   @Override
   public boolean isMappable(TypeProvider typeProvider) {
     if (isBuiltInAggregationFunctionExpression) {
@@ -445,120 +325,6 @@ public class FunctionExpression extends Expression {
         .equals(AccessStrategy.AccessStrategyType.MAPPABLE_ROW_BY_ROW);
   }
 
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-      Transformer transformer;
-      if (isBuiltInAggregationFunctionExpression) {
-        transformer =
-            new TransparentTransformer(
-                
rawTimeSeriesInputLayer.constructValuePointReader(inputColumnIndex));
-      } else {
-        IntermediateLayer udfInputIntermediateLayer =
-            constructUdfInputIntermediateLayer(
-                queryId,
-                udtfContext,
-                rawTimeSeriesInputLayer,
-                expressionIntermediateLayerMap,
-                expressionDataTypeMap,
-                memoryAssigner);
-        transformer =
-            constructUdfTransformer(
-                queryId,
-                udtfContext,
-                expressionDataTypeMap,
-                memoryAssigner,
-                udfInputIntermediateLayer);
-      }
-      expressionDataTypeMap.put(this, transformer.getDataType());
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  // TODO: remove it after MPP finished
-  @Deprecated
-  private IntermediateLayer constructUdfInputIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    List<IntermediateLayer> intermediateLayers = new ArrayList<>();
-    for (Expression expression : expressions) {
-      intermediateLayers.add(
-          expression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              expressionDataTypeMap,
-              memoryAssigner));
-    }
-    return intermediateLayers.size() == 1
-        ? intermediateLayers.get(0)
-        : new MultiInputColumnIntermediateLayer(
-            this,
-            queryId,
-            memoryAssigner.assign(),
-            intermediateLayers.stream()
-                .map(IntermediateLayer::constructPointReader)
-                .collect(Collectors.toList()));
-  }
-
-  // TODO: remove it after MPP finished
-  @Deprecated
-  private UDFQueryTransformer constructUdfTransformer(
-      long queryId,
-      UDTFContext udtfContext,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner,
-      IntermediateLayer udfInputIntermediateLayer)
-      throws QueryProcessException, IOException {
-    UDTFExecutor executor = udtfContext.getExecutorByFunctionExpression(this);
-
-    executor.beforeStart(
-        queryId,
-        memoryAssigner.assign(),
-        
expressions.stream().map(Expression::toString).collect(Collectors.toList()),
-        
expressions.stream().map(expressionDataTypeMap::get).collect(Collectors.toList()),
-        functionAttributes);
-
-    AccessStrategy accessStrategy = 
executor.getConfigurations().getAccessStrategy();
-    switch (accessStrategy.getAccessStrategyType()) {
-      case MAPPABLE_ROW_BY_ROW:
-        return new MappableUDFQueryRowTransformer(
-            udfInputIntermediateLayer.constructRowReader(), executor);
-      case ROW_BY_ROW:
-        return new 
UDFQueryRowTransformer(udfInputIntermediateLayer.constructRowReader(), 
executor);
-      case SLIDING_SIZE_WINDOW:
-      case SLIDING_TIME_WINDOW:
-        return new UDFQueryRowWindowTransformer(
-            udfInputIntermediateLayer.constructRowWindowReader(
-                accessStrategy, memoryAssigner.assign()),
-            executor);
-      default:
-        throw new UnsupportedOperationException("Unsupported transformer 
access strategy");
-    }
-  }
-
   public List<PartialPath> getPaths() {
     if (paths == null) {
       paths = new ArrayList<>();
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 b1445eca59..2b6f9c79e3 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
@@ -24,9 +24,6 @@ package org.apache.iotdb.db.mpp.plan.expression.ternary;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.ternary.BetweenTransformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.ternary.TernaryTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
@@ -61,18 +58,6 @@ public class BetweenExpression extends TernaryExpression {
     this.isNotBetween = ReadWriteIOUtils.readBool(byteBuffer);
   }
 
-  @Override
-  protected TernaryTransformer constructTransformer(
-      LayerPointReader firstParentLayerPointReader,
-      LayerPointReader secondParentLayerPointReader,
-      LayerPointReader thirdParentLayerPointReader) {
-    return new BetweenTransformer(
-        firstParentLayerPointReader,
-        secondParentLayerPointReader,
-        thirdParentLayerPointReader,
-        isNotBetween);
-  }
-
   @Override
   protected String operator() {
     return "between";
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java
index 0c8a5fb547..80725eab5f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/ternary/TernaryExpression.java
@@ -23,23 +23,13 @@ package org.apache.iotdb.db.mpp.plan.expression.ternary;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.ternary.TernaryTransformer;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -211,126 +201,6 @@ public abstract class TernaryExpression extends 
Expression {
     memoryAssigner.increaseExpressionReference(this);
   }
 
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      IntermediateLayer firstParentIntermediateLayer =
-          firstExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              expressionDataTypeMap,
-              memoryAssigner);
-      IntermediateLayer secondParentIntermediateLayer =
-          secondExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              expressionDataTypeMap,
-              memoryAssigner);
-      IntermediateLayer thirdParentIntermediateLayer =
-          thirdExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              expressionDataTypeMap,
-              memoryAssigner);
-      Transformer transformer =
-          constructTransformer(
-              firstParentIntermediateLayer.constructPointReader(),
-              secondParentIntermediateLayer.constructPointReader(),
-              thirdParentIntermediateLayer.constructPointReader());
-      expressionDataTypeMap.put(this, transformer.getDataType());
-
-      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
-      // yet. And since a ConstantLayerPointReader won't produce too much IO,
-      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1 || isConstantOperand()
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      IntermediateLayer firstParentIntermediateLayer =
-          firstExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              typeProvider,
-              memoryAssigner);
-      IntermediateLayer secondParentIntermediateLayer =
-          secondExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              typeProvider,
-              memoryAssigner);
-      IntermediateLayer thirdParentIntermediateLayer =
-          thirdExpression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              typeProvider,
-              memoryAssigner);
-      Transformer transformer =
-          constructTransformer(
-              firstParentIntermediateLayer.constructPointReader(),
-              secondParentIntermediateLayer.constructPointReader(),
-              thirdParentIntermediateLayer.constructPointReader());
-
-      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
-      // yet. And since a ConstantLayerPointReader won't produce too much IO,
-      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1 || isConstantOperand()
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  protected abstract TernaryTransformer constructTransformer(
-      LayerPointReader firstParentLayerPointReader,
-      LayerPointReader secondParentLayerPointReader,
-      LayerPointReader thirdParentLayerPointReader);
-
   protected abstract String operator();
 
   @Override
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 47aa0dd53e..8dde1583a1 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
@@ -25,9 +25,6 @@ import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
 import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.InTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
@@ -102,11 +99,6 @@ public class InExpression extends UnaryExpression {
     return ExpressionType.IN;
   }
 
-  @Override
-  protected Transformer constructTransformer(LayerPointReader pointReader) {
-    return new InTransformer(pointReader, isNotIn, values);
-  }
-
   @Override
   protected Expression constructExpression(Expression childExpression) {
     return new InExpression(childExpression, isNotIn, values);
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 83f4e3a3b0..3b910b0cde 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
@@ -22,9 +22,6 @@ package org.apache.iotdb.db.mpp.plan.expression.unary;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.IsNullTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
@@ -69,11 +66,6 @@ public class IsNullExpression extends UnaryExpression {
     return ExpressionType.IS_NULL;
   }
 
-  @Override
-  protected Transformer constructTransformer(LayerPointReader pointReader) {
-    return new IsNullTransformer(pointReader, isNot);
-  }
-
   @Override
   protected Expression constructExpression(Expression childExpression) {
     return new IsNullExpression(childExpression, isNot);
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 d14b2c30a3..004b56c507 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
@@ -23,9 +23,6 @@ import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.RegularTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
@@ -141,11 +138,6 @@ public class LikeExpression extends UnaryExpression {
     return ExpressionType.LIKE;
   }
 
-  @Override
-  protected Transformer constructTransformer(LayerPointReader pointReader) {
-    return new RegularTransformer(pointReader, pattern);
-  }
-
   @Override
   protected Expression constructExpression(Expression childExpression) {
     return new LikeExpression(childExpression, patternString, pattern);
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 9a7191d497..c1b1a7f5ef 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
@@ -26,9 +26,6 @@ import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
 import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.LogicNotTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.nio.ByteBuffer;
@@ -43,11 +40,6 @@ public class LogicNotExpression extends UnaryExpression {
     super(Expression.deserialize(byteBuffer));
   }
 
-  @Override
-  protected Transformer constructTransformer(LayerPointReader pointReader) {
-    return new LogicNotTransformer(pointReader);
-  }
-
   @Override
   protected Expression constructExpression(Expression childExpression) {
     return new LogicNotExpression(childExpression);
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 2b9cba69b8..30473ddeac 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
@@ -26,9 +26,6 @@ import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
 import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.ArithmeticNegationTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.nio.ByteBuffer;
@@ -43,11 +40,6 @@ public class NegationExpression extends UnaryExpression {
     super(Expression.deserialize(byteBuffer));
   }
 
-  @Override
-  protected Transformer constructTransformer(LayerPointReader pointReader) {
-    return new ArithmeticNegationTransformer(pointReader);
-  }
-
   @Override
   protected Expression constructExpression(Expression childExpression) {
     return new NegationExpression(childExpression);
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 aee30c1a3f..7759b29f68 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
@@ -23,9 +23,6 @@ import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.RegularTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
@@ -67,11 +64,6 @@ public class RegularExpression extends UnaryExpression {
     return pattern;
   }
 
-  @Override
-  protected Transformer constructTransformer(LayerPointReader pointReader) {
-    return new RegularTransformer(pointReader, pattern);
-  }
-
   @Override
   protected Expression constructExpression(Expression childExpression) {
     return new RegularExpression(childExpression, patternString, pattern);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java
index 2ba93e2e10..e53fd40d0a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/unary/UnaryExpression.java
@@ -21,23 +21,14 @@ package org.apache.iotdb.db.mpp.plan.expression.unary;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
-import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
-import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
-import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
-import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
-import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
 import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.db.qp.utils.WildcardsRemover;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -121,88 +112,11 @@ public abstract class UnaryExpression extends Expression {
     memoryAssigner.increaseExpressionReference(this);
   }
 
-  @Override
-  public final IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      Map<Expression, TSDataType> expressionDataTypeMap,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      IntermediateLayer parentLayerPointReader =
-          expression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              expressionDataTypeMap,
-              memoryAssigner);
-      Transformer transformer = 
constructTransformer(parentLayerPointReader.constructPointReader());
-      expressionDataTypeMap.put(this, transformer.getDataType());
-
-      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
-      // yet. And since a ConstantLayerPointReader won't produce too much IO,
-      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1 || isConstantOperand()
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
-  @Override
-  public IntermediateLayer constructIntermediateLayer(
-      long queryId,
-      UDTFContext udtfContext,
-      QueryDataSetInputLayer rawTimeSeriesInputLayer,
-      Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
-      TypeProvider typeProvider,
-      LayerMemoryAssigner memoryAssigner)
-      throws QueryProcessException, IOException {
-    if (!expressionIntermediateLayerMap.containsKey(this)) {
-      float memoryBudgetInMB = memoryAssigner.assign();
-
-      IntermediateLayer parentLayerPointReader =
-          expression.constructIntermediateLayer(
-              queryId,
-              udtfContext,
-              rawTimeSeriesInputLayer,
-              expressionIntermediateLayerMap,
-              typeProvider,
-              memoryAssigner);
-      Transformer transformer = 
constructTransformer(parentLayerPointReader.constructPointReader());
-
-      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
-      // yet. And since a ConstantLayerPointReader won't produce too much IO,
-      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
-      expressionIntermediateLayerMap.put(
-          this,
-          memoryAssigner.getReference(this) == 1 || isConstantOperand()
-              ? new SingleInputColumnSingleReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer)
-              : new SingleInputColumnMultiReferenceIntermediateLayer(
-                  this, queryId, memoryBudgetInMB, transformer));
-    }
-
-    return expressionIntermediateLayerMap.get(this);
-  }
-
   @Override
   public boolean isMappable(TypeProvider typeProvider) {
     return expression.isMappable(typeProvider);
   }
 
-  protected abstract Transformer constructTransformer(LayerPointReader 
pointReader);
-
   @Override
   public final void concat(List<PartialPath> prefixPaths, List<Expression> 
resultExpressions) {
     List<Expression> resultExpressionsForRecursion = new ArrayList<>();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/IntermediateLayerVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/IntermediateLayerVisitor.java
new file mode 100644
index 0000000000..75095e51d0
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/IntermediateLayerVisitor.java
@@ -0,0 +1,454 @@
+/*
+ * 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.iotdb.db.mpp.plan.expression.visitor;
+
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
+import org.apache.iotdb.db.mpp.plan.expression.binary.BinaryExpression;
+import org.apache.iotdb.db.mpp.plan.expression.leaf.ConstantOperand;
+import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
+import org.apache.iotdb.db.mpp.plan.expression.leaf.TimestampOperand;
+import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression;
+import org.apache.iotdb.db.mpp.plan.expression.ternary.BetweenExpression;
+import org.apache.iotdb.db.mpp.plan.expression.ternary.TernaryExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.InExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.IsNullExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.LikeExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.RegularExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.UnaryExpression;
+import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
+import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.ConstantIntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.MultiInputColumnIntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
+import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
+import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticAdditionTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticDivisionTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticModuloTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticMultiplicationTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticSubtractionTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareEqualToTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareGreaterEqualTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareGreaterThanTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareLessEqualTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareLessThanTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareNonEqualTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicAndTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicOrTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.MappableUDFQueryRowTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryRowTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryRowWindowTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.ternary.BetweenTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.ArithmeticNegationTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.InTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.IsNullTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.LogicNotTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.RegularTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.TransparentTransformer;
+import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
+import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
+import org.apache.iotdb.udf.api.customizer.strategy.AccessStrategy;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/** Responsible for constructing {@link IntermediateLayer} through Expression. 
*/
+public class IntermediateLayerVisitor
+    extends ExpressionVisitor<
+        IntermediateLayer, 
IntermediateLayerVisitor.IntermediateLayerVisitorContext> {
+
+  @Override
+  public IntermediateLayer visitExpression(
+      Expression expression, IntermediateLayerVisitorContext context) {
+    throw new UnsupportedOperationException(
+        "Unsupported statement type: " + expression.getClass().getName());
+  }
+
+  @Override
+  public IntermediateLayer visitUnaryExpression(
+      UnaryExpression unaryExpression, IntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(unaryExpression)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      IntermediateLayer parentLayerPointReader =
+          this.process(unaryExpression.getExpression(), context);
+
+      Transformer transformer =
+          getConcreteUnaryTransformer(
+              unaryExpression, parentLayerPointReader.constructPointReader());
+
+      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
+      // yet. And since a ConstantLayerPointReader won't produce too much IO,
+      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
+      context.expressionIntermediateLayerMap.put(
+          unaryExpression,
+          context.memoryAssigner.getReference(unaryExpression) == 1
+                  || unaryExpression.isConstantOperand()
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  unaryExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  unaryExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(unaryExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitBinaryExpression(
+      BinaryExpression binaryExpression, IntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(binaryExpression)) 
{
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      IntermediateLayer leftParentIntermediateLayer =
+          this.process(binaryExpression.getLeftExpression(), context);
+      IntermediateLayer rightParentIntermediateLayer =
+          this.process(binaryExpression.getRightExpression(), context);
+
+      Transformer transformer =
+          getConcreteBinaryTransformer(
+              binaryExpression,
+              leftParentIntermediateLayer.constructPointReader(),
+              rightParentIntermediateLayer.constructPointReader());
+
+      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
+      // yet. And since a ConstantLayerPointReader won't produce too much IO,
+      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
+      context.expressionIntermediateLayerMap.put(
+          binaryExpression,
+          context.memoryAssigner.getReference(binaryExpression) == 1
+                  || binaryExpression.isConstantOperand()
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  binaryExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  binaryExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(binaryExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitTernaryExpression(
+      TernaryExpression ternaryExpression, IntermediateLayerVisitorContext 
context) {
+    if 
(!context.expressionIntermediateLayerMap.containsKey(ternaryExpression)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      IntermediateLayer firstParentIntermediateLayer =
+          this.process(ternaryExpression.getFirstExpression(), context);
+      IntermediateLayer secondParentIntermediateLayer =
+          this.process(ternaryExpression.getSecondExpression(), context);
+      IntermediateLayer thirdParentIntermediateLayer =
+          this.process(ternaryExpression.getThirdExpression(), context);
+      Transformer transformer =
+          getConcreteTernaryTransformer(
+              ternaryExpression,
+              firstParentIntermediateLayer.constructPointReader(),
+              secondParentIntermediateLayer.constructPointReader(),
+              thirdParentIntermediateLayer.constructPointReader());
+
+      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
+      // yet. And since a ConstantLayerPointReader won't produce too much IO,
+      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
+      context.expressionIntermediateLayerMap.put(
+          ternaryExpression,
+          context.memoryAssigner.getReference(ternaryExpression) == 1
+                  || ternaryExpression.isConstantOperand()
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  ternaryExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  ternaryExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(ternaryExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitFunctionExpression(
+      FunctionExpression functionExpression, IntermediateLayerVisitorContext 
context) {
+    if 
(!context.expressionIntermediateLayerMap.containsKey(functionExpression)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+      Transformer transformer;
+      if (functionExpression.isBuiltInAggregationFunctionExpression()) {
+        transformer =
+            new TransparentTransformer(
+                context.rawTimeSeriesInputLayer.constructValuePointReader(
+                    functionExpression.getInputColumnIndex()));
+      } else {
+        try {
+          IntermediateLayer udfInputIntermediateLayer =
+              constructUdfInputIntermediateLayer(functionExpression, context);
+          transformer = getUdfTransformer(functionExpression, context, 
udfInputIntermediateLayer);
+        } catch (QueryProcessException | IOException e) {
+          throw new RuntimeException(e);
+        }
+      }
+      context.expressionIntermediateLayerMap.put(
+          functionExpression,
+          context.memoryAssigner.getReference(functionExpression) == 1
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  functionExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  functionExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(functionExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitTimeStampOperand(
+      TimestampOperand timestampOperand, IntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(timestampOperand)) 
{
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      LayerPointReader parentLayerPointReader =
+          context.rawTimeSeriesInputLayer.constructTimePointReader();
+
+      context.expressionIntermediateLayerMap.put(
+          timestampOperand,
+          context.memoryAssigner.getReference(timestampOperand) == 1
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  timestampOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  timestampOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader));
+    }
+
+    return context.expressionIntermediateLayerMap.get(timestampOperand);
+  }
+
+  @Override
+  public IntermediateLayer visitTimeSeriesOperand(
+      TimeSeriesOperand timeSeriesOperand, IntermediateLayerVisitorContext 
context) {
+    if 
(!context.expressionIntermediateLayerMap.containsKey(timeSeriesOperand)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      LayerPointReader parentLayerPointReader =
+          context.rawTimeSeriesInputLayer.constructValuePointReader(
+              timeSeriesOperand.getInputColumnIndex());
+
+      context.expressionIntermediateLayerMap.put(
+          timeSeriesOperand,
+          context.memoryAssigner.getReference(timeSeriesOperand) == 1
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  timeSeriesOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  timeSeriesOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader));
+    }
+
+    return context.expressionIntermediateLayerMap.get(timeSeriesOperand);
+  }
+
+  @Override
+  public IntermediateLayer visitConstantOperand(
+      ConstantOperand constantOperand, IntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(constantOperand)) {
+      try {
+        IntermediateLayer intermediateLayer =
+            new ConstantIntermediateLayer(
+                constantOperand, context.queryId, 
context.memoryAssigner.assign());
+        context.expressionIntermediateLayerMap.put(constantOperand, 
intermediateLayer);
+      } catch (QueryProcessException e) {
+        throw new RuntimeException(e);
+      }
+    }
+
+    return context.expressionIntermediateLayerMap.get(constantOperand);
+  }
+
+  private Transformer getConcreteUnaryTransformer(
+      Expression expression, LayerPointReader pointReader) {
+    switch (expression.getExpressionType()) {
+      case IN:
+        InExpression inExpression = (InExpression) expression;
+        return new InTransformer(pointReader, inExpression.isNotIn(), 
inExpression.getValues());
+      case IS_NULL:
+        IsNullExpression isNullExpression = (IsNullExpression) expression;
+        return new IsNullTransformer(pointReader, isNullExpression.isNot());
+      case LOGIC_NOT:
+        return new LogicNotTransformer(pointReader);
+      case NEGATION:
+        return new ArithmeticNegationTransformer(pointReader);
+      case LIKE:
+        LikeExpression likeExpression = (LikeExpression) expression;
+        return new RegularTransformer(pointReader, 
likeExpression.getPattern());
+      case REGEXP:
+        RegularExpression regularExpression = (RegularExpression) expression;
+        return new RegularTransformer(pointReader, 
regularExpression.getPattern());
+      default:
+        throw new UnsupportedOperationException(
+            "Unsupported Expression Type: " + expression.getExpressionType());
+    }
+  }
+
+  private Transformer getConcreteBinaryTransformer(
+      Expression expression,
+      LayerPointReader leftParentLayerPointReader,
+      LayerPointReader rightParentLayerPointReader) {
+    switch (expression.getExpressionType()) {
+      case ADDITION:
+        return new ArithmeticAdditionTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case SUBTRACTION:
+        return new ArithmeticSubtractionTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case MULTIPLICATION:
+        return new ArithmeticMultiplicationTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case DIVISION:
+        return new ArithmeticDivisionTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case MODULO:
+        return new ArithmeticModuloTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case EQUAL_TO:
+        return new CompareEqualToTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case NON_EQUAL:
+        return new CompareNonEqualTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case GREATER_THAN:
+        return new CompareGreaterThanTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case GREATER_EQUAL:
+        return new CompareGreaterEqualTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case LESS_THAN:
+        return new CompareLessThanTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case LESS_EQUAL:
+        return new CompareLessEqualTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case LOGIC_AND:
+        return new LogicAndTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
+      case LOGIC_OR:
+        return new LogicOrTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
+      default:
+        throw new UnsupportedOperationException(
+            "Unsupported Expression Type: " + expression.getExpressionType());
+    }
+  }
+
+  private Transformer getConcreteTernaryTransformer(
+      Expression expression,
+      LayerPointReader firstParentLayerPointReader,
+      LayerPointReader secondParentLayerPointReader,
+      LayerPointReader thirdParentLayerPointReader) {
+    switch (expression.getExpressionType()) {
+      case BETWEEN:
+        BetweenExpression betweenExpression = (BetweenExpression) expression;
+        return new BetweenTransformer(
+            firstParentLayerPointReader,
+            secondParentLayerPointReader,
+            thirdParentLayerPointReader,
+            betweenExpression.isNotBetween());
+      default:
+        throw new UnsupportedOperationException(
+            "Unsupported Expression Type: " + expression.getExpressionType());
+    }
+  }
+
+  private UDFQueryTransformer getUdfTransformer(
+      FunctionExpression functionExpression,
+      IntermediateLayerVisitorContext context,
+      IntermediateLayer udfInputIntermediateLayer)
+      throws QueryProcessException, IOException {
+    UDTFExecutor executor = 
context.udtfContext.getExecutorByFunctionExpression(functionExpression);
+    List<Expression> expressions = functionExpression.getExpressions();
+
+    executor.beforeStart(
+        context.queryId,
+        context.memoryAssigner.assign(),
+        
expressions.stream().map(Expression::toString).collect(Collectors.toList()),
+        expressions.stream()
+            .map(f -> context.typeProvider.getType(f.toString()))
+            .collect(Collectors.toList()),
+        functionExpression.getFunctionAttributes());
+
+    AccessStrategy accessStrategy = 
executor.getConfigurations().getAccessStrategy();
+    switch (accessStrategy.getAccessStrategyType()) {
+      case MAPPABLE_ROW_BY_ROW:
+        return new MappableUDFQueryRowTransformer(
+            udfInputIntermediateLayer.constructRowReader(), executor);
+      case ROW_BY_ROW:
+        return new 
UDFQueryRowTransformer(udfInputIntermediateLayer.constructRowReader(), 
executor);
+      case SLIDING_SIZE_WINDOW:
+      case SLIDING_TIME_WINDOW:
+        return new UDFQueryRowWindowTransformer(
+            udfInputIntermediateLayer.constructRowWindowReader(
+                accessStrategy, context.memoryAssigner.assign()),
+            executor);
+      default:
+        throw new UnsupportedOperationException("Unsupported transformer 
access strategy");
+    }
+  }
+
+  private IntermediateLayer constructUdfInputIntermediateLayer(
+      FunctionExpression functionExpression, IntermediateLayerVisitorContext 
context)
+      throws QueryProcessException, IOException {
+    List<IntermediateLayer> intermediateLayers = new ArrayList<>();
+    for (Expression expression : functionExpression.getExpressions()) {
+      intermediateLayers.add(this.process(expression, context));
+    }
+    return intermediateLayers.size() == 1
+        ? intermediateLayers.get(0)
+        : new MultiInputColumnIntermediateLayer(
+            functionExpression,
+            context.queryId,
+            context.memoryAssigner.assign(),
+            intermediateLayers.stream()
+                .map(IntermediateLayer::constructPointReader)
+                .collect(Collectors.toList()));
+  }
+
+  public static class IntermediateLayerVisitorContext {
+    long queryId;
+
+    UDTFContext udtfContext;
+
+    QueryDataSetInputLayer rawTimeSeriesInputLayer;
+
+    Map<Expression, IntermediateLayer> expressionIntermediateLayerMap;
+
+    TypeProvider typeProvider;
+
+    LayerMemoryAssigner memoryAssigner;
+
+    public IntermediateLayerVisitorContext(
+        long queryId,
+        UDTFContext udtfContext,
+        QueryDataSetInputLayer rawTimeSeriesInputLayer,
+        Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
+        TypeProvider typeProvider,
+        LayerMemoryAssigner memoryAssigner) {
+      this.queryId = queryId;
+      this.udtfContext = udtfContext;
+      this.rawTimeSeriesInputLayer = rawTimeSeriesInputLayer;
+      this.expressionIntermediateLayerMap = expressionIntermediateLayerMap;
+      this.typeProvider = typeProvider;
+      this.memoryAssigner = memoryAssigner;
+    }
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/OldIntermediateLayerVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/OldIntermediateLayerVisitor.java
new file mode 100644
index 0000000000..a136c71af4
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/OldIntermediateLayerVisitor.java
@@ -0,0 +1,461 @@
+/*
+ * 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.iotdb.db.mpp.plan.expression.visitor;
+
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
+import org.apache.iotdb.db.mpp.plan.expression.binary.BinaryExpression;
+import org.apache.iotdb.db.mpp.plan.expression.leaf.ConstantOperand;
+import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
+import org.apache.iotdb.db.mpp.plan.expression.leaf.TimestampOperand;
+import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression;
+import org.apache.iotdb.db.mpp.plan.expression.ternary.BetweenExpression;
+import org.apache.iotdb.db.mpp.plan.expression.ternary.TernaryExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.InExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.IsNullExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.LikeExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.RegularExpression;
+import org.apache.iotdb.db.mpp.plan.expression.unary.UnaryExpression;
+import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
+import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.ConstantIntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.MultiInputColumnIntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnMultiReferenceIntermediateLayer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.SingleInputColumnSingleReferenceIntermediateLayer;
+import org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
+import org.apache.iotdb.db.mpp.transformation.dag.transformer.Transformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticAdditionTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticDivisionTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticModuloTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticMultiplicationTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.ArithmeticSubtractionTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareEqualToTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareGreaterEqualTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareGreaterThanTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareLessEqualTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareLessThanTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.CompareNonEqualTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicAndTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.binary.LogicOrTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.MappableUDFQueryRowTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryRowTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryRowWindowTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.multi.UDFQueryTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.ternary.BetweenTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.ArithmeticNegationTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.InTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.IsNullTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.LogicNotTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.RegularTransformer;
+import 
org.apache.iotdb.db.mpp.transformation.dag.transformer.unary.TransparentTransformer;
+import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFContext;
+import org.apache.iotdb.db.mpp.transformation.dag.udf.UDTFExecutor;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.udf.api.customizer.strategy.AccessStrategy;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Deprecated
+// remove after finishing MPP
+public class OldIntermediateLayerVisitor
+    extends ExpressionVisitor<
+        IntermediateLayer, 
OldIntermediateLayerVisitor.OldIntermediateLayerVisitorContext> {
+
+  @Override
+  public IntermediateLayer visitExpression(
+      Expression expression, OldIntermediateLayerVisitorContext context) {
+    throw new UnsupportedOperationException(
+        "Unsupported statement type: " + expression.getClass().getName());
+  }
+
+  @Override
+  public IntermediateLayer visitUnaryExpression(
+      UnaryExpression unaryExpression, OldIntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(unaryExpression)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      IntermediateLayer parentLayerPointReader =
+          this.process(unaryExpression.getExpression(), context);
+      Transformer transformer =
+          getConcreteUnaryTransformer(
+              unaryExpression, parentLayerPointReader.constructPointReader());
+      context.expressionDataTypeMap.put(unaryExpression, 
transformer.getDataType());
+
+      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
+      // yet. And since a ConstantLayerPointReader won't produce too much IO,
+      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
+      context.expressionIntermediateLayerMap.put(
+          unaryExpression,
+          context.memoryAssigner.getReference(unaryExpression) == 1
+                  || unaryExpression.isConstantOperand()
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  unaryExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  unaryExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(unaryExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitBinaryExpression(
+      BinaryExpression binaryExpression, OldIntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(binaryExpression)) 
{
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      IntermediateLayer leftParentIntermediateLayer =
+          this.process(binaryExpression.getLeftExpression(), context);
+      IntermediateLayer rightParentIntermediateLayer =
+          this.process(binaryExpression.getRightExpression(), context);
+
+      Transformer transformer =
+          getConcreteBinaryTransformer(
+              binaryExpression,
+              leftParentIntermediateLayer.constructPointReader(),
+              rightParentIntermediateLayer.constructPointReader());
+
+      context.expressionDataTypeMap.put(binaryExpression, 
transformer.getDataType());
+
+      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
+      // yet. And since a ConstantLayerPointReader won't produce too much IO,
+      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
+      context.expressionIntermediateLayerMap.put(
+          binaryExpression,
+          context.memoryAssigner.getReference(binaryExpression) == 1
+                  || binaryExpression.isConstantOperand()
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  binaryExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  binaryExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(binaryExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitTernaryExpression(
+      TernaryExpression ternaryExpression, OldIntermediateLayerVisitorContext 
context) {
+    if 
(!context.expressionIntermediateLayerMap.containsKey(ternaryExpression)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      IntermediateLayer firstParentIntermediateLayer =
+          this.process(ternaryExpression.getFirstExpression(), context);
+      IntermediateLayer secondParentIntermediateLayer =
+          this.process(ternaryExpression.getSecondExpression(), context);
+      IntermediateLayer thirdParentIntermediateLayer =
+          this.process(ternaryExpression.getThirdExpression(), context);
+      Transformer transformer =
+          getConcreteTernaryTransformer(
+              ternaryExpression,
+              firstParentIntermediateLayer.constructPointReader(),
+              secondParentIntermediateLayer.constructPointReader(),
+              thirdParentIntermediateLayer.constructPointReader());
+
+      context.expressionDataTypeMap.put(ternaryExpression, 
transformer.getDataType());
+
+      // SingleInputColumnMultiReferenceIntermediateLayer doesn't support 
ConstantLayerPointReader
+      // yet. And since a ConstantLayerPointReader won't produce too much IO,
+      // SingleInputColumnSingleReferenceIntermediateLayer could be a better 
choice.
+      context.expressionIntermediateLayerMap.put(
+          ternaryExpression,
+          context.memoryAssigner.getReference(ternaryExpression) == 1
+                  || ternaryExpression.isConstantOperand()
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  ternaryExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  ternaryExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(ternaryExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitFunctionExpression(
+      FunctionExpression functionExpression, 
OldIntermediateLayerVisitorContext context) {
+    if 
(!context.expressionIntermediateLayerMap.containsKey(functionExpression)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+      Transformer transformer;
+      if (functionExpression.isBuiltInAggregationFunctionExpression()) {
+        transformer =
+            new TransparentTransformer(
+                context.rawTimeSeriesInputLayer.constructValuePointReader(
+                    functionExpression.getInputColumnIndex()));
+      } else {
+        try {
+          IntermediateLayer udfInputIntermediateLayer =
+              constructUdfInputIntermediateLayer(functionExpression, context);
+          transformer = getUdfTransformer(functionExpression, context, 
udfInputIntermediateLayer);
+        } catch (QueryProcessException | IOException e) {
+          throw new RuntimeException(e);
+        }
+      }
+      context.expressionDataTypeMap.put(functionExpression, 
transformer.getDataType());
+      context.expressionIntermediateLayerMap.put(
+          functionExpression,
+          context.memoryAssigner.getReference(functionExpression) == 1
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  functionExpression, context.queryId, memoryBudgetInMB, 
transformer)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  functionExpression, context.queryId, memoryBudgetInMB, 
transformer));
+    }
+
+    return context.expressionIntermediateLayerMap.get(functionExpression);
+  }
+
+  @Override
+  public IntermediateLayer visitTimeStampOperand(
+      TimestampOperand timestampOperand, OldIntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(timestampOperand)) 
{
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      LayerPointReader parentLayerPointReader =
+          context.rawTimeSeriesInputLayer.constructTimePointReader();
+
+      context.expressionDataTypeMap.put(timestampOperand, 
parentLayerPointReader.getDataType());
+      context.expressionIntermediateLayerMap.put(
+          timestampOperand,
+          context.memoryAssigner.getReference(timestampOperand) == 1
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  timestampOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  timestampOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader));
+    }
+
+    return context.expressionIntermediateLayerMap.get(timestampOperand);
+  }
+
+  @Override
+  public IntermediateLayer visitTimeSeriesOperand(
+      TimeSeriesOperand timeSeriesOperand, OldIntermediateLayerVisitorContext 
context) {
+    if 
(!context.expressionIntermediateLayerMap.containsKey(timeSeriesOperand)) {
+      float memoryBudgetInMB = context.memoryAssigner.assign();
+
+      LayerPointReader parentLayerPointReader =
+          context.rawTimeSeriesInputLayer.constructValuePointReader(
+              timeSeriesOperand.getInputColumnIndex());
+
+      context.expressionDataTypeMap.put(timeSeriesOperand, 
parentLayerPointReader.getDataType());
+      context.expressionIntermediateLayerMap.put(
+          timeSeriesOperand,
+          context.memoryAssigner.getReference(timeSeriesOperand) == 1
+              ? new SingleInputColumnSingleReferenceIntermediateLayer(
+                  timeSeriesOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader)
+              : new SingleInputColumnMultiReferenceIntermediateLayer(
+                  timeSeriesOperand, context.queryId, memoryBudgetInMB, 
parentLayerPointReader));
+    }
+
+    return context.expressionIntermediateLayerMap.get(timeSeriesOperand);
+  }
+
+  @Override
+  public IntermediateLayer visitConstantOperand(
+      ConstantOperand constantOperand, OldIntermediateLayerVisitorContext 
context) {
+    if (!context.expressionIntermediateLayerMap.containsKey(constantOperand)) {
+      try {
+        context.expressionDataTypeMap.put(constantOperand, 
constantOperand.getDataType());
+        IntermediateLayer intermediateLayer =
+            new ConstantIntermediateLayer(
+                constantOperand, context.queryId, 
context.memoryAssigner.assign());
+        context.expressionIntermediateLayerMap.put(constantOperand, 
intermediateLayer);
+      } catch (QueryProcessException e) {
+        throw new RuntimeException(e);
+      }
+    }
+
+    return context.expressionIntermediateLayerMap.get(constantOperand);
+  }
+
+  private Transformer getConcreteUnaryTransformer(
+      Expression expression, LayerPointReader pointReader) {
+    switch (expression.getExpressionType()) {
+      case IN:
+        InExpression inExpression = (InExpression) expression;
+        return new InTransformer(pointReader, inExpression.isNotIn(), 
inExpression.getValues());
+      case IS_NULL:
+        IsNullExpression isNullExpression = (IsNullExpression) expression;
+        return new IsNullTransformer(pointReader, isNullExpression.isNot());
+      case LOGIC_NOT:
+        return new LogicNotTransformer(pointReader);
+      case NEGATION:
+        return new ArithmeticNegationTransformer(pointReader);
+      case LIKE:
+        LikeExpression likeExpression = (LikeExpression) expression;
+        return new RegularTransformer(pointReader, 
likeExpression.getPattern());
+      case REGEXP:
+        RegularExpression regularExpression = (RegularExpression) expression;
+        return new RegularTransformer(pointReader, 
regularExpression.getPattern());
+      default:
+        throw new UnsupportedOperationException(
+            "Unsupported Expression Type: " + expression.getExpressionType());
+    }
+  }
+
+  private Transformer getConcreteBinaryTransformer(
+      Expression expression,
+      LayerPointReader leftParentLayerPointReader,
+      LayerPointReader rightParentLayerPointReader) {
+    switch (expression.getExpressionType()) {
+      case ADDITION:
+        return new ArithmeticAdditionTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case SUBTRACTION:
+        return new ArithmeticSubtractionTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case MULTIPLICATION:
+        return new ArithmeticMultiplicationTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case DIVISION:
+        return new ArithmeticDivisionTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case MODULO:
+        return new ArithmeticModuloTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case EQUAL_TO:
+        return new CompareEqualToTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case NON_EQUAL:
+        return new CompareNonEqualTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case GREATER_THAN:
+        return new CompareGreaterThanTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case GREATER_EQUAL:
+        return new CompareGreaterEqualTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case LESS_THAN:
+        return new CompareLessThanTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case LESS_EQUAL:
+        return new CompareLessEqualTransformer(
+            leftParentLayerPointReader, rightParentLayerPointReader);
+      case LOGIC_AND:
+        return new LogicAndTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
+      case LOGIC_OR:
+        return new LogicOrTransformer(leftParentLayerPointReader, 
rightParentLayerPointReader);
+      default:
+        throw new UnsupportedOperationException(
+            "Unsupported Expression Type: " + expression.getExpressionType());
+    }
+  }
+
+  private Transformer getConcreteTernaryTransformer(
+      Expression expression,
+      LayerPointReader firstParentLayerPointReader,
+      LayerPointReader secondParentLayerPointReader,
+      LayerPointReader thirdParentLayerPointReader) {
+    switch (expression.getExpressionType()) {
+      case BETWEEN:
+        BetweenExpression betweenExpression = (BetweenExpression) expression;
+        return new BetweenTransformer(
+            firstParentLayerPointReader,
+            secondParentLayerPointReader,
+            thirdParentLayerPointReader,
+            betweenExpression.isNotBetween());
+      default:
+        throw new UnsupportedOperationException(
+            "Unsupported Expression Type: " + expression.getExpressionType());
+    }
+  }
+
+  private UDFQueryTransformer getUdfTransformer(
+      FunctionExpression functionExpression,
+      OldIntermediateLayerVisitorContext context,
+      IntermediateLayer udfInputIntermediateLayer)
+      throws QueryProcessException, IOException {
+    UDTFExecutor executor = 
context.udtfContext.getExecutorByFunctionExpression(functionExpression);
+    List<Expression> expressions = functionExpression.getExpressions();
+
+    executor.beforeStart(
+        context.queryId,
+        context.memoryAssigner.assign(),
+        
expressions.stream().map(Expression::toString).collect(Collectors.toList()),
+        
expressions.stream().map(context.expressionDataTypeMap::get).collect(Collectors.toList()),
+        functionExpression.getFunctionAttributes());
+
+    AccessStrategy accessStrategy = 
executor.getConfigurations().getAccessStrategy();
+    switch (accessStrategy.getAccessStrategyType()) {
+      case MAPPABLE_ROW_BY_ROW:
+        return new MappableUDFQueryRowTransformer(
+            udfInputIntermediateLayer.constructRowReader(), executor);
+      case ROW_BY_ROW:
+        return new 
UDFQueryRowTransformer(udfInputIntermediateLayer.constructRowReader(), 
executor);
+      case SLIDING_SIZE_WINDOW:
+      case SLIDING_TIME_WINDOW:
+        return new UDFQueryRowWindowTransformer(
+            udfInputIntermediateLayer.constructRowWindowReader(
+                accessStrategy, context.memoryAssigner.assign()),
+            executor);
+      default:
+        throw new UnsupportedOperationException("Unsupported transformer 
access strategy");
+    }
+  }
+
+  private IntermediateLayer constructUdfInputIntermediateLayer(
+      FunctionExpression functionExpression, 
OldIntermediateLayerVisitorContext context)
+      throws QueryProcessException, IOException {
+    List<IntermediateLayer> intermediateLayers = new ArrayList<>();
+    for (Expression expression : functionExpression.getExpressions()) {
+      intermediateLayers.add(this.process(expression, context));
+    }
+    return intermediateLayers.size() == 1
+        ? intermediateLayers.get(0)
+        : new MultiInputColumnIntermediateLayer(
+            functionExpression,
+            context.queryId,
+            context.memoryAssigner.assign(),
+            intermediateLayers.stream()
+                .map(IntermediateLayer::constructPointReader)
+                .collect(Collectors.toList()));
+  }
+
+  public static class OldIntermediateLayerVisitorContext {
+    long queryId;
+
+    UDTFContext udtfContext;
+
+    QueryDataSetInputLayer rawTimeSeriesInputLayer;
+
+    Map<Expression, IntermediateLayer> expressionIntermediateLayerMap;
+
+    Map<Expression, TSDataType> expressionDataTypeMap;
+
+    LayerMemoryAssigner memoryAssigner;
+
+    public OldIntermediateLayerVisitorContext(
+        long queryId,
+        UDTFContext udtfContext,
+        QueryDataSetInputLayer rawTimeSeriesInputLayer,
+        Map<Expression, IntermediateLayer> expressionIntermediateLayerMap,
+        Map<Expression, TSDataType> expressionDataTypeMap,
+        LayerMemoryAssigner memoryAssigner) {
+      this.queryId = queryId;
+      this.udtfContext = udtfContext;
+      this.rawTimeSeriesInputLayer = rawTimeSeriesInputLayer;
+      this.expressionIntermediateLayerMap = expressionIntermediateLayerMap;
+      this.expressionDataTypeMap = expressionDataTypeMap;
+      this.memoryAssigner = memoryAssigner;
+    }
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/DAGBuilder.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/DAGBuilder.java
index abe194bf2a..518e147183 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/DAGBuilder.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/DAGBuilder.java
@@ -19,9 +19,9 @@
 
 package org.apache.iotdb.db.mpp.transformation.dag.builder;
 
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ResultColumn;
+import 
org.apache.iotdb.db.mpp.plan.expression.visitor.OldIntermediateLayerVisitor;
 import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
 import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
 import 
org.apache.iotdb.db.mpp.transformation.dag.intermediate.IntermediateLayer;
@@ -29,7 +29,6 @@ import 
org.apache.iotdb.db.mpp.transformation.dag.memory.LayerMemoryAssigner;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -87,18 +86,19 @@ public class DAGBuilder {
     return this;
   }
 
-  public DAGBuilder buildResultColumnPointReaders() throws 
QueryProcessException, IOException {
+  public DAGBuilder buildResultColumnPointReaders() {
+    OldIntermediateLayerVisitor visitor = new OldIntermediateLayerVisitor();
+    OldIntermediateLayerVisitor.OldIntermediateLayerVisitorContext context =
+        new OldIntermediateLayerVisitor.OldIntermediateLayerVisitorContext(
+            queryId,
+            udtfPlan.getUdtfContext(),
+            rawTimeSeriesInputLayer,
+            expressionIntermediateLayerMap,
+            expressionDataTypeMap,
+            memoryAssigner);
     for (int i = 0; i < resultColumnExpressions.length; ++i) {
       resultColumnPointReaders[i] =
-          resultColumnExpressions[i]
-              .constructIntermediateLayer(
-                  queryId,
-                  udtfPlan.getUdtfContext(),
-                  rawTimeSeriesInputLayer,
-                  expressionIntermediateLayerMap,
-                  expressionDataTypeMap,
-                  memoryAssigner)
-              .constructPointReader();
+          visitor.process(resultColumnExpressions[i], 
context).constructPointReader();
     }
     return this;
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/EvaluationDAGBuilder.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/EvaluationDAGBuilder.java
index 7a7a76bf5a..1dfffd74b9 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/EvaluationDAGBuilder.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/transformation/dag/builder/EvaluationDAGBuilder.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.mpp.transformation.dag.builder;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
+import 
org.apache.iotdb.db.mpp.plan.expression.visitor.IntermediateLayerVisitor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;
 import org.apache.iotdb.db.mpp.transformation.api.LayerPointReader;
 import org.apache.iotdb.db.mpp.transformation.dag.input.QueryDataSetInputLayer;
@@ -95,17 +96,17 @@ public class EvaluationDAGBuilder {
 
   public EvaluationDAGBuilder buildResultColumnPointReaders()
       throws QueryProcessException, IOException {
+    IntermediateLayerVisitor visitor = new IntermediateLayerVisitor();
+    IntermediateLayerVisitor.IntermediateLayerVisitorContext context =
+        new IntermediateLayerVisitor.IntermediateLayerVisitorContext(
+            queryId,
+            udtfContext,
+            inputLayer,
+            expressionIntermediateLayerMap,
+            typeProvider,
+            memoryAssigner);
     for (int i = 0; i < outputExpressions.length; ++i) {
-      outputPointReaders[i] =
-          outputExpressions[i]
-              .constructIntermediateLayer(
-                  queryId,
-                  udtfContext,
-                  inputLayer,
-                  expressionIntermediateLayerMap,
-                  typeProvider,
-                  memoryAssigner)
-              .constructPointReader();
+      outputPointReaders[i] = visitor.process(outputExpressions[i], 
context).constructPointReader();
     }
     return this;
   }

Reply via email to