This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/modifySchemaTreeInterface in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 8861be4c0792f520aec55ee076c8fdbbfc2ae631 Author: Minghui Liu <[email protected]> AuthorDate: Thu Dec 15 19:17:17 2022 +0800 refactor analyze last --- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 76 +++++++--------------- 1 file changed, 22 insertions(+), 54 deletions(-) diff --git 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 index 81910ef650..5a7f1ef40e 100644 --- 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 @@ -144,6 +144,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.TimeZone; +import java.util.TreeSet; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkState; @@ -229,7 +230,14 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> throw new SemanticException("Only time filters are supported in LAST query"); } analyzeOrderBy(analysis, queryStatement); - return analyzeLast(analysis, schemaTree.getAllMeasurement(), schemaTree); + analyzeLastSource(analysis, queryStatement, schemaTree); + + analysis.setRespDatasetHeader(DatasetHeaderFactory.getLastQueryHeader()); + + // fetch partition information + analyzeDataPartition(analysis, queryStatement, schemaTree); + + return analysis; } List<Pair<Expression, String>> outputExpressions; @@ -328,9 +336,10 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> analysis.setHasValueFilter(hasValueFilter); } - private Analysis analyzeLast( - Analysis analysis, List<MeasurementPath> allSelectedPath, ISchemaTree schemaTree) { + private void analyzeLastSource( + Analysis analysis, QueryStatement queryStatement, ISchemaTree schemaTree) { Set<Expression> sourceExpressions; + List<SortItem> sortItemList = analysis.getMergeOrderParameter().getSortItemList(); if (sortItemList.size() > 0) { checkState( @@ -338,61 +347,20 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> "Last queries only support sorting by timeseries now."); boolean isAscending = sortItemList.get(0).getOrdering() == Ordering.ASC; sourceExpressions = - allSelectedPath.stream() - .map(TimeSeriesOperand::new) - .sorted( - (o1, o2) -> - isAscending - ? o1.getExpressionString().compareTo(o2.getExpressionString()) - : o2.getExpressionString().compareTo(o1.getExpressionString())) - .collect(Collectors.toCollection(LinkedHashSet::new)); + new TreeSet<>( + (e1, e2) -> + isAscending + ? e1.toString().compareTo(e2.toString()) + : e2.toString().compareTo(e1.toString())); } else { - sourceExpressions = - allSelectedPath.stream() - .map(TimeSeriesOperand::new) - .collect(Collectors.toCollection(LinkedHashSet::new)); + sourceExpressions = new LinkedHashSet<>(); } - analysis.setSourceExpressions(sourceExpressions); - - analysis.setRespDatasetHeader(DatasetHeaderFactory.getLastQueryHeader()); - - Set<String> deviceSet = - allSelectedPath.stream().map(MeasurementPath::getDevice).collect(Collectors.toSet()); - - Pair<List<TTimePartitionSlot>, Pair<Boolean, Boolean>> res = - getTimePartitionSlotList(analysis.getGlobalTimeFilter()); - - DataPartition dataPartition; - - // there is no satisfied time range - if (res.left.isEmpty() && !res.right.left) { - dataPartition = - new DataPartition( - Collections.emptyMap(), - CONFIG.getSeriesPartitionExecutorClass(), - CONFIG.getSeriesPartitionSlotNum()); - } else { - Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap = new HashMap<>(); - for (String devicePath : deviceSet) { - DataPartitionQueryParam queryParam = - new DataPartitionQueryParam(devicePath, res.left, res.right.left, res.right.right); - sgNameToQueryParamsMap - .computeIfAbsent(schemaTree.getBelongedDatabase(devicePath), key -> new ArrayList<>()) - .add(queryParam); - } - - if (res.right.left || res.right.right) { - dataPartition = - partitionFetcher.getDataPartitionWithUnclosedTimeRange(sgNameToQueryParamsMap); - } else { - dataPartition = partitionFetcher.getDataPartition(sgNameToQueryParamsMap); - } + for (ResultColumn resultColumn : queryStatement.getSelectComponent().getResultColumns()) { + sourceExpressions.addAll( + ExpressionAnalyzer.removeWildcardInExpression(resultColumn.getExpression(), schemaTree)); } - - analysis.setDataPartitionInfo(dataPartition); - - return analysis; + analysis.setSourceExpressions(sourceExpressions); } private Map<Integer, List<Pair<Expression, String>>> analyzeSelect(
