You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2020/07/14 09:42:12 UTC

[incubator-iotdb] branch jira-768 created (now 879c59c)

This is an automated email from the ASF dual-hosted git repository.

haonan pushed a change to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git.


      at 879c59c  Merge branch 'master' of https://github.com/apache/incubator-iotdb into jira-768

This branch includes the following new commits:

     new c811611  aggregation group by level
     new d6c850e  Merge branch 'master' of https://github.com/apache/incubator-iotdb into jira-768
     new 991515b  jira 768
     new 00f33e3  sum
     new 8c3b9af  support sum
     new 84c4b5c  merge master
     new 0428bd1  support max min value and max min time
     new 879c59c  Merge branch 'master' of https://github.com/apache/incubator-iotdb into jira-768

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-iotdb] 04/08: sum

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 00f33e3e6fd73400d1fef9983ad8546281a70c30
Author: HTHou <hh...@outlook.com>
AuthorDate: Fri Jun 19 14:19:51 2020 +0800

    sum
---
 .../query/dataset/groupby/GroupByTimeDataSet.java  |  2 +-
 .../db/query/executor/AggregationExecutor.java     | 22 ++++++----
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  2 +-
 .../org/apache/iotdb/db/utils/FilePathUtils.java   | 51 +++++++++++++++++++---
 4 files changed, 62 insertions(+), 15 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
index 224c04c..4fe932d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
@@ -58,7 +58,7 @@ public class GroupByTimeDataSet extends QueryDataSet {
     }
 
     Map<Integer, String> pathIndex = new HashMap<>();
-    Map<String, Float> finalPaths = FilePathUtils.getPathByLevel(plan.getPaths(), plan.getLevel(), pathIndex);
+    Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
 
     // get all records from GroupByDataSet, then we merge every record
     if (logger.isDebugEnabled()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
index 94d117a..8cb4ff5 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
@@ -48,7 +48,6 @@ import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.read.query.timegenerator.TimeGenerator;
-import org.apache.iotdb.tsfile.utils.Pair;
 
 import java.io.IOException;
 import java.util.*;
@@ -275,7 +274,7 @@ public class AggregationExecutor {
       aggregateResults.add(result);
     }
     aggregateWithValueFilter(aggregateResults, timestampGenerator, readersOfSelectedSeries);
-    return constructDataSet(aggregateResults, queryPlan);
+    return constructDataSet(aggregateResults, (AggregationPlan) queryPlan);
   }
 
   protected TimeGenerator getTimeGenerator(QueryContext context, RawDataQueryPlan queryPlan) throws StorageEngineException {
@@ -334,26 +333,33 @@ public class AggregationExecutor {
       Map<Integer, String> pathIndex = new HashMap<>();
       List<Path> paths = new ArrayList<>();
       List<TSDataType> dataTypes = new ArrayList<>();
-      Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
       RowRecord curRecord = null;
       switch (aggregation) {
         case "count":
+          Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
           curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex);
           for (int i = 0; i < finalPaths.size(); i++) {
             dataTypes.add(TSDataType.INT64);
           }
           break;
+        case "sum":
+          Map<String, Long> finalPathsSum = FilePathUtils.getPathByLevel(plan, pathIndex);
+          curRecord = FilePathUtils.mergeRecordByPath(record, finalPathsSum, pathIndex);
+          for (int i = 0; i < finalPathsSum.size(); i++) {
+            dataTypes.add(TSDataType.INT64);
+          }
+          break;
         case "avg":
-          curRecord = FilePathUtils.avgRecordByPath(record, finalPaths, pathIndex);
-          for (int i = 0; i < finalPaths.size(); i++) {
+          Map<String, Float> finalPathsAvg = FilePathUtils.getPathByLevelAvg(plan, pathIndex);
+          curRecord = FilePathUtils.avgRecordByPath(record, finalPathsAvg, pathIndex);
+          for (int i = 0; i < finalPathsAvg.size(); i++) {
             dataTypes.add(TSDataType.FLOAT);
           }
           break;
+        default:
+          break;
       }
-
       
-      
-
       dataSet = new SingleDataSet(paths, dataTypes);
       dataSet.setRecord(curRecord);
     } else {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 8c852fc..df378d6 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -693,7 +693,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       Map<String, Long> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, null);
       for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
         respColumns.add(((AggregationPlan) plan).getAggregations().get(0) + "(" + entry.getKey() + ")");
-        columnsTypes.add(entry.getValue().toString());
+        columnsTypes.add(TSDataType.INT64.toString());
       }
     } else {
       getWideQueryHeaders(plan, respColumns, columnsTypes);
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
index 9a7310a..4270df8 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
@@ -98,6 +98,47 @@ public class FilePathUtils {
   }
 
   /**
+   * get paths from group by level, like root.sg1.d2.s0, root.sg1.d1.s1
+   * level=1, return [root.sg1, 0] and pathIndex turns to be [[0, root.sg1], [1, root.sg1]]
+   * @param rawPaths
+   * @param level
+   * @param pathIndex
+   * @return
+   */
+  public static Map<String, Float> getPathByLevelAvg(AggregationPlan plan, Map<Integer, String> pathIndex) {
+    // pathGroupByLevel -> count
+    Map<String, Float> finalPaths = new TreeMap<>();
+
+    List<Path> rawPaths = plan.getPaths();
+    int level = plan.getLevel();
+    int i = 0;
+    for (Path value : rawPaths) {
+      String[] tmpPath = MetaUtils.getNodeNames(value.getFullPath());
+
+      String key;
+      if (tmpPath.length <= level) {
+        key = value.getFullPath();
+      } else {
+        StringBuilder path = new StringBuilder();
+        for (int k = 0; k <= level; k++) {
+          if (k == 0) {
+            path.append(tmpPath[k]);
+          } else {
+            path.append(".").append(tmpPath[k]);
+          }
+        }
+        key = path.toString();
+      }
+      finalPaths.putIfAbsent(key, 0F);
+      if (pathIndex != null) {
+        pathIndex.put(i++, key);
+      }
+    }
+
+    return finalPaths;
+  }
+
+  /**
    * merge the raw record by level, for example
    * raw record [timestamp, root.sg1.d1.s0, root.sg1.d1.s1, root.sg1.d2.s2], level=1
    * and newRecord data is [100, 1, 1, 1]
@@ -136,15 +177,15 @@ public class FilePathUtils {
     return tmpRecord;
   }
 
-  public static RowRecord avgRecordByPath(RowRecord newRecord, Map<String, Long> finalPaths,
+  public static RowRecord avgRecordByPath(RowRecord newRecord, Map<String, Float> finalPaths,
       Map<Integer, String> pathIndex) {
     if (newRecord.getFields().size() < finalPaths.size()) {
       return null;
     }
 
     // reset final paths
-    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-      entry.setValue(0L);
+    for (Map.Entry<String, Float> entry : finalPaths.entrySet()) {
+      entry.setValue(0F);
     }
 
     RowRecord tmpRecord = new RowRecord(newRecord.getTimestamp());
@@ -156,8 +197,8 @@ public class FilePathUtils {
       }
     }
 
-    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.INT64));
+    for (Map.Entry<String, Float> entry : finalPaths.entrySet()) {
+      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.FLOAT));
     }
 
     return tmpRecord;


[incubator-iotdb] 03/08: jira 768

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 991515bddf1c03272185bb6a590ceecf1a0dcca3
Author: HTHou <hh...@outlook.com>
AuthorDate: Thu Jun 18 15:41:48 2020 +0800

    jira 768
---
 .../db/query/executor/AggregationExecutor.java     | 30 +++++++++----
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  4 +-
 .../org/apache/iotdb/db/utils/FilePathUtils.java   | 52 +++++++++++++++-------
 3 files changed, 59 insertions(+), 27 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
index aee2237..94d117a 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
@@ -48,6 +48,7 @@ import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.read.query.timegenerator.TimeGenerator;
+import org.apache.iotdb.tsfile.utils.Pair;
 
 import java.io.IOException;
 import java.util.*;
@@ -319,27 +320,40 @@ public class AggregationExecutor {
    *
    * @param aggregateResultList aggregate result list
    */
-  private QueryDataSet constructDataSet(List<AggregateResult> aggregateResultList, RawDataQueryPlan plan) {
+  private QueryDataSet constructDataSet(List<AggregateResult> aggregateResultList, AggregationPlan plan) {
     RowRecord record = new RowRecord(0);
     for (AggregateResult resultData : aggregateResultList) {
       TSDataType dataType = resultData.getResultDataType();
       record.addField(resultData.getResult(), dataType);
     }
 
+    String aggregation = plan.getAggregations().get(0);
     SingleDataSet dataSet = null;
-    if (((AggregationPlan)plan).getLevel() >= 0) {
+    if (plan.getLevel() >= 0) {
       // current only support count operation
       Map<Integer, String> pathIndex = new HashMap<>();
-      Map<String, TSDataType> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, pathIndex);
-
-      RowRecord curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex);
-
       List<Path> paths = new ArrayList<>();
       List<TSDataType> dataTypes = new ArrayList<>();
-      for (int i = 0; i < finalPaths.size(); i++) {
-        dataTypes.add(TSDataType.DOUBLE);
+      Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
+      RowRecord curRecord = null;
+      switch (aggregation) {
+        case "count":
+          curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex);
+          for (int i = 0; i < finalPaths.size(); i++) {
+            dataTypes.add(TSDataType.INT64);
+          }
+          break;
+        case "avg":
+          curRecord = FilePathUtils.avgRecordByPath(record, finalPaths, pathIndex);
+          for (int i = 0; i < finalPaths.size(); i++) {
+            dataTypes.add(TSDataType.FLOAT);
+          }
+          break;
       }
 
+      
+      
+
       dataSet = new SingleDataSet(paths, dataTypes);
       dataSet.setRecord(curRecord);
     } else {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 3b51b3c..8c852fc 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -690,8 +690,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       // because the query dataset and query id is different although the header of last query is same.
       return StaticResps.LAST_RESP.deepCopy();
     } else if (plan instanceof AggregationPlan && ((AggregationPlan)plan).getLevel() >= 0) {
-      Map<String, TSDataType> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, null);
-      for (Map.Entry<String, TSDataType> entry : finalPaths.entrySet()) {
+      Map<String, Long> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, null);
+      for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
         respColumns.add(((AggregationPlan) plan).getAggregations().get(0) + "(" + entry.getKey() + ")");
         columnsTypes.add(entry.getValue().toString());
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
index 84b11e2..9a7310a 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
@@ -64,13 +64,12 @@ public class FilePathUtils {
    * @param pathIndex
    * @return
    */
-  public static Map<String, TSDataType> getPathByLevel(AggregationPlan plan, Map<Integer, String> pathIndex) {
+  public static Map<String, Long> getPathByLevel(AggregationPlan plan, Map<Integer, String> pathIndex) {
     // pathGroupByLevel -> count
-    Map<String, TSDataType> finalPaths = new TreeMap<>();
+    Map<String, Long> finalPaths = new TreeMap<>();
 
     List<Path> rawPaths = plan.getPaths();
     int level = plan.getLevel();
-    String aggregation = plan.getAggregations().get(0);
     int i = 0;
     for (Path value : rawPaths) {
       String[] tmpPath = MetaUtils.getNodeNames(value.getFullPath());
@@ -89,15 +88,7 @@ public class FilePathUtils {
         }
         key = path.toString();
       }
-      switch (aggregation) {
-        case "sum" :
-          finalPaths.putIfAbsent(key, TSDataType.INT64);
-          break;
-        case "avg" :
-          finalPaths.putIfAbsent(key, TSDataType.INT64);
-          break;
-      }
-      finalPaths.putIfAbsent(key, (float) 0);
+      finalPaths.putIfAbsent(key, 0L);
       if (pathIndex != null) {
         pathIndex.put(i++, key);
       }
@@ -118,15 +109,42 @@ public class FilePathUtils {
    * @return
    */
   public static RowRecord mergeRecordByPath(RowRecord newRecord,
-                                      Map<String, Float> finalPaths,
+                                      Map<String, Long> finalPaths,
                                       Map<Integer, String> pathIndex) {
     if (newRecord.getFields().size() < finalPaths.size()) {
       return null;
     }
 
     // reset final paths
-    for (Map.Entry<String, Float> entry : finalPaths.entrySet()) {
-      entry.setValue((float) 0);
+    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
+      entry.setValue(0L);
+    }
+
+    RowRecord tmpRecord = new RowRecord(newRecord.getTimestamp());
+
+    for (int i = 0; i < newRecord.getFields().size(); i++) {
+      if (newRecord.getFields().get(i) != null) {
+        finalPaths.put(pathIndex.get(i),
+          finalPaths.get(pathIndex.get(i)) + newRecord.getFields().get(i).getLongV());
+      }
+    }
+
+    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
+      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.INT64));
+    }
+
+    return tmpRecord;
+  }
+
+  public static RowRecord avgRecordByPath(RowRecord newRecord, Map<String, Long> finalPaths,
+      Map<Integer, String> pathIndex) {
+    if (newRecord.getFields().size() < finalPaths.size()) {
+      return null;
+    }
+
+    // reset final paths
+    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
+      entry.setValue(0L);
     }
 
     RowRecord tmpRecord = new RowRecord(newRecord.getTimestamp());
@@ -138,8 +156,8 @@ public class FilePathUtils {
       }
     }
 
-    for (Map.Entry<String, Float> entry : finalPaths.entrySet()) {
-      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.FLOAT));
+    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
+      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.INT64));
     }
 
     return tmpRecord;


[incubator-iotdb] 07/08: support max min value and max min time

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 0428bd10df8101d3e2b545fc69938fc60afbc5dd
Author: HTHou <hh...@outlook.com>
AuthorDate: Tue Jul 14 17:39:03 2020 +0800

    support max min value and max min time
---
 .../query/dataset/groupby/GroupByTimeDataSet.java  |   2 +-
 .../db/query/executor/AggregationExecutor.java     |  55 +++++++--
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  11 +-
 .../org/apache/iotdb/db/utils/FilePathUtils.java   | 125 ++++++++++++++++-----
 4 files changed, 150 insertions(+), 43 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
index e2005ce..caf50da 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
@@ -58,7 +58,7 @@ public class GroupByTimeDataSet extends QueryDataSet {
     }
 
     Map<Integer, String> pathIndex = new HashMap<>();
-    Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
+    Set<String> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
 
     // get all records from GroupByDataSet, then we merge every record
     if (logger.isDebugEnabled()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
index 5895280..922621a 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
@@ -318,42 +318,79 @@ public class AggregationExecutor {
    * using aggregate result data list construct QueryDataSet.
    *
    * @param aggregateResultList aggregate result list
+   * @throws QueryProcessException 
    */
-  private QueryDataSet constructDataSet(List<AggregateResult> aggregateResultList, AggregationPlan plan) {
+  private QueryDataSet constructDataSet(List<AggregateResult> aggregateResultList, AggregationPlan plan) 
+      throws QueryProcessException {
     RowRecord record = new RowRecord(0);
     for (AggregateResult resultData : aggregateResultList) {
       TSDataType dataType = resultData.getResultDataType();
       record.addField(resultData.getResult(), dataType);
     }
-
-    String aggregation = plan.getAggregations().get(0);
     SingleDataSet dataSet = null;
     if (plan.getLevel() >= 0) {
-      // current only support count operation
+      if (plan.getAggregations().size() > 1) {
+        //throw new QueryProcessException("Group by level doesn't support multiple aggregations");
+      }
+      // TODO: Check data type here
+      
+      String aggregation = plan.getAggregations().get(0);
+      
       Map<Integer, String> pathIndex = new HashMap<>();
       List<Path> paths = new ArrayList<>();
       List<TSDataType> dataTypes = new ArrayList<>();
       RowRecord curRecord = null;
+      Set<String> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
       switch (aggregation) {
         case "count":
-          Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
           curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex, TSDataType.INT64);
           for (int i = 0; i < finalPaths.size(); i++) {
             dataTypes.add(TSDataType.INT64);
           }
           break;
         case "sum":
-          Map<String, Long> finalPathsSum = FilePathUtils.getPathByLevel(plan, pathIndex);
-          curRecord = FilePathUtils.mergeRecordByPath(record, finalPathsSum, pathIndex, TSDataType.DOUBLE);
-          for (int i = 0; i < finalPathsSum.size(); i++) {
+          // Check datatype
+          curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex, TSDataType.DOUBLE);
+          for (int i = 0; i < finalPaths.size(); i++) {
             dataTypes.add(TSDataType.DOUBLE);
           }
           break;
         case "avg":
+          // Check datatype
           Map<String, Float> finalPathsAvg = FilePathUtils.getPathByLevelAvg(plan, pathIndex);
           curRecord = FilePathUtils.avgRecordByPath(record, finalPathsAvg, pathIndex);
           for (int i = 0; i < finalPathsAvg.size(); i++) {
-            dataTypes.add(TSDataType.FLOAT);
+            dataTypes.add(TSDataType.DOUBLE);
+          }
+          break;
+        case "max_time":
+          curRecord = FilePathUtils.mergeMaxOrMinByPath(record, TSDataType.INT64, finalPaths, 
+              pathIndex, true);
+          for (int i = 0; i < finalPaths.size(); i++) {
+            dataTypes.add(TSDataType.INT64);
+          }
+          break;
+        case "min_time":
+          curRecord = FilePathUtils.mergeMaxOrMinByPath(record, TSDataType.INT64, finalPaths,
+              pathIndex, false);
+          for (int i = 0; i < finalPaths.size(); i++) {
+            dataTypes.add(TSDataType.INT64);
+          }
+          break;
+        case "max_value":
+          // Check datatype
+          curRecord = FilePathUtils.mergeMaxOrMinByPath(record, plan.getDeduplicatedDataTypes().get(0), 
+              finalPaths, pathIndex, true);
+          for (int i = 0; i < finalPaths.size(); i++) {
+            dataTypes.add(plan.getDeduplicatedDataTypes().get(0));
+          }
+          break;
+        case "min_value":
+          // Check datatype
+          curRecord = FilePathUtils.mergeMaxOrMinByPath(record, plan.getDeduplicatedDataTypes().get(0), 
+              finalPaths, pathIndex, false);
+          for (int i = 0; i < finalPaths.size(); i++) {
+            dataTypes.add(plan.getDeduplicatedDataTypes().get(0));
           }
           break;
         default:
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index ad464d4..a50d42f 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -738,12 +738,11 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       // Last Query should return different respond instead of the static one
       // because the query dataset and query id is different although the header of last query is same.
       return StaticResps.LAST_RESP.deepCopy();
-    } else if (plan instanceof AggregationPlan && ((AggregationPlan) plan).getLevel() >= 0) {
-      Map<String, Long> finalPaths = FilePathUtils
-          .getPathByLevel(((AggregationPlan) plan).getDeduplicatedPaths(),
-              ((AggregationPlan) plan).getLevel(), null);
-      for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-        respColumns.add(((AggregationPlan) plan).getAggregations().get(0) + "(" + entry.getKey() + ")");
+    } else if (plan instanceof AggregationPlan && ((AggregationPlan)plan).getLevel() >= 0) {
+      Set<String> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, null);
+      TSDataType type = FilePathUtils.getTSDataType((AggregationPlan) plan);
+      for (String path : finalPaths) {
+        respColumns.add(((AggregationPlan) plan).getAggregations().get(0) + "(" + path + ")");
         columnsTypes.add(type.toString());
       }
     } else {
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
index 2057300..ecb41b0 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
@@ -19,10 +19,11 @@
 package org.apache.iotdb.db.utils;
 
 import java.io.File;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeMap;
+import java.util.TreeSet;
 
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.metadata.MetaUtils;
@@ -65,9 +66,9 @@ public class FilePathUtils {
    * @param pathIndex
    * @return
    */
-  public static Map<String, Long> getPathByLevel(AggregationPlan plan, Map<Integer, String> pathIndex) {
+  public static Set<String> getPathByLevel(AggregationPlan plan, Map<Integer, String> pathIndex) {
     // pathGroupByLevel -> count
-    Map<String, Long> finalPaths = new TreeMap<>();
+    Set<String> finalPaths = new TreeSet<>();
 
     List<Path> rawPaths = plan.getPaths();
     int level = plan.getLevel();
@@ -89,7 +90,7 @@ public class FilePathUtils {
         }
         key = path.toString();
       }
-      finalPaths.putIfAbsent(key, 0L);
+      finalPaths.add(key);
       if (pathIndex != null) {
         pathIndex.put(i++, key);
       }
@@ -151,60 +152,121 @@ public class FilePathUtils {
    * @return
    */
   public static RowRecord mergeRecordByPath(RowRecord newRecord,
-                                      Map<String, Long> finalPaths,
-                                      Map<Integer, String> pathIndex,
-                                      TSDataType type) {
+      Set<String> finalPaths, Map<Integer, String> pathIndex,
+      TSDataType type) {
     if (newRecord.getFields().size() < finalPaths.size()) {
       return null;
     }
 
-    Map<String, Object> finalPathMap = new HashMap<>();
+    Map<String, Object> finalPathMap = new TreeMap<>();
     // reset final paths
-    initFinalPathMap(finalPathMap, finalPaths, type);
+    initFinalPathMap(finalPathMap, finalPaths, type, 0);
 
     RowRecord tmpRecord = new RowRecord(newRecord.getTimestamp());
 
     for (int i = 0; i < newRecord.getFields().size(); i++) {
       if (newRecord.getFields().get(i) != null) {
-        finalPathMap.put(pathIndex.get(i), getValue(type, newRecord.getFields().get(i), finalPathMap.get(pathIndex.get(i))));
+        finalPathMap.put(pathIndex.get(i), getSum(type, newRecord.getFields().get(i), 
+            finalPathMap.get(pathIndex.get(i))));
       }
     }
 
     for (Map.Entry<String, Object> entry : finalPathMap.entrySet()) {
       tmpRecord.addField(Field.getField(entry.getValue(), type));
     }
-
     return tmpRecord;
   }
 
-  private static void initFinalPathMap(Map<String, Object> finalPathMap, Map<String, Long> finalPaths, TSDataType type) {
+  private static void initFinalPathMap(Map<String, Object> finalPathMap,
+      Set<String> finalPaths, TSDataType type, int initValue) {
+    for (String path : finalPaths) {
+      switch (type) {
+        case INT32 :
+          finalPathMap.put(path, initValue);
+          break;
+        case INT64 :
+          if (initValue == 0) {
+            finalPathMap.put(path, 0L);
+          } else if (initValue > 0) {
+            finalPathMap.put(path, Long.MAX_VALUE);
+          } else {
+            finalPathMap.put(path, Long.MIN_VALUE);
+          }
+          break;
+        case FLOAT :
+          if (initValue == 0) {
+            finalPathMap.put(path, 0F);
+          } else if (initValue > 0) {
+            finalPathMap.put(path, Float.MAX_VALUE);
+          } else {
+            finalPathMap.put(path, Float.MIN_VALUE);
+          }
+          break;
+        case DOUBLE :
+          if (initValue == 0) {
+            finalPathMap.put(path, 0D);
+          } else if (initValue > 0) {
+            finalPathMap.put(path, Double.MAX_VALUE);
+          } else {
+            finalPathMap.put(path, Double.MIN_VALUE);
+          }
+          break;
+        default :
+          finalPathMap.put(path, 0L);
+      }
+    }
+  }
+
+  private static Object getSum(TSDataType type, Field field, Object before) {
     switch (type) {
       case INT64 :
-        for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-          finalPathMap.put(entry.getKey(), 0L);
-        }
-        break;
+        return ((Long) before) + field.getLongV(); 
       case DOUBLE :
-        for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-          finalPathMap.put(entry.getKey(), 0D);
-        }
-        break;
+        return ((Double) before) + field.getDoubleV(); 
       default :
-        for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-          finalPathMap.put(entry.getKey(), 0L);
-        }
+        return ((Long) before) + field.getLongV(); 
     }
   }
 
-  private static Object getValue(TSDataType type, Field field, Object before) {
+  private static Object getMaxOrMin(TSDataType type, Field field, Object before, boolean isMax) {
     switch (type) {
       case INT64 :
-        return ((Long) before) + field.getLongV(); 
+        return isMax ? Math.max(((Long) before), field.getLongV())
+            : Math.min(((Long) before), field.getLongV());
+      case INT32 :
+        return isMax ? Math.max(((Integer) before), field.getIntV())
+            : Math.min(((Integer) before), field.getIntV());
       case DOUBLE :
-        return ((Double) before) + field.getDoubleV(); 
+        return isMax ? Math.max(((Double) before), field.getDoubleV())
+            : Math.min(((Double) before), field.getDoubleV());
+      case FLOAT :
+        return isMax ? Math.max(((Float) before), field.getFloatV())
+            : Math.min(((Float) before), field.getFloatV());
       default :
-        return ((Long) before) + field.getLongV(); 
+        return isMax ? Math.max(((Long) before), field.getLongV())
+            : Math.min(((Long) before), field.getLongV());
+    }
+  }
+
+  public static RowRecord mergeMaxOrMinByPath(RowRecord newRecord, TSDataType type,
+      Set<String> finalPaths, Map<Integer, String> pathIndex, boolean isMax) {
+    if (newRecord.getFields().size() < finalPaths.size()) {
+      return null;
+    }
+    Map<String, Object> finalPathMap = new TreeMap<>();
+    // reset final paths
+    initFinalPathMap(finalPathMap, finalPaths, type, isMax ? Integer.MIN_VALUE : Integer.MAX_VALUE);
+    for (int i = 0; i < newRecord.getFields().size(); i++) {
+      if (newRecord.getFields().get(i) != null) {
+        finalPathMap.put(pathIndex.get(i), getMaxOrMin(type, newRecord.getFields().get(i), 
+            finalPathMap.get(pathIndex.get(i)), isMax));
+      }
     }
+    RowRecord tmpRecord = new RowRecord(newRecord.getTimestamp());
+    for (Map.Entry<String, Object> entry : finalPathMap.entrySet()) {
+      tmpRecord.addField(Field.getField(entry.getValue(), type));
+    }
+    return tmpRecord;
   }
 
   public static RowRecord avgRecordByPath(RowRecord newRecord, Map<String, Float> finalPaths,
@@ -239,8 +301,17 @@ public class FilePathUtils {
     switch (aggregation) {
       case "count" :
         return TSDataType.INT64;
+      case "avg" :
       case "sum" :
         return TSDataType.DOUBLE;
+      case "first_value" :
+      case "last_value" :
+      case "max_value" :
+      case "min_value" :
+        return plan.getDeduplicatedDataTypes().get(0);
+      case "max_time" :
+      case "min_time" :
+        return TSDataType.INT64;
       default :
         return TSDataType.INT64;
     }


[incubator-iotdb] 05/08: support sum

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 8c3b9af22bc9ed68c12a77bb4757effece2ce456
Author: HTHou <hh...@outlook.com>
AuthorDate: Mon Jun 22 15:36:38 2020 +0800

    support sum
---
 .../query/dataset/groupby/GroupByTimeDataSet.java  |  3 +-
 .../db/query/executor/AggregationExecutor.java     |  6 +--
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  3 +-
 .../org/apache/iotdb/db/utils/FilePathUtils.java   | 58 +++++++++++++++++++---
 4 files changed, 57 insertions(+), 13 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
index 4fe932d..e2005ce 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
@@ -65,7 +65,8 @@ public class GroupByTimeDataSet extends QueryDataSet {
       logger.debug("only group by level, paths:" + groupByTimePlan.getPaths());
     }
     while (dataSet != null && dataSet.hasNextWithoutConstraint()) {
-      RowRecord curRecord = FilePathUtils.mergeRecordByPath(dataSet.nextWithoutConstraint(), finalPaths, pathIndex);
+      RowRecord curRecord = FilePathUtils
+          .mergeRecordByPath(dataSet.nextWithoutConstraint(), finalPaths, pathIndex, dataTypes.get(0));
       if (curRecord != null) {
         records.add(curRecord);
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
index 8cb4ff5..5895280 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
@@ -337,16 +337,16 @@ public class AggregationExecutor {
       switch (aggregation) {
         case "count":
           Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan, pathIndex);
-          curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex);
+          curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex, TSDataType.INT64);
           for (int i = 0; i < finalPaths.size(); i++) {
             dataTypes.add(TSDataType.INT64);
           }
           break;
         case "sum":
           Map<String, Long> finalPathsSum = FilePathUtils.getPathByLevel(plan, pathIndex);
-          curRecord = FilePathUtils.mergeRecordByPath(record, finalPathsSum, pathIndex);
+          curRecord = FilePathUtils.mergeRecordByPath(record, finalPathsSum, pathIndex, TSDataType.DOUBLE);
           for (int i = 0; i < finalPathsSum.size(); i++) {
-            dataTypes.add(TSDataType.INT64);
+            dataTypes.add(TSDataType.DOUBLE);
           }
           break;
         case "avg":
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index df378d6..5be346d 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -691,9 +691,10 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       return StaticResps.LAST_RESP.deepCopy();
     } else if (plan instanceof AggregationPlan && ((AggregationPlan)plan).getLevel() >= 0) {
       Map<String, Long> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, null);
+      TSDataType type = FilePathUtils.getTSDataType((AggregationPlan) plan);
       for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
         respColumns.add(((AggregationPlan) plan).getAggregations().get(0) + "(" + entry.getKey() + ")");
-        columnsTypes.add(TSDataType.INT64.toString());
+        columnsTypes.add(type.toString());
       }
     } else {
       getWideQueryHeaders(plan, respColumns, columnsTypes);
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
index 4270df8..2057300 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.db.utils;
 
 import java.io.File;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
@@ -151,32 +152,61 @@ public class FilePathUtils {
    */
   public static RowRecord mergeRecordByPath(RowRecord newRecord,
                                       Map<String, Long> finalPaths,
-                                      Map<Integer, String> pathIndex) {
+                                      Map<Integer, String> pathIndex,
+                                      TSDataType type) {
     if (newRecord.getFields().size() < finalPaths.size()) {
       return null;
     }
 
+    Map<String, Object> finalPathMap = new HashMap<>();
     // reset final paths
-    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-      entry.setValue(0L);
-    }
+    initFinalPathMap(finalPathMap, finalPaths, type);
 
     RowRecord tmpRecord = new RowRecord(newRecord.getTimestamp());
 
     for (int i = 0; i < newRecord.getFields().size(); i++) {
       if (newRecord.getFields().get(i) != null) {
-        finalPaths.put(pathIndex.get(i),
-          finalPaths.get(pathIndex.get(i)) + newRecord.getFields().get(i).getLongV());
+        finalPathMap.put(pathIndex.get(i), getValue(type, newRecord.getFields().get(i), finalPathMap.get(pathIndex.get(i))));
       }
     }
 
-    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.INT64));
+    for (Map.Entry<String, Object> entry : finalPathMap.entrySet()) {
+      tmpRecord.addField(Field.getField(entry.getValue(), type));
     }
 
     return tmpRecord;
   }
 
+  private static void initFinalPathMap(Map<String, Object> finalPathMap, Map<String, Long> finalPaths, TSDataType type) {
+    switch (type) {
+      case INT64 :
+        for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
+          finalPathMap.put(entry.getKey(), 0L);
+        }
+        break;
+      case DOUBLE :
+        for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
+          finalPathMap.put(entry.getKey(), 0D);
+        }
+        break;
+      default :
+        for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
+          finalPathMap.put(entry.getKey(), 0L);
+        }
+    }
+  }
+
+  private static Object getValue(TSDataType type, Field field, Object before) {
+    switch (type) {
+      case INT64 :
+        return ((Long) before) + field.getLongV(); 
+      case DOUBLE :
+        return ((Double) before) + field.getDoubleV(); 
+      default :
+        return ((Long) before) + field.getLongV(); 
+    }
+  }
+
   public static RowRecord avgRecordByPath(RowRecord newRecord, Map<String, Float> finalPaths,
       Map<Integer, String> pathIndex) {
     if (newRecord.getFields().size() < finalPaths.size()) {
@@ -204,4 +234,16 @@ public class FilePathUtils {
     return tmpRecord;
   }
 
+  public static TSDataType getTSDataType(AggregationPlan plan) {
+    String aggregation = plan.getAggregations().get(0);
+    switch (aggregation) {
+      case "count" :
+        return TSDataType.INT64;
+      case "sum" :
+        return TSDataType.DOUBLE;
+      default :
+        return TSDataType.INT64;
+    }
+  }
+
 }


[incubator-iotdb] 02/08: Merge branch 'master' of https://github.com/apache/incubator-iotdb into jira-768

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit d6c850e40c22c6065cc9593d547294eb9735e8c1
Merge: c811611 decd8a3
Author: HTHou <hh...@outlook.com>
AuthorDate: Thu Jun 18 13:56:27 2020 +0800

    Merge branch 'master' of https://github.com/apache/incubator-iotdb into jira-768

 README.md                                          |   2 +-
 README_ZH.md                                       |   4 +-
 RELEASE_NOTES.md                                   | 181 +++++++++++++
 distribution/src/assembly/distribution.xml         |  40 ++-
 docs/UserGuide/Client/Programming - Native API.md  |  30 ++-
 .../DDL Data Definition Language.md                |   8 +-
 .../DML Data Manipulation Language.md              |   4 +-
 .../System Tools/Monitor and Log Tools.md          |   2 +-
 .../UserGuide/Client/Programming - Native API.md   |  34 ++-
 .../DDL Data Definition Language.md                |   9 +-
 example/rocketmq/readme.md                         |   2 +-
 .../main/java/org/apache/iotdb/SessionExample.java |   6 +-
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |  20 +-
 .../test/java/org/apache/iotdb/jdbc/BatchTest.java |  27 +-
 server/src/assembly/resources/conf/logback.xml     |  21 ++
 .../src/assembly/resources/sbin/start-server.bat   |   5 +-
 .../assembly/resources/tools/detect-watermark.bat  |   4 +-
 .../tools/logVisualize/log-visualizer-cmd.bat      |   4 +-
 .../tools/logVisualize/log-visualizer-gui.bat      |   4 +-
 .../src/assembly/resources/tools/memory-tool.bat   |   4 +-
 .../assembly/resources/tools/start-WalChecker.bat  |   5 +-
 .../assembly/resources/tools/start-sync-client.bat |   5 +-
 .../tools/tsfileToolSet/print-iotdb-data-dir.bat   |   4 +-
 .../tsfileToolSet/print-tsfile-resource-files.bat  |   4 +-
 .../tools/tsfileToolSet/print-tsfile-sketch.bat    |   4 +-
 .../resources/tools/upgrade/offline-upgrade.bat    |   2 +-
 .../org/apache/iotdb/db/qp/strategy/SqlBase.g4     |   6 +-
 .../org/apache/iotdb/db/conf/IoTDBConfigCheck.java |  48 +++-
 .../org/apache/iotdb/db/conf/IoTDBConstant.java    |   2 +
 .../org/apache/iotdb/db/engine/StorageEngine.java  |  12 +-
 .../iotdb/db/engine/merge/task/MergeTask.java      |  11 +-
 .../engine/storagegroup/StorageGroupProcessor.java |  57 ++--
 .../db/exception/BatchInsertionException.java      |  28 +-
 .../org/apache/iotdb/db/metadata/MManager.java     |  50 ++--
 .../java/org/apache/iotdb/db/metadata/MTree.java   | 188 ++++++++------
 .../apache/iotdb/db/metadata/MetadataConstant.java |  11 +-
 .../iotdb/db/metadata/mnode/InternalMNode.java     | 135 ----------
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  | 137 +++++++++-
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |  77 +++++-
 .../iotdb/db/metadata/mnode/StorageGroupMNode.java |  22 +-
 .../apache/iotdb/db/qp/executor/IPlanExecutor.java |   4 +-
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |  54 ++--
 .../db/qp/logical/sys/ShowTimeSeriesOperator.java  |   9 +-
 .../db/qp/physical/sys/ShowTimeSeriesPlan.java     |  15 +-
 .../iotdb/db/qp/strategy/LogicalGenerator.java     | 154 +++++------
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  61 ++---
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 134 ++++------
 .../iotdb/db/utils/datastructure/DoubleTVList.java |   2 +-
 .../iotdb/db/utils/datastructure/FloatTVList.java  |   2 +-
 .../integration/IoTDBSortedShowTimeseriesIT.java   | 287 +++++++++++++++++++++
 .../iotdb/db/metadata/MManagerImproveTest.java     |   5 +-
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |  40 +--
 .../apache/iotdb/db/utils/VersionUtilsTest.java    |  55 ++++
 .../db/utils/datastructure/PrecisionTest.java      | 125 +++++++++
 service-rpc/rpc-changelist.md                      |  21 ++
 .../apache/iotdb/rpc/BatchExecutionException.java  |   3 +-
 .../main/java/org/apache/iotdb/rpc/RpcUtils.java   |  39 +--
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |   1 +
 service-rpc/src/main/thrift/rpc.thrift             |  22 +-
 .../java/org/apache/iotdb/session/Session.java     |  48 ++--
 .../org/apache/iotdb/session/pool/SessionPool.java |  40 +--
 .../org/apache/iotdb/session/IoTDBSessionIT.java   |  12 +-
 .../iotdb/tsfile/utils/ReadWriteIOUtils.java       |  12 +-
 .../apache/iotdb/tsfile/utils/VersionUtils.java    |  13 +-
 64 files changed, 1647 insertions(+), 730 deletions(-)



[incubator-iotdb] 01/08: aggregation group by level

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit c8116115209a30cd800d1929e72d714968cda854
Author: HTHou <hh...@outlook.com>
AuthorDate: Wed Jun 17 09:15:40 2020 +0800

    aggregation group by level
---
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    | 17 ------------
 .../query/dataset/groupby/GroupByTimeDataSet.java  |  8 +-----
 .../db/query/executor/AggregationExecutor.java     |  4 +--
 .../iotdb/db/query/executor/QueryRouter.java       |  1 -
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  8 +++---
 .../org/apache/iotdb/db/utils/FilePathUtils.java   | 30 +++++++++++++++-------
 6 files changed, 28 insertions(+), 40 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 00c8e7c..48abb5d 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -362,15 +362,6 @@ public class PhysicalGenerator {
           .setAggregations(queryOperator.getSelectOperator().getAggregations());
 
       ((GroupByTimePlan) queryPlan).setLevel(queryOperator.getLevel());
-
-      if (queryOperator.getLevel() >= 0) {
-        for (int i = 0; i < queryOperator.getSelectOperator().getAggregations().size(); i++) {
-          if (!SQLConstant.COUNT
-              .equals(queryOperator.getSelectOperator().getAggregations().get(i))) {
-            throw new QueryProcessException("group by level only support count now.");
-          }
-        }
-      }
     } else if (queryOperator.isFill()) {
       queryPlan = new FillQueryPlan();
       FilterOperator timeFilter = queryOperator.getFilterOperator();
@@ -385,14 +376,6 @@ public class PhysicalGenerator {
       ((AggregationPlan) queryPlan).setLevel(queryOperator.getLevel());
       ((AggregationPlan) queryPlan)
           .setAggregations(queryOperator.getSelectOperator().getAggregations());
-      if (queryOperator.getLevel() >= 0) {
-        for (int i = 0; i < queryOperator.getSelectOperator().getAggregations().size(); i++) {
-          if (!SQLConstant.COUNT
-              .equals(queryOperator.getSelectOperator().getAggregations().get(i))) {
-            throw new QueryProcessException("group by level only support count now.");
-          }
-        }
-      }
     } else if (queryOperator.isLastQuery()) {
       queryPlan = new LastQueryPlan();
     } else {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
index b655709..224c04c 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/GroupByTimeDataSet.java
@@ -22,16 +22,10 @@ package org.apache.iotdb.db.query.dataset.groupby;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.physical.crud.GroupByTimePlan;
-import org.apache.iotdb.db.query.aggregation.AggregateResult;
 import org.apache.iotdb.db.query.context.QueryContext;
-import org.apache.iotdb.db.query.factory.AggregateResultFactory;
-import org.apache.iotdb.db.query.filter.TsFileFilter;
 import org.apache.iotdb.db.utils.FilePathUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.common.Field;
-import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
-import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,7 +58,7 @@ public class GroupByTimeDataSet extends QueryDataSet {
     }
 
     Map<Integer, String> pathIndex = new HashMap<>();
-    Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan.getPaths(), plan.getLevel(), pathIndex);
+    Map<String, Float> finalPaths = FilePathUtils.getPathByLevel(plan.getPaths(), plan.getLevel(), pathIndex);
 
     // get all records from GroupByDataSet, then we merge every record
     if (logger.isDebugEnabled()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
index e7f51cd..aee2237 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
@@ -330,14 +330,14 @@ public class AggregationExecutor {
     if (((AggregationPlan)plan).getLevel() >= 0) {
       // current only support count operation
       Map<Integer, String> pathIndex = new HashMap<>();
-      Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(plan.getDeduplicatedPaths(), ((AggregationPlan)plan).getLevel(), pathIndex);
+      Map<String, TSDataType> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, pathIndex);
 
       RowRecord curRecord = FilePathUtils.mergeRecordByPath(record, finalPaths, pathIndex);
 
       List<Path> paths = new ArrayList<>();
       List<TSDataType> dataTypes = new ArrayList<>();
       for (int i = 0; i < finalPaths.size(); i++) {
-        dataTypes.add(TSDataType.INT64);
+        dataTypes.add(TSDataType.DOUBLE);
       }
 
       dataSet = new SingleDataSet(paths, dataTypes);
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java b/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java
index 4d2070f..6b421be 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/QueryRouter.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.physical.crud.*;
 import org.apache.iotdb.db.query.context.QueryContext;
-import org.apache.iotdb.db.query.dataset.SingleDataSet;
 import org.apache.iotdb.db.query.dataset.groupby.*;
 import org.apache.iotdb.db.query.executor.fill.IFill;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 11e3ac3..2f424ab 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -690,10 +690,10 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       // because the query dataset and query id is different although the header of last query is same.
       return StaticResps.LAST_RESP.deepCopy();
     } else if (plan instanceof AggregationPlan && ((AggregationPlan)plan).getLevel() >= 0) {
-      Map<String, Long> finalPaths = FilePathUtils.getPathByLevel(((AggregationPlan)plan).getDeduplicatedPaths(), ((AggregationPlan)plan).getLevel(), null);
-      for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-        respColumns.add("count(" + entry.getKey() + ")");
-        columnsTypes.add(TSDataType.INT64.toString());
+      Map<String, TSDataType> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, null);
+      for (Map.Entry<String, TSDataType> entry : finalPaths.entrySet()) {
+        respColumns.add(((AggregationPlan) plan).getAggregations().get(0) + "(" + entry.getKey() + ")");
+        columnsTypes.add(entry.getValue().toString());
       }
     } else {
       getWideQueryHeaders(plan, respColumns, columnsTypes);
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
index bb4ff27..84b11e2 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/FilePathUtils.java
@@ -25,6 +25,7 @@ import java.util.TreeMap;
 
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.metadata.MetaUtils;
+import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Field;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -63,10 +64,13 @@ public class FilePathUtils {
    * @param pathIndex
    * @return
    */
-  public static Map<String, Long> getPathByLevel(List<Path> rawPaths, int level, Map<Integer, String> pathIndex) {
+  public static Map<String, TSDataType> getPathByLevel(AggregationPlan plan, Map<Integer, String> pathIndex) {
     // pathGroupByLevel -> count
-    Map<String, Long> finalPaths = new TreeMap<>();
+    Map<String, TSDataType> finalPaths = new TreeMap<>();
 
+    List<Path> rawPaths = plan.getPaths();
+    int level = plan.getLevel();
+    String aggregation = plan.getAggregations().get(0);
     int i = 0;
     for (Path value : rawPaths) {
       String[] tmpPath = MetaUtils.getNodeNames(value.getFullPath());
@@ -85,7 +89,15 @@ public class FilePathUtils {
         }
         key = path.toString();
       }
-      finalPaths.putIfAbsent(key, 0L);
+      switch (aggregation) {
+        case "sum" :
+          finalPaths.putIfAbsent(key, TSDataType.INT64);
+          break;
+        case "avg" :
+          finalPaths.putIfAbsent(key, TSDataType.INT64);
+          break;
+      }
+      finalPaths.putIfAbsent(key, (float) 0);
       if (pathIndex != null) {
         pathIndex.put(i++, key);
       }
@@ -106,15 +118,15 @@ public class FilePathUtils {
    * @return
    */
   public static RowRecord mergeRecordByPath(RowRecord newRecord,
-                                      Map<String, Long> finalPaths,
+                                      Map<String, Float> finalPaths,
                                       Map<Integer, String> pathIndex) {
     if (newRecord.getFields().size() < finalPaths.size()) {
       return null;
     }
 
     // reset final paths
-    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-      entry.setValue(0L);
+    for (Map.Entry<String, Float> entry : finalPaths.entrySet()) {
+      entry.setValue((float) 0);
     }
 
     RowRecord tmpRecord = new RowRecord(newRecord.getTimestamp());
@@ -122,12 +134,12 @@ public class FilePathUtils {
     for (int i = 0; i < newRecord.getFields().size(); i++) {
       if (newRecord.getFields().get(i) != null) {
         finalPaths.put(pathIndex.get(i),
-          finalPaths.get(pathIndex.get(i)) + newRecord.getFields().get(i).getLongV());
+          finalPaths.get(pathIndex.get(i)) + newRecord.getFields().get(i).getFloatV());
       }
     }
 
-    for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
-      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.INT64));
+    for (Map.Entry<String, Float> entry : finalPaths.entrySet()) {
+      tmpRecord.addField(Field.getField(entry.getValue(), TSDataType.FLOAT));
     }
 
     return tmpRecord;


[incubator-iotdb] 06/08: merge master

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 84c4b5c1a7df67e55f166adf88823ba49c45de84
Merge: 8c3b9af 7e628d2
Author: HTHou <hh...@outlook.com>
AuthorDate: Tue Jul 14 09:33:42 2020 +0800

    merge master

 LICENSE-binary                                     |  72 +++-
 README.md                                          |  48 +--
 README_ZH.md                                       |  48 +--
 {example/flink => antlr}/pom.xml                   |  41 +-
 .../org/apache/iotdb/db/qp/strategy/SqlBase.g4     |  70 +++-
 cli/pom.xml                                        |   9 +-
 cli/src/assembly/resources/sbin/start-cli.sh       |   2 +-
 .../java/org/apache/iotdb/cli/AbstractCli.java     |  10 +
 client-py/compile.bat                              |   2 +-
 client-py/compile.sh                               |   2 +-
 client-py/readme.md                                |   2 +-
 client-py/src/client_example.py                    |  28 +-
 distribution/pom.xml                               |   3 +-
 docker/src/main/Dockerfile                         |   4 +-
 docker/src/main/Dockerfile-0.10.0                  |  41 ++
 docs/Community/Materials.md                        |  12 +
 docs/Development/ContributeGuide.md                |   6 +-
 docs/Download/README.md                            |  36 ++
 docs/SystemDesign/Client/RPC.md                    |  11 +-
 docs/SystemDesign/Connector/Spark-TsFile.md        |  22 +-
 docs/SystemDesign/DataQuery/AlignByDeviceQuery.md  | 114 +++++-
 docs/SystemDesign/DataQuery/LastQuery.md           |   2 +-
 docs/SystemDesign/QueryEngine/Planner.md           |   6 +-
 docs/SystemDesign/SchemaManager/SchemaManager.md   |  81 ++++
 .../SystemDesign/StorageEngine/DataManipulation.md |   4 +-
 docs/SystemDesign/TsFile/Format.md                 |   2 +-
 .../Client/Programming - Other Languages.md        |   2 +-
 docs/UserGuide/Client/Status Codes.md              |   2 +
 docs/UserGuide/Comparison/TSDB-Comparison.md       | 386 +++++++++++++++++++
 docs/UserGuide/Concept/Encoding.md                 |   2 +
 .../DDL Data Definition Language.md                |   7 +
 .../DML Data Manipulation Language.md              |  43 ++-
 docs/UserGuide/Operation Manual/SQL Reference.md   |  36 +-
 docs/UserGuide/Server/Config Manual.md             |   9 +
 docs/UserGuide/Server/Download.md                  |   2 +-
 docs/zh/Development/ContributeGuide.md             |   4 +-
 docs/zh/Download/README.md                         |  30 ++
 docs/zh/SystemDesign/Client/RPC.md                 |  12 +-
 docs/zh/SystemDesign/Connector/Spark-TsFile.md     |  16 +
 .../SystemDesign/DataQuery/AlignByDeviceQuery.md   | 110 +++++-
 docs/zh/SystemDesign/DataQuery/LastQuery.md        |   2 +-
 docs/zh/SystemDesign/QueryEngine/Planner.md        |   4 +-
 .../zh/SystemDesign/SchemaManager/SchemaManager.md |  80 +++-
 .../SystemDesign/StorageEngine/DataManipulation.md |   4 +-
 docs/zh/SystemDesign/TsFile/Format.md              |   2 +-
 .../Client/Programming - Other Languages.md        |   2 +-
 docs/zh/UserGuide/Client/Status Codes.md           |   2 +
 docs/zh/UserGuide/Concept/Encoding.md              |   2 +
 .../UserGuide/Ecosystem Integration/Hive TsFile.md |   6 +-
 .../DDL Data Definition Language.md                |   6 +
 .../DML Data Manipulation Language.md              |  37 +-
 .../zh/UserGuide/Operation Manual/SQL Reference.md |  34 +-
 docs/zh/UserGuide/Server/Config Manual.md          |  19 +-
 example/flink/pom.xml                              |  10 +-
 example/hadoop/pom.xml                             |   6 +-
 example/jdbc/pom.xml                               |   2 +-
 example/kafka/pom.xml                              |   2 +-
 example/mqtt/pom.xml                               |   2 +-
 example/pom.xml                                    |   2 +-
 example/rocketmq/pom.xml                           |   2 +-
 example/session/pom.xml                            |   2 +-
 .../main/java/org/apache/iotdb/SessionExample.java |   2 +-
 example/tsfile/pom.xml                             |   2 +-
 flink-iotdb-connector/pom.xml                      |   2 +-
 flink-tsfile-connector/pom.xml                     |  25 +-
 grafana/pom.xml                                    |   2 +-
 hadoop/pom.xml                                     |   9 +-
 hive-connector/pom.xml                             |  13 +-
 jdbc/pom.xml                                       |   6 +-
 jdbc/src/main/feature/feature.xml                  |   1 +
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |   2 +-
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   |  11 +-
 licenses/EDL License 1.0                           |  11 -
 pom.xml                                            |  29 +-
 server/pom.xml                                     |  40 +-
 .../resources/conf/iotdb-engine.properties         |  23 +-
 .../iotdb/db/auth/authorizer/BasicAuthorizer.java  |   2 +-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 113 ++++--
 .../org/apache/iotdb/db/conf/IoTDBConfigCheck.java |  90 ++---
 .../org/apache/iotdb/db/conf/IoTDBConstant.java    |   9 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |  48 ++-
 .../db/conf/adapter/IoTDBConfigDynamicAdapter.java |  10 +-
 .../db/conf/adapter/ManageDynamicParameters.java   |   4 +-
 .../db/conf/directories/DirectoryManager.java      |   2 +-
 .../org/apache/iotdb/db/engine/StorageEngine.java  | 110 ++++--
 .../apache/iotdb/db/engine/cache/ChunkCache.java   |   8 +-
 .../iotdb/db/engine/cache/ChunkMetadataCache.java  |   2 +-
 .../iotdb/db/engine/memtable/AbstractMemTable.java |  47 ++-
 .../apache/iotdb/db/engine/memtable/IMemTable.java |   9 +-
 .../db/engine/memtable/IWritableMemChunk.java      |  10 +-
 .../iotdb/db/engine/memtable/WritableMemChunk.java |   9 +-
 .../iotdb/db/engine/merge/recover/LogAnalyzer.java |  22 +-
 .../iotdb/db/engine/merge/task/MergeFileTask.java  |   6 +-
 .../db/engine/merge/task/MergeMultiChunkTask.java  |   3 +-
 .../iotdb/db/engine/merge/task/MergeTask.java      |  22 +-
 .../iotdb/db/engine/modification/Deletion.java     |  47 ++-
 .../io/LocalTextModificationAccessor.java          |  20 +-
 .../engine/storagegroup/StorageGroupProcessor.java | 313 +++++++++------
 .../db/engine/storagegroup/TsFileProcessor.java    |  35 +-
 .../db/engine/storagegroup/TsFileResource.java     |  50 ++-
 .../version/SimpleFileVersionController.java       |  10 +-
 .../PathException.java => ShutdownException.java}  |  23 +-
 .../db/exception/runtime/SQLParserException.java   |   7 +-
 .../org/apache/iotdb/db/metadata/MLogWriter.java   |  65 ++--
 .../org/apache/iotdb/db/metadata/MManager.java     | 400 ++++++++++++++++---
 .../java/org/apache/iotdb/db/metadata/MTree.java   | 129 +++++--
 .../apache/iotdb/db/metadata/MetadataConstant.java |  10 +-
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |   2 +-
 .../iotdb/db/metadata/mnode/StorageGroupMNode.java |   1 -
 .../apache/iotdb/db/monitor/MonitorConstants.java  |   2 +-
 .../org/apache/iotdb/db/monitor/StatMonitor.java   |  28 +-
 .../org/apache/iotdb/db/mqtt/PublishHandler.java   |  11 +-
 .../main/java/org/apache/iotdb/db/qp/Planner.java  |   3 +
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |  11 +-
 .../apache/iotdb/db/qp/executor/IPlanExecutor.java |  14 +-
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  | 388 ++++---------------
 .../org/apache/iotdb/db/qp/logical/Operator.java   |   2 +-
 .../db/qp/logical/crud/DeleteDataOperator.java     |  18 +-
 .../logical/sys/CreateSnapshotOperator.java}       |  30 +-
 .../DeletePartitionOperator.java}                  |  33 +-
 .../TracingOperator.java}                          |  25 +-
 .../apache/iotdb/db/qp/physical/PhysicalPlan.java  |  14 +-
 .../db/qp/physical/crud/DeletePartitionPlan.java   |  34 +-
 .../iotdb/db/qp/physical/crud/DeletePlan.java      |  49 ++-
 .../iotdb/db/qp/physical/crud/InsertPlan.java      | 426 ++-------------------
 .../crud/{InsertPlan.java => InsertRowPlan.java}   | 219 +++++------
 .../db/qp/physical/crud/InsertTabletPlan.java      | 214 +++++------
 .../sys/CreateSnapshotPlan.java}                   |  29 +-
 .../db/qp/physical/sys/ShowTimeSeriesPlan.java     |  18 +
 .../sys/TracingPlan.java}                          |  31 +-
 .../iotdb/db/qp/strategy/LogicalGenerator.java     | 160 ++++----
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  34 +-
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |  21 +-
 .../db/query/control/QueryResourceManager.java     |  78 +++-
 .../iotdb/db/query/control/TracingManager.java     | 138 +++++++
 .../db/query/dataset/AlignByDeviceDataSet.java     |  20 +-
 .../db/query/dataset/ShowTimeseriesDataSet.java    |  80 ++++
 .../query/dataset/groupby/GroupByFillDataSet.java  |   2 +-
 .../iotdb/db/query/executor/LastQueryExecutor.java |  38 +-
 .../iotdb/db/query/executor/QueryRouter.java       |  31 +-
 .../db/query/executor/RawDataQueryExecutor.java    |  14 +-
 .../iotdb/db/query/reader/series/SeriesReader.java |  60 ++-
 .../query/timegenerator/ServerTimeGenerator.java   |   7 +-
 .../java/org/apache/iotdb/db/service/IService.java |   3 +
 .../java/org/apache/iotdb/db/service/IoTDB.java    |  21 +-
 .../org/apache/iotdb/db/service/MQTTService.java   |   2 +
 .../java/org/apache/iotdb/db/service/Monitor.java  |   4 +-
 .../org/apache/iotdb/db/service/MonitorMBean.java  |   2 +-
 .../org/apache/iotdb/db/service/RPCService.java    | 218 ++---------
 .../apache/iotdb/db/service/RegisterManager.java   |  15 +
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 218 ++++++++---
 .../iotdb/db/service/thrift/ThriftService.java     | 150 ++++++++
 .../db/service/thrift/ThriftServiceThread.java     | 143 +++++++
 .../iotdb/db/sync/receiver/SyncServerManager.java  | 189 +++------
 .../receiver/SyncServerManagerMBean.java}          |  28 +-
 .../db/sync/receiver/transfer/SyncServiceImpl.java |  23 +-
 .../db/sync/sender/manage/SyncFileManager.java     |  27 +-
 .../iotdb/db/sync/sender/transfer/SyncClient.java  |   3 +-
 .../iotdb/db/tools/memestimation/MemEstTool.java   |   8 +-
 .../db/tools/memestimation/MemEstToolCmd.java      |   6 +-
 .../org/apache/iotdb/db/utils/CommonUtils.java     |  32 +-
 .../org/apache/iotdb/db/utils/FileLoaderUtils.java |   1 -
 .../java/org/apache/iotdb/db/utils/MemUtils.java   |   3 +
 .../org/apache/iotdb/db/utils/OpenFileNumUtil.java |   2 +-
 .../java/org/apache/iotdb/db/utils/QueryUtils.java | 160 ++++++--
 .../org/apache/iotdb/db/utils/SchemaUtils.java     |  28 +-
 .../org/apache/iotdb/db/utils/SerializeUtils.java  |  24 +-
 .../apache/iotdb/db/utils/TypeInferenceUtils.java  |   4 +-
 .../iotdb/db/utils/datastructure/TVList.java       |  35 +-
 .../writelog/manager/MultiFileLogNodeManager.java  |  57 +--
 .../iotdb/db/writelog/node/WriteLogNode.java       |   1 +
 .../iotdb/db/writelog/recover/LogReplayer.java     |  95 ++---
 .../writelog/recover/TsFileRecoverPerformer.java   |  23 +-
 .../adapter/IoTDBConfigDynamicAdapterTest.java     |  20 +-
 .../iotdb/db/engine/MetadataManagerHelper.java     |   3 +-
 .../db/engine/cache/ChunkMetadataCacheTest.java    |  15 +-
 .../iotdb/db/engine/merge/MergeOverLapTest.java    |  16 +-
 .../iotdb/db/engine/merge/MergePerfTest.java       |  11 +-
 .../iotdb/db/engine/merge/MergeTaskTest.java       |   2 +-
 .../apache/iotdb/db/engine/merge/MergeTest.java    |  43 ++-
 .../iotdb/db/engine/merge/MergeUpgradeTest.java    |   8 +-
 .../engine/modification/DeletionFileNodeTest.java  |  77 ++--
 .../db/engine/modification/DeletionQueryTest.java  | 106 ++---
 .../engine/modification/ModificationFileTest.java  |   8 +-
 .../storagegroup/FileNodeManagerBenchmark.java     |  18 +-
 .../storagegroup/StorageGroupProcessorTest.java    |  42 +-
 .../iotdb/db/engine/storagegroup/TTLTest.java      |  94 ++---
 .../engine/storagegroup/TsFileProcessorTest.java   |  10 +-
 .../db/integration/IoTDBCreateSnapshotIT.java      | 159 ++++++++
 .../iotdb/db/integration/IoTDBDeletionIT.java      |  37 ++
 .../apache/iotdb/db/integration/IoTDBLastIT.java   |  66 +++-
 .../iotdb/db/integration/IoTDBMultiSeriesIT.java   |   2 +
 .../db/integration/IoTDBRecoverUnclosedIT.java     | 270 +++++++++++++
 .../db/integration/IoTDBRemovePartitionIT.java     | 193 ++++++++++
 .../iotdb/db/integration/IoTDBRestartIT.java       | 148 ++++++-
 .../iotdb/db/integration/IoTDBSimpleQueryIT.java   | 164 +++++++-
 .../iotdb/db/integration/IoTDBTracingTest.java     |  67 ++++
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |  18 +-
 .../iotdb/db/metadata/MManagerBasicTest.java       |  32 +-
 .../iotdb/db/metadata/MManagerImproveTest.java     |  22 +-
 .../apache/iotdb/db/mqtt/PublishHandlerTest.java   |   4 +-
 .../java/org/apache/iotdb/db/qp/PlannerTest.java   |  20 +-
 .../iotdb/db/qp/plan/ConcatOptimizerTest.java      |  27 +-
 .../iotdb/db/qp/plan/LogicalPlanSmallTest.java     | 104 ++++-
 .../apache/iotdb/db/qp/plan/PhysicalPlanTest.java  |  61 ++-
 .../apache/iotdb/db/qp/plan/SerializationTest.java |  88 +++++
 .../dataset/EngineDataSetWithValueFilterTest.java  |  11 +-
 .../db/query/dataset/GroupByLevelDataSetTest.java  |   5 +-
 .../db/query/dataset/GroupByTimeDataSetTest.java   |   4 +-
 .../query/executor/GroupByEngineDataSetTest.java   |   9 +-
 .../iotdb/db/query/reader/ReaderTestHelper.java    |  11 +-
 .../reader/series/SeriesAggregateReaderTest.java   |   3 +-
 .../reader/series/SeriesReaderByTimestampTest.java |   3 +-
 .../db/query/reader/series/SeriesReaderTest.java   |   3 +-
 .../query/reader/series/SeriesReaderTestUtil.java  |  49 ++-
 .../db/sync/receiver/load/FileLoaderTest.java      |  11 +-
 .../recover/SyncReceiverLogAnalyzerTest.java       |   7 +-
 .../db/sync/sender/manage/SyncFileManagerTest.java |  27 +-
 .../sender/recover/SyncSenderLogAnalyzerTest.java  |  25 +-
 .../org/apache/iotdb/db/tools/WalCheckerTest.java  |   6 +-
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |  41 +-
 .../apache/iotdb/db/writelog/PerformanceTest.java  |  31 +-
 .../iotdb/db/writelog/WriteLogNodeManagerTest.java |   6 +-
 .../apache/iotdb/db/writelog/WriteLogNodeTest.java |  62 ++-
 .../iotdb/db/writelog/io/LogWriterReaderTest.java  |  12 +-
 .../db/writelog/io/MultiFileLogReaderTest.java     |   2 +-
 .../db/writelog/recover/DeviceStringTest.java      |  15 +-
 .../iotdb/db/writelog/recover/LogReplayerTest.java |  33 +-
 .../recover/RecoverResourceFromReaderTest.java     |  25 +-
 .../db/writelog/recover/SeqTsFileRecoverTest.java  |  31 +-
 .../writelog/recover/UnseqTsFileRecoverTest.java   |  35 +-
 service-rpc/pom.xml                                | 113 +-----
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |   3 +-
 session/pom.xml                                    |   4 +-
 .../java/org/apache/iotdb/session/Session.java     |  84 ++--
 .../iotdb/session/pool/SessionDataSetWrapper.java  |   9 +-
 .../java/org/apache/iotdb/session/SessionUT.java   |  93 ++++-
 site/iotdb-doap.rdf                                |  80 ++++
 site/pom.xml                                       |  44 ++-
 site/src/main/.vuepress/config.js                  | 202 +++++++++-
 site/src/main/.vuepress/theme/styles/index.styl    |   4 +-
 spark-iotdb-connector/pom.xml                      |   2 +-
 .../apache/iotdb/spark/db/EnvironmentUtils.java    |  28 +-
 spark-tsfile/pom.xml                               |   4 +-
 .../apache/iotdb/spark/tsfile/DefaultSource.scala  |  13 +-
 {service-rpc => thrift}/pom.xml                    |  74 +---
 {service-rpc => thrift}/rpc-changelist.md          |  13 +-
 .../src/main/thrift/cluster.thrift                 |  34 +-
 {service-rpc => thrift}/src/main/thrift/rpc.thrift |  32 +-
 .../src/main/thrift/sync.thrift                    |   0
 {service-rpc => thrift}/src/pypi/README.md         |   4 +-
 {service-rpc => thrift}/src/pypi/setup.py          |   4 +-
 tsfile/pom.xml                                     |  10 +-
 .../apache/iotdb/tsfile/compress/ICompressor.java  |  47 ++-
 .../iotdb/tsfile/compress/IUnCompressor.java       | 106 ++++-
 .../iotdb/tsfile/file/metadata/ChunkMetadata.java  |  46 ++-
 .../tsfile/file/metadata/TimeseriesMetadata.java   |  21 +-
 .../file/metadata/enums/CompressionType.java       |  10 +-
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |   2 +-
 .../org/apache/iotdb/tsfile/read/common/Chunk.java |  17 +-
 .../apache/iotdb/tsfile/read/common/TimeRange.java |  51 ++-
 .../read/controller/CachedChunkLoaderImpl.java     |   2 +-
 .../iotdb/tsfile/read/filter/TimeFilter.java       |   2 +-
 .../tsfile/read/reader/chunk/ChunkReader.java      |  29 +-
 .../read/reader/chunk/ChunkReaderByTimestamp.java  |   4 +-
 .../iotdb/tsfile/read/reader/page/PageReader.java  |  41 +-
 .../iotdb/tsfile/utils/ReadWriteIOUtils.java       |  12 +-
 .../tsfile/v1/file/metadata/ChunkMetadataV1.java   |  11 +-
 .../tsfile/v1/read/TsFileSequenceReaderForV1.java  |   2 +-
 .../tsfile/write/schema/MeasurementSchema.java     |   3 +
 ...easurementSchema.java => TimeseriesSchema.java} | 108 ++----
 .../iotdb/tsfile/write/writer/TsFileIOWriter.java  |  14 +-
 .../apache/iotdb/tsfile/compress/CompressTest.java |  32 +-
 .../compress/{SnappyTest.java => LZ4Test.java}     |  41 +-
 .../apache/iotdb/tsfile/compress/SnappyTest.java   |  21 +-
 .../iotdb/tsfile/read/common/TimeRangeTest.java    |  70 ++++
 .../iotdb/tsfile/read/reader/PageReaderTest.java   |  55 +++
 277 files changed, 7530 insertions(+), 3683 deletions(-)

diff --cc server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 5be346d,3721d5a..ad464d4
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@@ -689,12 -738,13 +738,13 @@@ public class TSServiceImpl implements T
        // Last Query should return different respond instead of the static one
        // because the query dataset and query id is different although the header of last query is same.
        return StaticResps.LAST_RESP.deepCopy();
-     } else if (plan instanceof AggregationPlan && ((AggregationPlan)plan).getLevel() >= 0) {
-       Map<String, Long> finalPaths = FilePathUtils.getPathByLevel((AggregationPlan) plan, null);
-       TSDataType type = FilePathUtils.getTSDataType((AggregationPlan) plan);
+     } else if (plan instanceof AggregationPlan && ((AggregationPlan) plan).getLevel() >= 0) {
+       Map<String, Long> finalPaths = FilePathUtils
+           .getPathByLevel(((AggregationPlan) plan).getDeduplicatedPaths(),
+               ((AggregationPlan) plan).getLevel(), null);
        for (Map.Entry<String, Long> entry : finalPaths.entrySet()) {
 -        respColumns.add("count(" + entry.getKey() + ")");
 -        columnsTypes.add(TSDataType.INT64.toString());
 +        respColumns.add(((AggregationPlan) plan).getAggregations().get(0) + "(" + entry.getKey() + ")");
 +        columnsTypes.add(type.toString());
        }
      } else {
        getWideQueryHeaders(plan, respColumns, columnsTypes);


[incubator-iotdb] 08/08: Merge branch 'master' of https://github.com/apache/incubator-iotdb into jira-768

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch jira-768
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit 879c59c906f9841f15e426883ed0375c7aee379c
Merge: 0428bd1 d8777ed
Author: HTHou <hh...@outlook.com>
AuthorDate: Tue Jul 14 17:39:22 2020 +0800

    Merge branch 'master' of https://github.com/apache/incubator-iotdb into jira-768

 docs/SystemDesign/DataQuery/QueryFundamentals.md   | 43 +++++++++++++--
 .../Concept/Data Model and Terminology.md          |  4 +-
 docs/UserGuide/Operation Manual/SQL Reference.md   | 14 ++++-
 .../System Tools/Performance Tracing Tool.md       | 61 ++++++++++++++++++++++
 .../zh/SystemDesign/DataQuery/QueryFundamentals.md | 38 +++++++++++++-
 .../Concept/Data Model and Terminology.md          |  6 +--
 .../zh/UserGuide/Operation Manual/SQL Reference.md | 18 +++++--
 .../System Tools/Performance Tracing Tool.md       | 61 ++++++++++++++++++++++
 .../apache/iotdb/hadoop/tsfile/TSFInputFormat.java | 23 +++++---
 .../iotdb/hadoop/tsfile/TSFRecordReader.java       | 27 ++++++----
 .../iotdb/hadoop/tsfile/TSFRecordWriter.java       |  3 +-
 .../org/apache/iotdb/hive/TSFHiveInputFormat.java  | 11 ++--
 .../java/org/apache/iotdb/hive/TsFileSerDe.java    | 18 +++++--
 .../org/apache/iotdb/db/conf/IoTDBConfigCheck.java | 14 ++---
 .../iotdb/db/integration/IoTDBRestartIT.java       |  7 +++
 site/src/main/.vuepress/config.js                  |  6 ++-
 16 files changed, 300 insertions(+), 54 deletions(-)