This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/ABDwithView in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 7da3b7a6e5c4894904fc5b250d429c8d9618f323 Author: Minghui Liu <[email protected]> AuthorDate: Tue Jun 27 14:23:52 2023 +0800 fix timeseries alias --- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 32 ++++++++++++---------- .../db/mpp/plan/analyze/ExpressionAnalyzer.java | 11 ++++++-- ...isitor.java => ExpressionNormalizeVisitor.java} | 2 +- ...or.java => ExpressionSemiNormalizeVisitor.java} | 22 +-------------- .../visitor/GetMeasurementExpressionVisitor.java | 17 ++++++------ .../plan/statement/component/GroupByComponent.java | 4 ++- .../plan/statement/component/HavingCondition.java | 4 +-- .../plan/statement/component/OrderByComponent.java | 4 ++- .../plan/statement/component/WhereCondition.java | 4 +-- 9 files changed, 46 insertions(+), 54 deletions(-) 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 a980b0a4f52..0341ee2a4de 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 @@ -525,8 +525,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> .getGroupByLevelComponent() .updateIsCountStar(resultColumn.getExpression()); } else { - Expression expressionWithoutAlias = - ExpressionAnalyzer.removeAliasFromExpression(expression); + Expression expressionWithoutAlias = ExpressionAnalyzer.normalizeExpression(expression); if (hasAlias) { String alias = resultColumn.getAlias(); if (aliasSet.contains(alias)) { @@ -599,7 +598,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> ExpressionAnalyzer.getMeasurementExpression(expression, analysis); measurementToDeviceSelectExpressions .computeIfAbsent(measurementExpression, key -> new LinkedHashMap<>()) - .put(device.getFullPath(), expression); + .put(device.getFullPath(), ExpressionAnalyzer.semiNormalizeExpression(expression)); } } @@ -631,7 +630,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> // add outputExpressions Expression measurementExpressionWithoutAlias = - ExpressionAnalyzer.removeAliasFromExpression(measurementExpression); + ExpressionAnalyzer.semiNormalizeExpression(measurementExpression); String outputColumnName = hasAlias ? resultColumn.getAlias() : measurementExpression.getOutputSymbol(); analyzeExpression(analysis, measurementExpressionWithoutAlias); @@ -642,10 +641,13 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> deviceToSelectExpressionsOfOneMeasurement.entrySet()) { String deviceName = deviceNameSelectExpressionEntry.getKey(); Expression expression = deviceNameSelectExpressionEntry.getValue(); - analyzeExpression(analysis, expression); + + Expression expressionWithoutAlias = + ExpressionAnalyzer.semiNormalizeExpression(expression); + analyzeExpression(analysis, expressionWithoutAlias); deviceToSelectExpressions .computeIfAbsent(deviceName, key -> new LinkedHashSet<>()) - .add(expression); + .add(expressionWithoutAlias); } paginationController.consumeLimit(); } else { @@ -677,7 +679,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> Expression havingExpression = ExpressionUtils.constructQueryFilter( conJunctions.stream().distinct().collect(Collectors.toList())); - havingExpression = ExpressionAnalyzer.removeAliasFromExpression(havingExpression); + havingExpression = ExpressionAnalyzer.normalizeExpression(havingExpression); TSDataType outputType = analyzeExpression(analysis, havingExpression); if (outputType != TSDataType.BOOLEAN) { throw new SemanticException( @@ -835,10 +837,10 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> ExpressionAnalyzer.searchAggregationExpressions(expression)) { Set<Expression> groupedExpressionSet = groupedExpressionToRawExpressionsMap.get(groupedAggregationExpression).stream() - .map(ExpressionAnalyzer::removeAliasFromExpression) + .map(ExpressionAnalyzer::normalizeExpression) .collect(Collectors.toSet()); Expression groupedAggregationExpressionWithoutAlias = - ExpressionAnalyzer.removeAliasFromExpression(groupedAggregationExpression); + ExpressionAnalyzer.normalizeExpression(groupedAggregationExpression); analyzeExpression(analysis, groupedAggregationExpressionWithoutAlias); groupedExpressionSet.forEach( @@ -852,7 +854,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> private Pair<Expression, String> removeAliasFromExpression( Expression rawExpression, String rawAlias) { - Expression expressionWithoutAlias = ExpressionAnalyzer.removeAliasFromExpression(rawExpression); + Expression expressionWithoutAlias = ExpressionAnalyzer.normalizeExpression(rawExpression); String alias = !Objects.equals(expressionWithoutAlias, rawExpression) ? rawExpression.getExpressionString() @@ -1089,7 +1091,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> Set<String> queriedDevices = new HashSet<>(); for (Expression expression : sourceExpressionsUnderDevice) { queriedDevices.add(ExpressionAnalyzer.getDeviceNameInSourceExpression(expression)); - actualSourceExpressions.add(ExpressionAnalyzer.removeAliasFromExpression(expression)); + actualSourceExpressions.add(ExpressionAnalyzer.normalizeExpression(expression)); } if (queriedDevices.size() > 1) { throw new SemanticException( @@ -1097,7 +1099,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } if (actualSourceExpressions.size() < sourceExpressionsUnderDevice.size()) { throw new SemanticException( - "Views representing the same data source cannot be queried concurrently in ALIGN BY DEVICE queries."); + "Views or measurement aliases representing the same data source cannot be queried concurrently in ALIGN BY DEVICE queries."); } outputDeviceToQueriedDevicesMap.put(deviceName, new ArrayList<>(queriedDevices)); } @@ -1170,7 +1172,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> Expression whereExpression = ExpressionUtils.constructQueryFilter( conJunctions.stream().distinct().collect(Collectors.toList())); - whereExpression = ExpressionAnalyzer.removeAliasFromExpression(whereExpression); + whereExpression = ExpressionAnalyzer.normalizeExpression(whereExpression); TSDataType outputType = analyzeExpression(analysis, whereExpression); if (outputType != TSDataType.BOOLEAN) { throw new SemanticException(String.format(WHERE_WRONG_TYPE_ERROR_MSG, outputType)); @@ -1362,7 +1364,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> "%s in order by clause shouldn't refer to more than one timeseries.", expressionForItem.getExpressionString())); } - expressionForItem = ExpressionAnalyzer.removeAliasFromExpression(expressions.get(0)); + expressionForItem = ExpressionAnalyzer.normalizeExpression(expressions.get(0)); TSDataType dataType = analyzeExpression(analysis, expressionForItem); if (!dataType.isComparable()) { throw new SemanticException( @@ -1547,7 +1549,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> if (aggregationExpression != null && !aggregationExpression.isEmpty()) { throw new SemanticException("Aggregation expression shouldn't exist in group by clause"); } - groupByExpression = ExpressionAnalyzer.removeAliasFromExpression(expressions.get(0)); + groupByExpression = ExpressionAnalyzer.normalizeExpression(expressions.get(0)); } if (windowType == WindowType.VARIATION_WINDOW) { 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 afcfc133ba9..95ab38643e4 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 @@ -47,8 +47,9 @@ import org.apache.iotdb.db.mpp.plan.expression.unary.UnaryExpression; import org.apache.iotdb.db.mpp.plan.expression.visitor.BindTypeForTimeSeriesOperandVisitor; import org.apache.iotdb.db.mpp.plan.expression.visitor.CollectAggregationExpressionsVisitor; import org.apache.iotdb.db.mpp.plan.expression.visitor.CollectSourceExpressionsVisitor; +import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionNormalizeVisitor; +import org.apache.iotdb.db.mpp.plan.expression.visitor.ExpressionSemiNormalizeVisitor; import org.apache.iotdb.db.mpp.plan.expression.visitor.GetMeasurementExpressionVisitor; -import org.apache.iotdb.db.mpp.plan.expression.visitor.RemoveAliasFromExpressionVisitor; import org.apache.iotdb.db.mpp.plan.expression.visitor.ReplaceRawPathWithGroupedPathVisitor; import org.apache.iotdb.db.mpp.plan.expression.visitor.cartesian.BindSchemaForExpressionVisitor; import org.apache.iotdb.db.mpp.plan.expression.visitor.cartesian.BindSchemaForPredicateVisitor; @@ -666,8 +667,12 @@ public class ExpressionAnalyzer { * * @return expression after removing alias */ - public static Expression removeAliasFromExpression(Expression expression) { - return new RemoveAliasFromExpressionVisitor().process(expression, null); + public static Expression normalizeExpression(Expression expression) { + return new ExpressionNormalizeVisitor().process(expression, null); + } + + public static Expression semiNormalizeExpression(Expression expression) { + return new ExpressionSemiNormalizeVisitor().process(expression, null); } /** Check for arithmetic expression, logical expression, UDF. Returns true if it exists. */ diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/RemoveAliasFromExpressionVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ExpressionNormalizeVisitor.java similarity index 96% copy from server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/RemoveAliasFromExpressionVisitor.java copy to server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ExpressionNormalizeVisitor.java index 94cdecf6f31..d1a533429b6 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/RemoveAliasFromExpressionVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ExpressionNormalizeVisitor.java @@ -28,7 +28,7 @@ import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression; import java.util.ArrayList; import java.util.List; -public class RemoveAliasFromExpressionVisitor extends ReconstructVisitor<Void> { +public class ExpressionNormalizeVisitor extends ReconstructVisitor<Void> { @Override public Expression process(Expression expression, Void context) { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/RemoveAliasFromExpressionVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ExpressionSemiNormalizeVisitor.java similarity index 63% rename from server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/RemoveAliasFromExpressionVisitor.java rename to server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ExpressionSemiNormalizeVisitor.java index 94cdecf6f31..274c6c31865 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/RemoveAliasFromExpressionVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/ExpressionSemiNormalizeVisitor.java @@ -19,23 +19,13 @@ package org.apache.iotdb.db.mpp.plan.expression.visitor; -import org.apache.iotdb.commons.path.MeasurementPath; -import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.db.mpp.plan.expression.Expression; -import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand; import org.apache.iotdb.db.mpp.plan.expression.multi.FunctionExpression; import java.util.ArrayList; import java.util.List; -public class RemoveAliasFromExpressionVisitor extends ReconstructVisitor<Void> { - - @Override - public Expression process(Expression expression, Void context) { - Expression resultExpression = expression.accept(this, context); - resultExpression.setViewPath(null); - return resultExpression; - } +public class ExpressionSemiNormalizeVisitor extends ReconstructVisitor<Void> { @Override public Expression visitFunctionExpression(FunctionExpression functionExpression, Void context) { @@ -46,14 +36,4 @@ public class RemoveAliasFromExpressionVisitor extends ReconstructVisitor<Void> { functionExpression.getFunctionAttributes(), childResult); } - - @Override - public Expression visitTimeSeriesOperand(TimeSeriesOperand timeSeriesOperand, Void context) { - PartialPath rawPath = timeSeriesOperand.getPath(); - PartialPath newPath = rawPath.copy(); - if (newPath.isMeasurementAliasExists()) { - ((MeasurementPath) newPath).removeMeasurementAlias(); - } - return new TimeSeriesOperand(newPath); - } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/GetMeasurementExpressionVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/GetMeasurementExpressionVisitor.java index ade126ffe8f..57676198504 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/GetMeasurementExpressionVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/visitor/GetMeasurementExpressionVisitor.java @@ -60,13 +60,14 @@ public class GetMeasurementExpressionVisitor extends ReconstructVisitor<Analysis @Override public Expression visitTimeSeriesOperand(TimeSeriesOperand timeSeriesOperand, Analysis analysis) { MeasurementPath rawPath = (MeasurementPath) timeSeriesOperand.getPath(); - PartialPath measurement = new PartialPath(rawPath.getMeasurement(), false); - MeasurementPath measurementWithSchema = - new MeasurementPath(measurement, rawPath.getMeasurementSchema()); - if (rawPath.isMeasurementAliasExists()) { - measurementWithSchema.setMeasurementAlias(rawPath.getMeasurementAlias()); - } - measurementWithSchema.setTagMap(rawPath.getTagMap()); - return new TimeSeriesOperand(measurementWithSchema); + String measurementName = + rawPath.isMeasurementAliasExists() + ? rawPath.getMeasurementAlias() + : rawPath.getMeasurement(); + MeasurementPath measurementPath = + new MeasurementPath( + new PartialPath(measurementName, false), rawPath.getMeasurementSchema()); + measurementPath.setTagMap(rawPath.getTagMap()); + return new TimeSeriesOperand(measurementPath); } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/GroupByComponent.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/GroupByComponent.java index 2b3c96a9136..590fbad56a3 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/GroupByComponent.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/GroupByComponent.java @@ -20,6 +20,7 @@ package org.apache.iotdb.db.mpp.plan.statement.component; import org.apache.iotdb.db.mpp.execution.operator.window.WindowType; +import org.apache.iotdb.db.mpp.plan.analyze.ExpressionAnalyzer; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.statement.StatementNode; @@ -40,7 +41,8 @@ public abstract class GroupByComponent extends StatementNode { } public void setControlColumnExpression(Expression controlColumnExpression) { - this.controlColumnExpression = controlColumnExpression; + this.controlColumnExpression = + ExpressionAnalyzer.semiNormalizeExpression(controlColumnExpression); } public Expression getControlColumnExpression() { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/HavingCondition.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/HavingCondition.java index 6a7ab8912ee..5ce77865232 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/HavingCondition.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/HavingCondition.java @@ -32,7 +32,7 @@ public class HavingCondition extends StatementNode { public HavingCondition(Expression predicate) { // cast functionName to lowercase in havingExpression - this.predicate = ExpressionAnalyzer.removeAliasFromExpression(predicate); + this.predicate = ExpressionAnalyzer.semiNormalizeExpression(predicate); } public Expression getPredicate() { @@ -40,7 +40,7 @@ public class HavingCondition extends StatementNode { } public void setPredicate(Expression predicate) { - this.predicate = ExpressionAnalyzer.removeAliasFromExpression(predicate); + this.predicate = ExpressionAnalyzer.semiNormalizeExpression(predicate); } public String toSQLString() { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/OrderByComponent.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/OrderByComponent.java index 193b6cee205..8e16688d697 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/OrderByComponent.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/OrderByComponent.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.mpp.plan.statement.component; +import org.apache.iotdb.db.mpp.plan.analyze.ExpressionAnalyzer; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.statement.StatementNode; @@ -84,7 +85,8 @@ public class OrderByComponent extends StatementNode { public void addExpressionSortItem(SortItem sortItem) { this.sortItemList.add(sortItem); - this.sortItemExpressionList.add(sortItem.getExpression()); + this.sortItemExpressionList.add( + ExpressionAnalyzer.semiNormalizeExpression(sortItem.getExpression())); } public List<SortItem> getSortItemList() { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/WhereCondition.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/WhereCondition.java index 4bba6613edb..cec2a81518b 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/WhereCondition.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/WhereCondition.java @@ -32,7 +32,7 @@ public class WhereCondition extends StatementNode { // cast functionName to lowercase in where predicate public WhereCondition(Expression predicate) { - this.predicate = ExpressionAnalyzer.removeAliasFromExpression(predicate); + this.predicate = ExpressionAnalyzer.semiNormalizeExpression(predicate); } public Expression getPredicate() { @@ -40,7 +40,7 @@ public class WhereCondition extends StatementNode { } public void setPredicate(Expression predicate) { - this.predicate = ExpressionAnalyzer.removeAliasFromExpression(predicate); + this.predicate = ExpressionAnalyzer.semiNormalizeExpression(predicate); } public String toSQLString() {
