blob: 6eb323b0789ac9daf40032b68a9935cb9002470f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.db.mpp.plan.planner;
import org.apache.iotdb.commons.path.AlignedPath;
import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.SimplePlanVisitor;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.AggregationNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.GroupByLevelNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SlidingWindowAggregationNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.AlignedSeriesAggregationScanNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.SeriesAggregationScanNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.AggregationDescriptor;
import java.util.List;
public class SubPlanTypeExtractor {
public static TypeProvider extractor(PlanNode root, TypeProvider allTypes) {
TypeProvider typeProvider = new TypeProvider();
root.accept(new Visitor(typeProvider, allTypes), null);
return typeProvider;
}
private static class Visitor extends SimplePlanVisitor<Void> {
private final TypeProvider typeProvider;
private final TypeProvider allTypes;
public Visitor(TypeProvider typeProvider, TypeProvider allTypes) {
this.typeProvider = typeProvider;
this.allTypes = allTypes;
}
@Override
public Void visitPlan(PlanNode node, Void context) {
node.getOutputColumnNames()
.forEach(name -> typeProvider.setType(name, allTypes.getType(name)));
for (PlanNode source : node.getChildren()) {
source.accept(this, context);
}
return null;
}
@Override
public Void visitSeriesAggregationScan(SeriesAggregationScanNode node, Void context) {
String sourcePath = node.getSeriesPath().getFullPath();
typeProvider.setType(sourcePath, allTypes.getType(sourcePath));
return visitPlan(node, context);
}
@Override
public Void visitAlignedSeriesAggregationScan(
AlignedSeriesAggregationScanNode node, Void context) {
AlignedPath alignedPath = node.getAlignedPath();
for (int i = 0; i < alignedPath.getColumnNum(); i++) {
String sourcePath = alignedPath.getPathWithMeasurement(i).getFullPath();
typeProvider.setType(sourcePath, allTypes.getType(sourcePath));
}
return visitPlan(node, context);
}
@Override
public Void visitAggregation(AggregationNode node, Void context) {
updateTypeProviderByAggregationDescriptor(node.getAggregationDescriptorList());
return visitPlan(node, context);
}
@Override
public Void visitSlidingWindowAggregation(SlidingWindowAggregationNode node, Void context) {
updateTypeProviderByAggregationDescriptor(node.getAggregationDescriptorList());
return visitPlan(node, context);
}
@Override
public Void visitGroupByLevel(GroupByLevelNode node, Void context) {
updateTypeProviderByAggregationDescriptor(node.getGroupByLevelDescriptors());
return visitPlan(node, context);
}
private void updateTypeProviderByAggregationDescriptor(
List<? extends AggregationDescriptor> aggregationDescriptorList) {
aggregationDescriptorList.stream()
.flatMap(aggregationDescriptor -> aggregationDescriptor.getInputExpressions().stream())
.forEach(
expression -> {
String expressionStr = expression.toString();
typeProvider.setType(expressionStr, allTypes.getType(expressionStr));
});
}
}
}