This is an automated email from the ASF dual-hosted git repository.

hui pushed a commit to branch lmh/mppSelectInto
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit bbeca341d5964fc098152d7fc4857a3d6504cd32
Merge: eb96aa72b9 62b2d495b9
Author: Minghui Liu <[email protected]>
AuthorDate: Mon Oct 10 10:45:39 2022 +0800

    Merge branch 'lmh/selectInto' into lmh/mppSelectInto
    
    # Conflicts:
    #       
node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
    #       
server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
    #       
server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java

 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   | 14 +++-
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4  |  1 +
 .../apache/iotdb/commons/conf/IoTDBConstant.java   |  5 ++
 .../apache/iotdb/commons/path/MeasurementPath.java |  4 +
 .../org/apache/iotdb/commons/path/PartialPath.java | 13 +++
 .../apache/iotdb/db/mpp/plan/analyze/Analysis.java | 22 +++++
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  | 59 +++++++++++++
 .../iotdb/db/mpp/plan/parser/ASTVisitor.java       | 98 ++++++++++++++++++++--
 .../component/AlignByDeviceIntoComponent.java      | 40 +++++++++
 .../component/AlignByTimeIntoComponent.java        | 38 +++++++++
 .../plan/statement/component/IntoComponent.java    | 34 ++++++++
 .../db/mpp/plan/statement/crud/QueryStatement.java | 45 ++++++++++
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    | 20 ++---
 .../tsfile/common/constant/TsFileConstant.java     |  4 +
 14 files changed, 376 insertions(+), 21 deletions(-)

diff --cc 
node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index 292eebf642,536fb56513..80ae74638b
--- 
a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ 
b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@@ -19,8 -19,8 +19,9 @@@
  package org.apache.iotdb.commons.conf;
  
  import java.util.HashSet;
 +import java.util.Properties;
  import java.util.Set;
+ import java.util.regex.Pattern;
  
  public class IoTDBConstant {
  
diff --cc 
node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
index ec57075d68,0de9c3bd43..cf2ceee688
--- 
a/node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
+++ 
b/node-commons/src/main/java/org/apache/iotdb/commons/path/MeasurementPath.java
@@@ -58,10 -57,10 +58,14 @@@ public class MeasurementPath extends Pa
      this.measurementSchema = new MeasurementSchema(getMeasurement(), type);
    }
  
 +  public MeasurementPath(PartialPath path, TSDataType type) {
 +    this(path, new MeasurementSchema(path.getMeasurement(), type), false);
 +  }
 +
+   public MeasurementPath(PartialPath path, TSDataType type, boolean 
isUnderAlignedEntity) {
+     this(path, new MeasurementSchema(path.getMeasurement(), type), 
isUnderAlignedEntity);
+   }
+ 
    public MeasurementPath(PartialPath measurementPath, IMeasurementSchema 
measurementSchema) {
      this(measurementPath, measurementSchema, false);
    }
diff --cc 
server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
index 757bfa42fb,28639dfd4a..a5140a68e3
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
@@@ -86,6 -84,21 +86,9 @@@ public class Analysis 
    // map from grouped path name to list of input aggregation in `GROUP BY 
LEVEL` clause
    private Map<Expression, Set<Expression>> groupByLevelExpressions;
  
 -  // map from raw path to grouped path in `GROUP BY LEVEL` clause
 -  private Map<Expression, Expression> rawPathToGroupedPathMap;
 -
 -  private boolean isRawDataSource;
 -
+   // map from output column to target into path
+   private Map<String, PartialPath> outputColumnToIntoPathMap;
+ 
    
/////////////////////////////////////////////////////////////////////////////////////////////////
    // Query Analysis (used in ALIGN BY DEVICE)
    
/////////////////////////////////////////////////////////////////////////////////////////////////
@@@ -107,10 -123,13 +110,13 @@@
  
    // e.g. [s1,s2,s3] is query, but [s1, s3] exists in device1, then device1 
-> [1, 3], s1 is 1 but
    // not 0 because device is the first column
 -  private Map<String, List<Integer>> deviceToMeasurementIndexesMap;
 +  private Map<String, List<Integer>> deviceViewInputIndexesMap;
  
 -  private Map<String, Boolean> deviceToIsRawDataSource;
 +  private Set<Expression> deviceViewOutputExpressions;
  
+   // map from device name to target into path of each output column
+   private Map<String, Map<String, PartialPath>> deviceToIntoPathMap;
+ 
    
/////////////////////////////////////////////////////////////////////////////////////////////////
    // Query Common Analysis (above DeviceView)
    
/////////////////////////////////////////////////////////////////////////////////////////////////
@@@ -396,11 -464,27 +402,27 @@@
      this.expressionTypes.putAll(types);
    }
  
 -  public List<Pair<Expression, String>> getOutputExpressions() {
 -    return outputExpressions;
 +  public Set<Expression> getDeviceViewOutputExpressions() {
 +    return deviceViewOutputExpressions;
    }
  
 -  public void setOutputExpressions(List<Pair<Expression, String>> 
outputExpressions) {
 -    this.outputExpressions = outputExpressions;
 +  public void setDeviceViewOutputExpressions(Set<Expression> 
deviceViewOutputExpressions) {
 +    this.deviceViewOutputExpressions = deviceViewOutputExpressions;
    }
+ 
+   public Map<String, PartialPath> getOutputColumnToIntoPathMap() {
+     return outputColumnToIntoPathMap;
+   }
+ 
+   public void setOutputColumnToIntoPathMap(Map<String, PartialPath> 
outputColumnToIntoPathMap) {
+     this.outputColumnToIntoPathMap = outputColumnToIntoPathMap;
+   }
+ 
+   public Map<String, Map<String, PartialPath>> getDeviceToIntoPathMap() {
+     return deviceToIntoPathMap;
+   }
+ 
+   public void setDeviceToIntoPathMap(Map<String, Map<String, PartialPath>> 
deviceToIntoPathMap) {
+     this.deviceToIntoPathMap = deviceToIntoPathMap;
+   }
  }
diff --cc 
server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index b973187067,baa7a465e3..d0d32de590
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@@ -101,18 -93,8 +102,19 @@@ import org.apache.iotdb.db.mpp.plan.sta
  import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
  import org.apache.iotdb.db.mpp.plan.statement.sys.ShowVersionStatement;
  import 
org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeSinkTypeStatement;
 +import org.apache.iotdb.db.query.control.SessionManager;
 +import org.apache.iotdb.db.utils.FileLoaderUtils;
 +import org.apache.iotdb.db.utils.TimePartitionUtils;
 +import org.apache.iotdb.rpc.TSStatusCode;
 +import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
 +import org.apache.iotdb.tsfile.file.header.ChunkHeader;
 +import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
 +import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
 +import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
+ import org.apache.iotdb.db.qp.constant.SQLConstant;
  import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 +import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 +import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
  import org.apache.iotdb.tsfile.read.filter.GroupByFilter;
  import org.apache.iotdb.tsfile.read.filter.GroupByMonthFilter;
  import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@@ -984,6 -989,78 +988,61 @@@ public class AnalyzeVisitor extends Sta
      return partitionFetcher.getDataPartition(sgNameToQueryParamsMap);
    }
  
 -  private OrderByParameter analyzeOrderBy(QueryStatement queryStatement) {
 -    return new OrderByParameter(queryStatement.getSortItemList());
 -  }
 -
 -  private void analyzeExpression(Analysis analysis, Expression expression) {
 -    ExpressionTypeAnalyzer.analyzeExpression(analysis, expression);
 -  }
 -
+   private void analyzeInto(Analysis analysis, List<Pair<Expression, String>> 
outputExpressions) {
+     Map<String, PartialPath> outputColumnToIntoPathMap = new HashMap<>();
+     List<Expression> outputColumns =
 -        outputExpressions.stream()
 -            .map(Pair::getLeft)
 -            .collect(Collectors.toCollection(ArrayList::new));
++            outputExpressions.stream()
++                    .map(Pair::getLeft)
++                    .collect(Collectors.toCollection(ArrayList::new));
+     AlignByTimeIntoComponent intoComponent =
 -        ((AlignByTimeIntoComponent) ((QueryStatement) 
analysis.getStatement()).getIntoComponent());
++            ((AlignByTimeIntoComponent) ((QueryStatement) 
analysis.getStatement()).getIntoComponent());
+     List<PartialPath> intoPaths = intoComponent.getIntoPaths();
+     boolean isAligned = intoComponent.isAligned();
+ 
+     boolean isAllRawSeriesQuery = checkIsAllRawSeriesQuery(outputColumns);
+     if (isAllRawSeriesQuery) {
+       if (intoPaths.size() != outputColumns.size()) {
+         throw new SemanticException(
 -            "select into: the number of source paths and the number of target 
paths should be the same.");
++                "select into: the number of source paths and the number of 
target paths should be the same.");
+       }
+       if (intoPaths.size() > new HashSet<>(intoPaths).size()) {
+         throw new SemanticException(
 -            "select into: target paths in into clause should be different.");
++                "select into: target paths in into clause should be 
different.");
+       }
+       for (int i = 0; i < outputColumns.size(); i++) {
+         outputColumnToIntoPathMap.put(
 -            outputColumns.get(i).toString(),
 -            constructIntoPath(analysis, outputColumns.get(i), 
intoPaths.get(i), isAligned));
++                outputColumns.get(i).toString(),
++                constructIntoPath(analysis, outputColumns.get(i), 
intoPaths.get(i), isAligned));
+       }
+     } else {
+ 
+     }
+     analysis.setOutputColumnToIntoPathMap(outputColumnToIntoPathMap);
+   }
+ 
+   private PartialPath constructIntoPath(
 -      Analysis analysis, Expression outputColumn, PartialPath path, boolean 
isAligned) {
++          Analysis analysis, Expression outputColumn, PartialPath path, 
boolean isAligned) {
+     if (!path.startWith(SQLConstant.ROOT)) {
+       throw new SemanticException("select into: ");
+     }
+     if (path.containNode(DOUBLE_COLONS)) {
+       throw new SemanticException("select into: ");
+     }
+     if (LEVELED_PATH_TEMPLATE_PATTERN.matcher(path.getFullPath()).find()) {
+       throw new SemanticException("select into: ");
+     }
+     return new MeasurementPath(path, analysis.getType(outputColumn), 
isAligned);
+   }
+ 
+   private void analyzeInto(
 -      Analysis analysis,
 -      List<Pair<Expression, String>> outputExpressions,
 -      Map<String, Set<String>> deviceToMeasurementsMap) {
++          Analysis analysis,
++          List<Pair<Expression, String>> outputExpressions,
++          Map<String, Set<String>> deviceToMeasurementsMap) {
+     Map<String, Map<String, PartialPath>> deviceToIntoPathMap = new 
HashMap<>();
+ 
+     analysis.setDeviceToIntoPathMap(deviceToIntoPathMap);
+   }
+ 
 -  private boolean checkIsAllRawSeriesQuery(List<Expression> expressions) {
 -    for (Expression expression : expressions) {
 -      if (!(expression instanceof TimeSeriesOperand)) {
 -        return true;
 -      }
 -    }
 -    return false;
 -  }
 -
    /**
     * Check datatype consistency in ALIGN BY DEVICE.
     *

Reply via email to