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. *
