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 2023/05/14 15:09:28 UTC
[iotdb] 02/04: add semantic check
This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch lmh/forecast
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 4d58cbbb6810d380308d60c779b3f1425a1569ab
Author: liuminghui233 <54...@qq.com>
AuthorDate: Sun May 14 22:18:29 2023 +0800
add semantic check
---
.../db/mpp/plan/analyze/ExpressionAnalyzer.java | 2 ++
.../mpp/plan/statement/component/ResultColumn.java | 3 +-
.../plan/statement/component/SelectComponent.java | 10 +++++-
.../db/mpp/plan/statement/crud/QueryStatement.java | 37 ++++++++++++++++++++--
4 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
index 7b31aad6b9d..f4bd391535c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
@@ -187,6 +187,8 @@ public class ExpressionAnalyzer {
}
}
return ResultColumn.ColumnType.AGGREGATION;
+ } else if (((FunctionExpression) expression).isModelInferenceFunction()) {
+ return ResultColumn.ColumnType.MODEL_INFERENCE;
} else {
ResultColumn.ColumnType checkedType = null;
int lastCheckedIndex = 0;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/ResultColumn.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/ResultColumn.java
index ae23d5e3d5b..ab535116926 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/ResultColumn.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/ResultColumn.java
@@ -121,6 +121,7 @@ public class ResultColumn extends StatementNode {
public enum ColumnType {
RAW,
AGGREGATION,
- CONSTANT
+ CONSTANT,
+ MODEL_INFERENCE
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/SelectComponent.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/SelectComponent.java
index 8961affe57f..decdea7f0c8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/SelectComponent.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/SelectComponent.java
@@ -36,6 +36,8 @@ public class SelectComponent extends StatementNode {
private boolean hasBuiltInAggregationFunction = false;
+ private boolean hasModelInferenceFunction = false;
+
protected List<ResultColumn> resultColumns = new ArrayList<>();
private Map<String, Expression> aliasToColumnMap;
@@ -48,15 +50,21 @@ public class SelectComponent extends StatementNode {
return zoneId;
}
- public boolean isHasBuiltInAggregationFunction() {
+ public boolean hasBuiltInAggregationFunction() {
return hasBuiltInAggregationFunction;
}
+ public boolean hasModelInferenceFunction() {
+ return hasModelInferenceFunction;
+ }
+
public void addResultColumn(ResultColumn resultColumn) {
resultColumns.add(resultColumn);
ResultColumn.ColumnType columnType = resultColumn.getColumnType();
if (columnType == ResultColumn.ColumnType.AGGREGATION) {
hasBuiltInAggregationFunction = true;
+ } else if (columnType == ResultColumn.ColumnType.MODEL_INFERENCE) {
+ hasModelInferenceFunction = true;
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java
index c2cfae97f0d..4f02cc41a77 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/QueryStatement.java
@@ -274,7 +274,7 @@ public class QueryStatement extends Statement {
}
public boolean isAggregationQuery() {
- return selectComponent.isHasBuiltInAggregationFunction();
+ return selectComponent.hasBuiltInAggregationFunction();
}
public boolean isGroupByLevel() {
@@ -407,8 +407,7 @@ public class QueryStatement extends Statement {
List<SortItem> sortItems = getSortItemList();
List<SortItem> newSortItems = new ArrayList<>();
int expressionIndex = 0;
- for (int i = 0; i < sortItems.size(); i++) {
- SortItem sortItem = sortItems.get(i);
+ for (SortItem sortItem : sortItems) {
SortItem newSortItem =
new SortItem(sortItem.getSortKey(), sortItem.getOrdering(), sortItem.getNullOrdering());
if (sortItem.isExpression()) {
@@ -448,7 +447,39 @@ public class QueryStatement extends Statement {
return rowOffset > 0;
}
+ public boolean isModelInferenceQuery() {
+ return selectComponent.hasModelInferenceFunction();
+ }
+
public void semanticCheck() {
+ if (isModelInferenceQuery()) {
+ if (selectComponent.getResultColumns().size() > 1) {
+ throw new SemanticException("");
+ }
+
+ Expression modelInferenceExpression =
+ selectComponent.getResultColumns().get(0).getExpression();
+ if (!(modelInferenceExpression instanceof FunctionExpression
+ && ((FunctionExpression) modelInferenceExpression).isModelInferenceFunction())) {
+ throw new SemanticException("");
+ }
+ if (ExpressionAnalyzer.searchAggregationExpressions(modelInferenceExpression).size() > 0) {
+ throw new SemanticException("");
+ }
+
+ if (hasHaving()
+ || isGroupBy()
+ || isGroupByLevel()
+ || isGroupByTag()
+ || isAlignByDevice()
+ || isLastQuery()
+ || seriesLimit > 0
+ || seriesOffset > 0
+ || isSelectInto()) {
+ throw new SemanticException("");
+ }
+ }
+
if (isAggregationQuery()) {
if (disableAlign()) {
throw new SemanticException("AGGREGATION doesn't support disable align clause.");