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:02 UTC

[iotdb] 01/01: add check

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