This is an automated email from the ASF dual-hosted git repository.
rong pushed a commit to branch iotdb-1022-v2
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/iotdb-1022-v2 by this push:
new 49d19e7 fix tests for align by device with as clauses
49d19e7 is described below
commit 49d19e7cd9f235dcf0c9bf1bf8b77900c8dd70b1
Author: SteveYurongSu <[email protected]>
AuthorDate: Tue May 18 16:10:06 2021 +0800
fix tests for align by device with as clauses
---
.../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 | 5 +++--
server/pom.xml | 6 ++++++
.../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 3 +++
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 24 ++++++++++++++--------
.../iotdb/db/query/expression/ResultColumn.java | 4 ++++
.../query/expression/unary/FunctionExpression.java | 6 ++++--
6 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
index f846956..fde4575 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
@@ -115,12 +115,13 @@ resultColumn
;
expression
- : (PLUS | MINUS) unary=expression
+ : LR_BRACKET unary=expression RR_BRACKET
+ | (PLUS | MINUS) unary=expression
| leftExpression=expression (STAR | DIV | MOD) rightExpression=expression
| leftExpression=expression (PLUS | MINUS) rightExpression=expression
| functionName=suffixPath LR_BRACKET expression (COMMA expression)*
functionAttribute* RR_BRACKET
| suffixPath
- | LR_BRACKET unary=expression RR_BRACKET
+ | literal=SINGLE_QUOTE_STRING_LITERAL
;
functionAttribute
diff --git a/server/pom.xml b/server/pom.xml
index 08944e2..4d0f08d 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -213,6 +213,12 @@
<version>4.3.5</version>
<scope>compile</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.calcite</groupId>
+ <artifactId>calcite-linq4j</artifactId>
+ <version>1.10.0</version>
+ <scope>compile</scope>
+ </dependency>
</dependencies>
<build>
<plugins>
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
index e327bc1..3595166 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
@@ -1048,6 +1048,9 @@ public class IoTDBSqlVisitor extends
SqlBaseBaseVisitor<Operator> {
if (context.suffixPath() != null) {
return new TimeSeriesOperand(parseSuffixPath(context.suffixPath()));
}
+ if (context.literal != null) {
+ return new TimeSeriesOperand(new PartialPath(new String[]
{context.literal.getText()}));
+ }
if (context.unary != null) {
return context.MINUS() != null
? new MinusExpression(parseExpression(context.expression(0)))
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 6b3e691..9bfc7e1 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
@@ -122,6 +122,10 @@ import
org.apache.iotdb.db.qp.physical.sys.ShowTriggersPlan;
import org.apache.iotdb.db.qp.physical.sys.StartTriggerPlan;
import org.apache.iotdb.db.qp.physical.sys.StopTriggerPlan;
import org.apache.iotdb.db.qp.physical.sys.TracingPlan;
+import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.db.query.expression.ResultColumn;
+import org.apache.iotdb.db.query.expression.unary.FunctionExpression;
+import org.apache.iotdb.db.query.expression.unary.TimeSeriesOperand;
import org.apache.iotdb.db.service.IoTDB;
import org.apache.iotdb.db.utils.SchemaUtils;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -630,7 +634,7 @@ public class PhysicalGenerator {
List<PartialPath> prefixPaths =
queryOperator.getFromOperator().getPrefixPaths();
// remove stars in fromPaths and get deviceId with deduplication
List<PartialPath> devices =
this.removeStarsInDeviceWithUnique(prefixPaths);
- List<PartialPath> suffixPaths =
queryOperator.getSelectOperator().getPaths();
+ List<ResultColumn> resultColumns =
queryOperator.getSelectOperator().getResultColumns();
List<String> originAggregations =
queryOperator.getSelectOperator().getAggregationFunctions();
// to record result measurement columns
@@ -645,8 +649,13 @@ public class PhysicalGenerator {
Map<String, TSDataType> measurementDataTypeMap = new HashMap<>();
List<PartialPath> paths = new ArrayList<>();
- for (int i = 0; i < suffixPaths.size(); i++) { // per suffix in SELECT
- PartialPath suffixPath = suffixPaths.get(i);
+ for (int i = 0; i < resultColumns.size(); i++) { // per suffix in SELECT
+ ResultColumn resultColumn = resultColumns.get(i);
+ Expression suffixExpression = resultColumn.getExpression();
+ PartialPath suffixPath =
+ suffixExpression instanceof TimeSeriesOperand
+ ? ((TimeSeriesOperand) suffixExpression).getPath()
+ : (((FunctionExpression) suffixExpression).getPaths().get(0));
// to record measurements in the loop of a suffix path
Set<String> measurementSetOfGivenSuffix = new LinkedHashSet<>();
@@ -659,24 +668,23 @@ public class PhysicalGenerator {
}
for (PartialPath device : devices) { // per device in FROM after
deduplication
-
PartialPath fullPath = device.concatPath(suffixPath);
try {
// remove stars in SELECT to get actual paths
List<PartialPath> actualPaths = getMatchedTimeseries(fullPath);
- if (suffixPath.isTsAliasExists()) {
+ if (resultColumn.hasAlias()) {
if (actualPaths.size() == 1) {
String columnName = actualPaths.get(0).getMeasurement();
if (originAggregations != null && !originAggregations.isEmpty())
{
measurementAliasMap.put(
- originAggregations.get(i) + "(" + columnName + ")",
suffixPath.getTsAlias());
+ originAggregations.get(i) + "(" + columnName + ")",
resultColumn.getAlias());
} else {
- measurementAliasMap.put(columnName, suffixPath.getTsAlias());
+ measurementAliasMap.put(columnName, resultColumn.getAlias());
}
} else if (actualPaths.size() >= 2) {
throw new QueryProcessException(
"alias '"
- + suffixPath.getTsAlias()
+ + resultColumn.getAlias()
+ "' can only be matched with one time series");
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
b/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
index 52b99c4..9e9fe81 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/expression/ResultColumn.java
@@ -60,6 +60,10 @@ public class ResultColumn {
throws LogicalOptimizeException {
List<Expression> resultExpressions = new ArrayList<>();
expression.removeWildcards(wildcardsRemover, resultExpressions);
+ if (hasAlias() && 1 < resultExpressions.size()) {
+ throw new LogicalOptimizeException(
+ String.format("alias '%s' can only be matched with one time series",
alias));
+ }
for (Expression resultExpression : resultExpressions) {
resultColumns.add(new ResultColumn(resultExpression, alias));
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
index b05a6ec..dfc2bc1 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
@@ -147,12 +147,14 @@ public class FunctionExpression extends Expression {
return dataTypes;
}
- // TODO: remove this method
public List<PartialPath> getPaths() {
if (paths == null) {
paths = new ArrayList<>();
for (Expression expression : expressions) {
- paths.add(((TimeSeriesOperand) expression).getPath());
+ paths.add(
+ expression instanceof TimeSeriesOperand
+ ? ((TimeSeriesOperand) expression).getPath()
+ : null);
}
}
return paths;