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++) {