You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2022/10/03 15:44:41 UTC
[iotdb] 01/02: new implement
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 <li...@foxmail.com>
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;
+ }
+ }
}