This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/extendGroupByLevel in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 5d29eb91853f396555f89714116662cf2aeebad2 Author: Minghui Liu <[email protected]> AuthorDate: Wed Sep 28 16:18:12 2022 +0800 new implement --- .../db/mpp/plan/analyze/ExpressionAnalyzer.java | 9 ++--- .../mpp/plan/analyze/GroupByLevelController.java | 43 ++++++++++++++++++---- 2 files changed, 39 insertions(+), 13 deletions(-) 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 c5e0eb1179..89acdc9d59 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 @@ -25,7 +25,6 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.path.PathPatternTree; import org.apache.iotdb.db.exception.sql.MeasurementNotExistException; import org.apache.iotdb.db.exception.sql.SemanticException; -import org.apache.iotdb.db.mpp.common.NodeRef; import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.expression.ExpressionType; @@ -52,7 +51,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -580,7 +578,8 @@ public class ExpressionAnalyzer { } public static Expression replaceRawPathWithGroupedPath( - Expression expression, Map<NodeRef<PartialPath>, PartialPath> rawPathToGroupedPathMap) { + Expression expression, + GroupByLevelController.RawPathToGroupedPathMap rawPathToGroupedPathMap) { if (expression instanceof TernaryExpression) { Expression firstExpression = replaceRawPathWithGroupedPath( @@ -615,8 +614,8 @@ public class ExpressionAnalyzer { } return reconstructFunctionExpression((FunctionExpression) expression, childrenExpressions); } else if (expression instanceof TimeSeriesOperand) { - PartialPath groupedPath = - rawPathToGroupedPathMap.get(NodeRef.of(((TimeSeriesOperand) expression).getPath())); + PartialPath rawPath = ((TimeSeriesOperand) expression).getPath(); + PartialPath groupedPath = rawPathToGroupedPathMap.get(rawPath); return reconstructTimeSeriesOperand(groupedPath); } else if (expression instanceof TimestampOperand || expression instanceof ConstantOperand) { return expression; diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/GroupByLevelController.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/GroupByLevelController.java index 9c33b41900..8641e3542e 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/GroupByLevelController.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/GroupByLevelController.java @@ -23,9 +23,9 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.commons.path.MeasurementPath; import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.db.exception.sql.SemanticException; -import org.apache.iotdb.db.mpp.common.NodeRef; import org.apache.iotdb.db.mpp.plan.expression.Expression; import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand; +import org.apache.iotdb.tsfile.utils.Pair; import java.util.ArrayList; import java.util.HashMap; @@ -36,6 +36,8 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import static com.google.common.base.Preconditions.checkState; + /** * This class is used to control the row number of group by level query. For example, selected * series[root.sg.d1.s1, root.sg.d2.s1, root.sg2.d1.s1], level = 1; the result rows will be @@ -50,7 +52,7 @@ public class GroupByLevelController { private final Map<Expression, Set<Expression>> groupedExpressionToRawExpressionsMap; /** count(root.sg.d1.s1) with level = 1 -> { root.sg.d1.s1 : root.sg.*.s1 } */ - private final Map<NodeRef<PartialPath>, PartialPath> rawPathToGroupedPathMap; + private final RawPathToGroupedPathMap rawPathToGroupedPathMap; /** count(root.*.d1.s1) -> alias */ private final Map<String, String> columnToAliasMap; @@ -64,7 +66,7 @@ public class GroupByLevelController { public GroupByLevelController(int[] levels) { this.levels = levels; this.groupedExpressionToRawExpressionsMap = new LinkedHashMap<>(); - this.rawPathToGroupedPathMap = new HashMap<>(); + this.rawPathToGroupedPathMap = new RawPathToGroupedPathMap(); this.columnToAliasMap = new HashMap<>(); this.aliasToColumnMap = new HashMap<>(); } @@ -75,14 +77,13 @@ public class GroupByLevelController { public Expression control(boolean isCountStar, Expression expression, String alias) { // update rawPathToGroupedPathMap - Set<PartialPath> rawPaths = + List<PartialPath> rawPaths = ExpressionAnalyzer.searchSourceExpressions(expression).stream() .map(timeSeriesOperand -> ((TimeSeriesOperand) timeSeriesOperand).getPath()) - .collect(Collectors.toSet()); + .collect(Collectors.toList()); for (PartialPath rawPath : rawPaths) { - if (!rawPathToGroupedPathMap.containsKey(NodeRef.of(rawPath))) { - rawPathToGroupedPathMap.put( - NodeRef.of(rawPath), generatePartialPathByLevel(isCountStar, rawPath)); + if (!rawPathToGroupedPathMap.containsKey(rawPath)) { + rawPathToGroupedPathMap.put(rawPath, generatePartialPathByLevel(isCountStar, rawPath)); } } @@ -178,4 +179,30 @@ public class GroupByLevelController { public String getAlias(String columnName) { return columnToAliasMap.get(columnName) != null ? columnToAliasMap.get(columnName) : null; } + + public static class RawPathToGroupedPathMap { + + // key - a pair of raw path and its measurement alias + // value - grouped path + private final Map<Pair<PartialPath, String>, PartialPath> map = new HashMap<>(); + + public RawPathToGroupedPathMap() { + // do nothing + } + + public boolean containsKey(PartialPath rawPath) { + return map.containsKey(new Pair<>(rawPath, rawPath.getMeasurementAlias())); + } + + public void put(PartialPath rawPath, PartialPath groupedPath) { + map.put(new Pair<>(rawPath, rawPath.getMeasurementAlias()), groupedPath); + } + + public PartialPath get(PartialPath rawPath) { + PartialPath groupedPath = map.get(new Pair<>(rawPath, rawPath.getMeasurementAlias())); + checkState( + groupedPath != null, "path '%s' is not analyzed in GroupByLevelController.", rawPath); + return groupedPath; + } + } }
