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