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;

Reply via email to