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 9a5b02a4336 Fix incorrect query result in GROUP BY LEVEL query with 
logical view
9a5b02a4336 is described below

commit 9a5b02a4336c790f91368c91d18bc07697569c5f
Author: liuminghui233 <[email protected]>
AuthorDate: Wed May 29 20:57:53 2024 +0800

    Fix incorrect query result in GROUP BY LEVEL query with logical view
---
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |  6 ++++++
 .../plan/analyze/ExpressionAnalyzer.java           |  6 +++++-
 .../plan/analyze/GroupByLevelHelper.java           |  3 ++-
 .../visitor/ExpressionNormalizeVisitor.java        | 17 +++++++++++++--
 .../plan/planner/distribution/SourceRewriter.java  | 25 ++++++++++++++++------
 .../plan/parameter/AggregationDescriptor.java      |  2 +-
 .../CrossSeriesAggregationDescriptor.java          |  4 ++++
 7 files changed, 52 insertions(+), 11 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index 90908302cf1..d68d00bb946 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -1152,6 +1152,12 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       Set<Expression> aggregationExpressions =
           analysis.getCrossGroupByExpressions().values().stream()
               .flatMap(Set::stream)
+              .map(
+                  expression -> {
+                    Expression normalizedExpression = 
normalizeExpression(expression);
+                    analyzeExpressionType(analysis, normalizedExpression);
+                    return normalizedExpression;
+                  })
               .collect(Collectors.toSet());
       analysis.setAggregationExpressions(aggregationExpressions);
       return;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionAnalyzer.java
index ebc52a86a62..fa29e4a20f8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/ExpressionAnalyzer.java
@@ -520,7 +520,11 @@ public class ExpressionAnalyzer {
    * @return normalized expression
    */
   public static Expression normalizeExpression(Expression expression) {
-    return new ExpressionNormalizeVisitor().process(expression, null);
+    return new ExpressionNormalizeVisitor(true).process(expression, null);
+  }
+
+  public static Expression normalizeExpression(Expression expression, boolean 
removeViewPath) {
+    return new ExpressionNormalizeVisitor(removeViewPath).process(expression, 
null);
   }
 
   /**
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/GroupByLevelHelper.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/GroupByLevelHelper.java
index 5f21cd65885..a220fdf2883 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/GroupByLevelHelper.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/GroupByLevelHelper.java
@@ -104,7 +104,8 @@ public class GroupByLevelHelper {
       groupedOutputAggregationExpression = 
normalizeExpression(groupedOutputAggregationExpression);
       analyzeExpressionType(analysis, groupedOutputAggregationExpression);
 
-      rawAggregationExpression = 
ExpressionAnalyzer.normalizeExpression(rawAggregationExpression);
+      rawAggregationExpression =
+          ExpressionAnalyzer.normalizeExpression(rawAggregationExpression, 
false);
       analyzeExpressionType(analysis, rawAggregationExpression);
 
       groupedAggregationExpressionToRawExpressionsMap
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
index ac882bdda68..642b3a3b617 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/expression/visitor/ExpressionNormalizeVisitor.java
@@ -31,10 +31,19 @@ import static 
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionUtils.recon
 
 public class ExpressionNormalizeVisitor extends ReconstructVisitor<Void> {
 
+  private final boolean removeViewPath;
+
+  public ExpressionNormalizeVisitor(boolean removeViewPath) {
+    super();
+    this.removeViewPath = removeViewPath;
+  }
+
   @Override
   public Expression process(Expression expression, Void context) {
     Expression resultExpression = expression.accept(this, context);
-    resultExpression.setViewPath(null);
+    if (removeViewPath) {
+      resultExpression.setViewPath(null);
+    }
     return resultExpression;
   }
 
@@ -52,6 +61,10 @@ public class ExpressionNormalizeVisitor extends 
ReconstructVisitor<Void> {
     if (newPath.isMeasurementAliasExists()) {
       ((MeasurementPath) newPath).removeMeasurementAlias();
     }
-    return new TimeSeriesOperand(newPath);
+    TimeSeriesOperand newOperand = new TimeSeriesOperand(newPath);
+    if (timeSeriesOperand.isViewExpression()) {
+      newOperand.setViewPath(timeSeriesOperand.getViewPath());
+    }
+    return newOperand;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
index cae6acfaf63..50d346add67 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SourceRewriter.java
@@ -1565,12 +1565,25 @@ public class SourceRewriter extends 
BaseSourceRewriter<DistributionPlanContext>
           
descriptorExpressions.addAll(originalDescriptor.getOutputExpressions());
         }
 
-        for (String groupedInputExpressionString :
-            originalDescriptor.getGroupedInputExpressionStrings()) {
-          List<Expression> inputExpressions =
-              childrenExpressionMap.get(groupedInputExpressionString);
-          if (inputExpressions != null && !inputExpressions.isEmpty()) {
-            descriptorExpressions.addAll(inputExpressions);
+        if (analysis.useLogicalView()) {
+          for (List<Expression> groupedInputExpressions :
+              originalDescriptor.getGroupedInputExpressions()) {
+            String groupedInputExpressionsString =
+                originalDescriptor.getInputString(groupedInputExpressions);
+            List<Expression> inputExpressions =
+                childrenExpressionMap.get(groupedInputExpressionsString);
+            if (inputExpressions != null && !inputExpressions.isEmpty()) {
+              descriptorExpressions.addAll(groupedInputExpressions);
+            }
+          }
+        } else {
+          for (String groupedInputExpressionString :
+              originalDescriptor.getGroupedInputExpressionStrings()) {
+            List<Expression> inputExpressions =
+                childrenExpressionMap.get(groupedInputExpressionString);
+            if (inputExpressions != null && !inputExpressions.isEmpty()) {
+              descriptorExpressions.addAll(inputExpressions);
+            }
           }
         }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/AggregationDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/AggregationDescriptor.java
index c7758007d36..00eabcbeee5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/AggregationDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/AggregationDescriptor.java
@@ -263,7 +263,7 @@ public class AggregationDescriptor {
     return Collections.singletonList(getInputString(inputExpressions));
   }
 
-  protected String getInputString(List<Expression> expressions) {
+  public String getInputString(List<Expression> expressions) {
     StringBuilder builder = new StringBuilder();
     if (!(expressions.isEmpty())) {
       builder.append(expressions.get(0).getExpressionString());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/CrossSeriesAggregationDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/CrossSeriesAggregationDescriptor.java
index bc50d59d334..d986baf2faa 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/CrossSeriesAggregationDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/CrossSeriesAggregationDescriptor.java
@@ -168,6 +168,10 @@ public class CrossSeriesAggregationDescriptor extends 
AggregationDescriptor {
     return 
groupedInputExpressions.stream().map(this::getInputString).collect(Collectors.toList());
   }
 
+  public List<List<Expression>> getGroupedInputExpressions() {
+    return groupedInputExpressions;
+  }
+
   public StringBuilder getOutputExpressionsAsBuilder() {
     StringBuilder builder = new 
StringBuilder(outputExpressions.get(0).getExpressionString());
     for (int i = 1; i < outputExpressions.size(); i++) {

Reply via email to