refactor useLogicalView
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
index 42e25cc..58b33df 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
@@ -236,7 +236,8 @@
   // Logical View Analysis
   /////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private boolean hasViewsInQuery = false;
+  private boolean useLogicalView = false;
+
   private List<Pair<Expression, String>> outputExpressions = null;
 
   /////////////////////////////////////////////////////////////////////////////////////////////////
@@ -691,12 +692,12 @@
   // Logical View Analysis
   /////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setHasViewsInQuery(boolean hasViewsInQuery) {
-    this.hasViewsInQuery = this.hasViewsInQuery || hasViewsInQuery;
+  public void setUseLogicalView(boolean useLogicalView) {
+    this.useLogicalView = useLogicalView;
   }
 
-  public boolean hasViewsInQuery() {
-    return this.hasViewsInQuery;
+  public boolean useLogicalView() {
+    return this.useLogicalView;
   }
 
   public void setOutputExpressions(List<Pair<Expression, String>> outputExpressions) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index d720f04..ec31b5d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -267,7 +267,7 @@
       }
 
       // make sure paths in logical view is fetched
-      updateSchemaTreeByViews(schemaTree);
+      updateSchemaTreeByViews(analysis, schemaTree);
 
       // extract global time filter from query filter and determine if there is a value filter
       analyzeGlobalTimeFilter(analysis, queryStatement);
@@ -446,23 +446,25 @@
 
     for (Expression selectExpression : selectExpressions) {
       sourceExpressions.addAll(
-          ExpressionAnalyzer.bindSchemaForExpression(selectExpression, analysis, schemaTree));
+          ExpressionAnalyzer.bindSchemaForExpression(selectExpression, schemaTree));
     }
     analysis.setSourceExpressions(sourceExpressions);
   }
 
-  private void updateSchemaTreeByViews(ISchemaTree originSchemaTree) {
+  private void updateSchemaTreeByViews(Analysis analysis, ISchemaTree originSchemaTree) {
     if (!originSchemaTree.hasLogicalViewMeasurement()) {
       return;
     }
 
     PathPatternTree patternTree = new PathPatternTree();
     boolean needToReFetch = false;
+    boolean useLogicalView = false;
     try {
       Pair<List<MeasurementPath>, Integer> tempPair =
           originSchemaTree.searchMeasurementPaths(new PartialPath("root.**"));
       for (MeasurementPath measurementPath : tempPair.left) {
         if (measurementPath.getMeasurementSchema().isLogicalView()) {
+          useLogicalView = true;
           LogicalViewSchema logicalViewSchema =
               (LogicalViewSchema) measurementPath.getMeasurementSchema();
           ViewExpression viewExpression = logicalViewSchema.getExpression();
@@ -483,6 +485,7 @@
       allDatabases.addAll(originSchemaTree.getDatabases());
       originSchemaTree.setDatabases(allDatabases);
     }
+    analysis.setUseLogicalView(useLogicalView);
   }
 
   private Map<Integer, List<Pair<Expression, String>>> analyzeSelect(
@@ -505,8 +508,7 @@
 
       boolean hasAlias = resultColumn.hasAlias();
       List<Expression> resultExpressions =
-          ExpressionAnalyzer.bindSchemaForExpression(
-              resultColumn.getExpression(), analysis, schemaTree);
+          ExpressionAnalyzer.bindSchemaForExpression(resultColumn.getExpression(), schemaTree);
 
       for (Expression expression : resultExpressions) {
         if (paginationController.hasCurOffset()) {
@@ -1298,7 +1300,7 @@
     for (Expression expressionForItem : queryStatement.getExpressionSortItemList()) {
       // Expression in a sortItem only indicates one column
       List<Expression> expressions =
-          ExpressionAnalyzer.bindSchemaForExpression(expressionForItem, analysis, schemaTree);
+          ExpressionAnalyzer.bindSchemaForExpression(expressionForItem, schemaTree);
       if (expressions.size() != 1) {
         throw new SemanticException("One sort item in order by should only indicate one value");
       }
@@ -1454,7 +1456,7 @@
       groupByExpression = groupByComponent.getControlColumnExpression();
       // Expression in group by variation clause only indicates one column
       List<Expression> expressions =
-          ExpressionAnalyzer.bindSchemaForExpression(groupByExpression, analysis, schemaTree);
+          ExpressionAnalyzer.bindSchemaForExpression(groupByExpression, schemaTree);
       if (expressions.size() != 1) {
         throw new SemanticException("Expression in group by should indicate one value");
       }
@@ -3214,7 +3216,7 @@
               "Columns in the query statement is empty. Please check your SQL."));
       return new Pair<>(null, analysis);
     }
-    if (queryAnalysis.hasViewsInQuery()) {
+    if (queryAnalysis.useLogicalView()) {
       analysis.setFinishQueryAfterAnalyze(true);
       analysis.setFailStatus(
           RpcUtils.getStatus(
@@ -3229,7 +3231,7 @@
     return new Pair<>(expressionList, analysis);
   }
 
-  private Analysis checkViewsInSource(
+  private void checkViewsInSource(
       Analysis analysis, List<Expression> sourceExpressionList, MPPQueryContext context) {
     List<PartialPath> pathsNeedCheck = new ArrayList<>();
     for (Expression expression : sourceExpressionList) {
@@ -3246,7 +3248,7 @@
           RpcUtils.getStatus(
               TSStatusCode.UNSUPPORTED_OPERATION.getStatusCode(),
               "Can not create a logical view based on non-exist time series."));
-      return analysis;
+      return;
     }
     Pair<List<PartialPath>, PartialPath> viewInSourceCheckResult =
         findAllViewsInPaths(pathsNeedCheck, schemaOfNeedToCheck.left);
@@ -3259,7 +3261,7 @@
               "Path "
                   + viewInSourceCheckResult.right.toString()
                   + " does not exist! You can not create a logical view based on non-exist time series."));
-      return analysis;
+      return;
     }
     if (viewInSourceCheckResult.left.size() > 0) {
       // some source paths is logical view
@@ -3268,9 +3270,7 @@
           RpcUtils.getStatus(
               TSStatusCode.UNSUPPORTED_OPERATION.getStatusCode(),
               "Can not create a logical view based on existing views."));
-      return analysis;
     }
-    return analysis;
   }
 
   private Analysis checkPathsInCreateLogicalView(
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
index 06025ab..f283eb7 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
@@ -411,14 +411,8 @@
    *     expressions
    */
   public static List<Expression> bindSchemaForExpression(
-      Expression expression, Analysis analysis, ISchemaTree schemaTree) {
-    BindSchemaForExpressionVisitor bindSchemaForExpressionVisitor =
-        new BindSchemaForExpressionVisitor();
-    BindSchemaForExpressionVisitor.Context context =
-        new BindSchemaForExpressionVisitor.Context(schemaTree);
-    List<Expression> expressions = bindSchemaForExpressionVisitor.process(expression, context);
-    analysis.setHasViewsInQuery(context.isHasProcessedLogicalView());
-    return expressions;
+      Expression expression, ISchemaTree schemaTree) {
+    return new BindSchemaForExpressionVisitor().process(expression, schemaTree);
   }
 
   /**
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/cartesian/BindSchemaForExpressionVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/cartesian/BindSchemaForExpressionVisitor.java
index 19de729..5cce6f3 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/cartesian/BindSchemaForExpressionVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/cartesian/BindSchemaForExpressionVisitor.java
@@ -42,18 +42,17 @@
 import static org.apache.iotdb.db.mpp.plan.analyze.ExpressionUtils.reconstructFunctionExpressions;
 import static org.apache.iotdb.db.utils.TypeInferenceUtils.bindTypeForAggregationNonSeriesInputExpressions;
 
-public class BindSchemaForExpressionVisitor
-    extends CartesianProductVisitor<BindSchemaForExpressionVisitor.Context> {
+public class BindSchemaForExpressionVisitor extends CartesianProductVisitor<ISchemaTree> {
 
   @Override
   public List<Expression> visitFunctionExpression(
-      FunctionExpression functionExpression, Context context) {
+      FunctionExpression functionExpression, ISchemaTree schemaTree) {
     // One by one, remove the wildcards from the input expressions. In most cases, an expression
     // will produce multiple expressions after removing the wildcards. We use extendedExpressions
     // to collect the produced expressions.
     List<List<Expression>> extendedExpressions = new ArrayList<>();
     for (Expression originExpression : functionExpression.getExpressions()) {
-      List<Expression> actualExpressions = process(originExpression, context);
+      List<Expression> actualExpressions = process(originExpression, schemaTree);
       if (actualExpressions.isEmpty()) {
         // Let's ignore the eval of the function which has at least one non-existence series as
         // input. See IOTDB-1212: https://github.com/apache/iotdb/pull/3101
@@ -83,16 +82,15 @@
 
   @Override
   public List<Expression> visitTimeSeriesOperand(
-      TimeSeriesOperand timeSeriesOperand, Context context) {
+      TimeSeriesOperand timeSeriesOperand, ISchemaTree schemaTree) {
     PartialPath timeSeriesOperandPath = timeSeriesOperand.getPath();
     List<MeasurementPath> actualPaths =
-        context.getSchemaTree().searchMeasurementPaths(timeSeriesOperandPath).left;
+        schemaTree.searchMeasurementPaths(timeSeriesOperandPath).left;
     // process logical view
     List<MeasurementPath> nonViewActualPaths = new ArrayList<>();
     List<MeasurementPath> viewPaths = new ArrayList<>();
     for (MeasurementPath measurementPath : actualPaths) {
       if (measurementPath.getMeasurementSchema().isLogicalView()) {
-        context.setHasProcessedLogicalView();
         viewPaths.add(measurementPath);
       } else {
         nonViewActualPaths.add(measurementPath);
@@ -102,7 +100,7 @@
         ExpressionUtils.reconstructTimeSeriesOperands(nonViewActualPaths);
     // handle logical views
     for (MeasurementPath measurementPath : viewPaths) {
-      Expression replacedExpression = transformViewPath(measurementPath, context.getSchemaTree());
+      Expression replacedExpression = transformViewPath(measurementPath, schemaTree);
       replacedExpression.setViewPath(measurementPath);
       reconstructTimeSeriesOperands.add(replacedExpression);
     }
@@ -111,12 +109,13 @@
 
   @Override
   public List<Expression> visitTimeStampOperand(
-      TimestampOperand timestampOperand, Context context) {
+      TimestampOperand timestampOperand, ISchemaTree schemaTree) {
     return Collections.singletonList(timestampOperand);
   }
 
   @Override
-  public List<Expression> visitConstantOperand(ConstantOperand constantOperand, Context context) {
+  public List<Expression> visitConstantOperand(
+      ConstantOperand constantOperand, ISchemaTree schemaTree) {
     return Collections.singletonList(constantOperand);
   }
 
@@ -135,25 +134,4 @@
               "Can not construct expression using non view path in transformViewPath!"));
     }
   }
-
-  public static class Context {
-    private final ISchemaTree schemaTree;
-    private boolean isHasProcessedLogicalView = false;
-
-    public Context(ISchemaTree schemaTree) {
-      this.schemaTree = schemaTree;
-    }
-
-    public ISchemaTree getSchemaTree() {
-      return schemaTree;
-    }
-
-    public boolean isHasProcessedLogicalView() {
-      return isHasProcessedLogicalView;
-    }
-
-    public void setHasProcessedLogicalView() {
-      isHasProcessedLogicalView = true;
-    }
-  }
 }