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/08/29 06:43:01 UTC

[iotdb] branch lmh/aggrCheck created (now 0ab5cbc386)

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

hui pushed a change to branch lmh/aggrCheck
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 0ab5cbc386 add check

This branch includes the following new commits:

     new 0ab5cbc386 add check

The 1 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.



[iotdb] 01/01: add check

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

hui pushed a commit to branch lmh/aggrCheck
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 0ab5cbc38604d5d8a4126c84327e290865081a76
Author: Minghui Liu <li...@foxmail.com>
AuthorDate: Mon Aug 29 14:39:08 2022 +0800

    add check
---
 .../qp/logical/crud/AggregationQueryOperator.java  | 38 ++--------------------
 .../qp/logical/crud/GroupByFillQueryOperator.java  | 19 ++++++++---
 .../db/qp/logical/crud/GroupByQueryOperator.java   | 17 +++++++---
 .../iotdb/db/qp/physical/crud/AggregationPlan.java | 32 ++++++++++++++++++
 4 files changed, 62 insertions(+), 44 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java
index 8bd7d6a7a9..1d578813c0 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java
@@ -94,47 +94,15 @@ public class AggregationQueryOperator extends QueryOperator {
             ? this.generateAlignByDevicePlan(generator)
             : super.generateRawDataQueryPlan(generator, initAggregationPlan(new AggregationPlan()));
 
-    if (!verifyAllAggregationDataTypesMatched(
+    AggregationPlan aggregationPlan =
         isAlignByDevice()
             ? ((AlignByDevicePlan) plan).getAggregationPlan()
-            : (AggregationPlan) plan)) {
-      throw new LogicalOperatorException(
-          "Aggregate functions [AVG, SUM, EXTREME, MIN_VALUE, MAX_VALUE] only support numeric data types [INT32, INT64, FLOAT, DOUBLE]");
-    }
+            : (AggregationPlan) plan;
+    aggregationPlan.verifyAllAggregationDataTypesMatched();
 
     return plan;
   }
 
-  private boolean verifyAllAggregationDataTypesMatched(AggregationPlan plan) {
-    List<String> aggregations = plan.getDeduplicatedAggregations();
-    List<TSDataType> dataTypes = SchemaUtils.getSeriesTypesByPaths(plan.getDeduplicatedPaths());
-
-    for (int i = 0; i < aggregations.size(); i++) {
-      if (!verifyIsAggregationDataTypeMatched(aggregations.get(i), dataTypes.get(i))) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  private boolean verifyIsAggregationDataTypeMatched(String aggregation, TSDataType dataType) {
-    switch (aggregation.toLowerCase()) {
-      case SQLConstant.AVG:
-      case SQLConstant.SUM:
-      case SQLConstant.EXTREME:
-      case SQLConstant.MIN_VALUE:
-      case SQLConstant.MAX_VALUE:
-        return dataType.isNumeric();
-      case SQLConstant.COUNT:
-      case SQLConstant.MIN_TIME:
-      case SQLConstant.MAX_TIME:
-      case SQLConstant.FIRST_VALUE:
-      case SQLConstant.LAST_VALUE:
-      default:
-        return true;
-    }
-  }
-
   private boolean verifyAllAggregationDataTypesEqual() throws MetadataException {
     List<String> aggregations = selectComponent.getAggregationFunctions();
     if (aggregations.isEmpty()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java
index 517886d193..96f47c9f4d 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.qp.logical.crud;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
 import org.apache.iotdb.db.qp.physical.crud.AlignByDevicePlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByTimeFillPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
@@ -33,10 +34,19 @@ public class GroupByFillQueryOperator extends GroupByQueryOperator {
   @Override
   public PhysicalPlan generatePhysicalPlan(PhysicalGenerator generator)
       throws QueryProcessException {
-    return isAlignByDevice()
-        ? this.generateAlignByDevicePlan(generator)
-        : super.generateRawDataQueryPlan(
-            generator, initGroupByTimeFillPlan(new GroupByTimeFillPlan()));
+    PhysicalPlan plan =
+        isAlignByDevice()
+            ? this.generateAlignByDevicePlan(generator)
+            : super.generateRawDataQueryPlan(
+                generator, initGroupByTimeFillPlan(new GroupByTimeFillPlan()));
+
+    AggregationPlan aggregationPlan =
+        isAlignByDevice()
+            ? ((AlignByDevicePlan) plan).getAggregationPlan()
+            : (AggregationPlan) plan;
+    aggregationPlan.verifyAllAggregationDataTypesMatched();
+
+    return plan;
   }
 
   @Override
@@ -44,7 +54,6 @@ public class GroupByFillQueryOperator extends GroupByQueryOperator {
       throws QueryProcessException {
     AlignByDevicePlan alignByDevicePlan = super.generateAlignByDevicePlan(generator);
     alignByDevicePlan.setGroupByFillPlan(initGroupByTimeFillPlan(new GroupByTimeFillPlan()));
-
     return alignByDevicePlan;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java
index c78a1fc1e4..953629f5d5 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.qp.logical.crud;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
 import org.apache.iotdb.db.qp.physical.crud.AlignByDevicePlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByTimePlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
@@ -43,9 +44,18 @@ public class GroupByQueryOperator extends AggregationQueryOperator {
   @Override
   public PhysicalPlan generatePhysicalPlan(PhysicalGenerator generator)
       throws QueryProcessException {
-    return isAlignByDevice()
-        ? this.generateAlignByDevicePlan(generator)
-        : super.generateRawDataQueryPlan(generator, initGroupByTimePlan(new GroupByTimePlan()));
+    PhysicalPlan plan =
+        isAlignByDevice()
+            ? this.generateAlignByDevicePlan(generator)
+            : super.generateRawDataQueryPlan(generator, initGroupByTimePlan(new GroupByTimePlan()));
+
+    AggregationPlan aggregationPlan =
+        isAlignByDevice()
+            ? ((AlignByDevicePlan) plan).getAggregationPlan()
+            : (AggregationPlan) plan;
+    aggregationPlan.verifyAllAggregationDataTypesMatched();
+
+    return plan;
   }
 
   @Override
@@ -53,7 +63,6 @@ public class GroupByQueryOperator extends AggregationQueryOperator {
       throws QueryProcessException {
     AlignByDevicePlan alignByDevicePlan = super.generateAlignByDevicePlan(generator);
     alignByDevicePlan.setGroupByTimePlan(initGroupByTimePlan(new GroupByTimePlan()));
-
     return alignByDevicePlan;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java
index b8954ec81c..5a9502478c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/AggregationPlan.java
@@ -20,7 +20,9 @@ package org.apache.iotdb.db.qp.physical.crud;
 
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.exception.query.LogicalOperatorException;
 import org.apache.iotdb.db.mpp.plan.expression.ResultColumn;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.utils.GroupByLevelController;
 import org.apache.iotdb.db.query.aggregation.AggregateResult;
@@ -191,4 +193,34 @@ public class AggregationPlan extends RawDataQueryPlan {
     }
     return columnForDisplay;
   }
+
+  public void verifyAllAggregationDataTypesMatched() throws LogicalOperatorException {
+    List<String> aggregations = this.getDeduplicatedAggregations();
+    List<TSDataType> dataTypes = SchemaUtils.getSeriesTypesByPaths(this.getDeduplicatedPaths());
+
+    for (int i = 0; i < aggregations.size(); i++) {
+      if (!verifyIsAggregationDataTypeMatched(aggregations.get(i), dataTypes.get(i))) {
+        throw new LogicalOperatorException(
+            "Aggregate functions [AVG, SUM, EXTREME, MIN_VALUE, MAX_VALUE] only support numeric data types [INT32, INT64, FLOAT, DOUBLE]");
+      }
+    }
+  }
+
+  private boolean verifyIsAggregationDataTypeMatched(String aggregation, TSDataType dataType) {
+    switch (aggregation.toLowerCase()) {
+      case SQLConstant.AVG:
+      case SQLConstant.SUM:
+      case SQLConstant.EXTREME:
+      case SQLConstant.MIN_VALUE:
+      case SQLConstant.MAX_VALUE:
+        return dataType.isNumeric();
+      case SQLConstant.COUNT:
+      case SQLConstant.MIN_TIME:
+      case SQLConstant.MAX_TIME:
+      case SQLConstant.FIRST_VALUE:
+      case SQLConstant.LAST_VALUE:
+      default:
+        return true;
+    }
+  }
 }