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;
+    }
+  }
 }