This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/disableView in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 6ab215652468ce6d1907ab533d40f9155f49b9e0 Author: Minghui Liu <[email protected]> AuthorDate: Mon May 29 15:01:32 2023 +0800 enable use view in ALIGN BY DEVICE & LAST --- .../apache/iotdb/db/mpp/plan/analyze/Analysis.java | 11 ----- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 21 ++++----- .../plan/planner/distribution/SourceRewriter.java | 55 +++++++--------------- 3 files changed, 24 insertions(+), 63 deletions(-) diff --git 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 index 58b33dffa2f..6a309e53f80 100644 --- 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 @@ -154,8 +154,6 @@ public class Analysis { // not 0 because device is the first column private Map<String, List<Integer>> deviceViewInputIndexesMap; - private Map<String, List<String>> outputDeviceToQueriedDeviceMap; - private Set<Expression> deviceViewOutputExpressions; // indicates whether DeviceView need special process when rewriteSource in DistributionPlan, @@ -438,15 +436,6 @@ public class Analysis { return deviceViewInputIndexesMap; } - public Map<String, List<String>> getOutputDeviceToQueriedDeviceMap() { - return outputDeviceToQueriedDeviceMap; - } - - public void setOutputDeviceToQueriedDeviceMap( - Map<String, List<String>> outputDeviceToQueriedDeviceMap) { - this.outputDeviceToQueriedDeviceMap = outputDeviceToQueriedDeviceMap; - } - public Set<Expression> getSourceExpressions() { return sourceExpressions; } 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 cf379e86394..85a8b33422a 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 @@ -269,6 +269,14 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> // make sure paths in logical view is fetched updateSchemaTreeByViews(analysis, schemaTree); + if (analysis.useLogicalView()) { + if (queryStatement.isAlignByDevice()) { + throw new SemanticException("Views are not supported in ALIGN BY DEVICE query yet."); + } + if (queryStatement.isLastQuery()) { + throw new SemanticException("Views are not supported in LAST query yet."); + } + } // extract global time filter from query filter and determine if there is a value filter analyzeGlobalTimeFilter(analysis, queryStatement); @@ -1212,19 +1220,6 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> deviceToOutputColumnsMap.put(deviceName, outputColumns); } - Map<String, Set<Expression>> deviceToSourceExpressions = - analysis.getDeviceToSourceExpressions(); - Map<String, List<String>> outputDeviceToQueriedDeviceMap = new LinkedHashMap<>(); - for (String deviceName : deviceToSourceExpressions.keySet()) { - Set<Expression> sourceExpressionsUnderDevice = deviceToSourceExpressions.get(deviceName); - Set<String> queriedDevices = new HashSet<>(); - for (Expression expression : sourceExpressionsUnderDevice) { - queriedDevices.add(ExpressionAnalyzer.getDeviceNameInSourceExpression(expression)); - } - outputDeviceToQueriedDeviceMap.put(deviceName, new ArrayList<>(queriedDevices)); - } - analysis.setOutputDeviceToQueriedDeviceMap(outputDeviceToQueriedDeviceMap); - Map<String, List<Integer>> deviceViewInputIndexesMap = new HashMap<>(); for (String deviceName : deviceToOutputColumnsMap.keySet()) { List<String> outputsUnderDevice = new ArrayList<>(deviceToOutputColumnsMap.get(deviceName)); diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SourceRewriter.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SourceRewriter.java index d5815d14aeb..03cc0fba950 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SourceRewriter.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SourceRewriter.java @@ -72,7 +72,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -166,53 +165,31 @@ public class SourceRewriter extends SimplePlanNodeRewriter<DistributionPlanConte List<DeviceViewSplit> deviceViewSplits = new ArrayList<>(); // Step 1: constructs DeviceViewSplit - Map<String, List<String>> outputDeviceToQueriedDeviceMap = - analysis.getOutputDeviceToQueriedDeviceMap(); for (int i = 0; i < node.getDevices().size(); i++) { - String outputDevice = node.getDevices().get(i); + String device = node.getDevices().get(i); PlanNode child = node.getChildren().get(i); - List<TRegionReplicaSet> regionReplicaSets = new ArrayList<>(); - for (String queriedDevice : outputDeviceToQueriedDeviceMap.get(outputDevice)) { - regionReplicaSets.addAll( - analysis.getPartitionInfo(queriedDevice, analysis.getGlobalTimeFilter())); - } - deviceViewSplits.add(new DeviceViewSplit(outputDevice, child, regionReplicaSets)); + List<TRegionReplicaSet> regionReplicaSets = + analysis.getPartitionInfo(device, analysis.getGlobalTimeFilter()); + deviceViewSplits.add(new DeviceViewSplit(device, child, regionReplicaSets)); relatedDataRegions.addAll(regionReplicaSets); } // Step 2: Iterate all partition and create DeviceViewNode for each region List<PlanNode> deviceViewNodeList = new ArrayList<>(); - Iterator<DeviceViewSplit> deviceViewSplitIterator = deviceViewSplits.listIterator(); - while (deviceViewSplitIterator.hasNext()) { - DeviceViewSplit deviceViewSplit = deviceViewSplitIterator.next(); - String outputDevice = deviceViewSplit.device; - - if (outputDeviceToQueriedDeviceMap.get(outputDevice).size() > 1) { - DeviceViewNode deviceViewNode = cloneDeviceViewNodeWithoutChild(node, context); - deviceViewNode.addChildDeviceNode( - outputDevice, process(deviceViewSplit.root, context).get(0)); - deviceViewNodeList.add(deviceViewNode); - deviceViewSplitIterator.remove(); - } - } - if (deviceViewSplits.size() > 0) { - for (TRegionReplicaSet regionReplicaSet : relatedDataRegions) { - List<String> devices = new ArrayList<>(); - List<PlanNode> children = new ArrayList<>(); - for (DeviceViewSplit split : deviceViewSplits) { - if (split.needDistributeTo(regionReplicaSet)) { - devices.add(split.device); - children.add(split.buildPlanNodeInRegion(regionReplicaSet, context.queryContext)); - } - } - DeviceViewNode regionDeviceViewNode = cloneDeviceViewNodeWithoutChild(node, context); - for (int i = 0; i < devices.size(); i++) { - regionDeviceViewNode.addChildDeviceNode(devices.get(i), children.get(i)); - } - if (regionDeviceViewNode.getChildren().size() > 0) { - deviceViewNodeList.add(regionDeviceViewNode); + for (TRegionReplicaSet regionReplicaSet : relatedDataRegions) { + List<String> devices = new ArrayList<>(); + List<PlanNode> children = new ArrayList<>(); + for (DeviceViewSplit split : deviceViewSplits) { + if (split.needDistributeTo(regionReplicaSet)) { + devices.add(split.device); + children.add(split.buildPlanNodeInRegion(regionReplicaSet, context.queryContext)); } } + DeviceViewNode regionDeviceViewNode = cloneDeviceViewNodeWithoutChild(node, context); + for (int i = 0; i < devices.size(); i++) { + regionDeviceViewNode.addChildDeviceNode(devices.get(i), children.get(i)); + } + deviceViewNodeList.add(regionDeviceViewNode); } if (deviceViewNodeList.size() == 1) {
