in connectors/spark-tsfile/src/main/java/org/apache/iotdb/spark/tsfile/qp/QueryProcessor.java [49:124]
public List<TSQueryPlan> generatePlans(
FilterOperator filter,
List<String> paths,
List<String> columnNames,
TsFileSequenceReader in,
Long start,
Long end)
throws QueryProcessorException, IOException {
List<TSQueryPlan> queryPlans = new ArrayList<>();
if (filter != null) {
RemoveNotOptimizer removeNot = new RemoveNotOptimizer();
filter = removeNot.optimize(filter);
DNFFilterOptimizer dnf = new DNFFilterOptimizer();
filter = dnf.optimize(filter);
// merge different query path
// e.g. or (sensor_1 > 20, sensor_1 <10, sensor_2 > 10)
// => or (or (sensor_1 > 20, sensor_1 < 10), sensor_2 > 10)
MergeSingleFilterOptimizer merge = new MergeSingleFilterOptimizer();
filter = merge.optimize(filter);
List<FilterOperator> filterOperators = splitFilter(filter);
for (FilterOperator filterOperator : filterOperators) {
SingleQuery singleQuery = constructSelectPlan(filterOperator, columnNames);
if (singleQuery != null) {
queryPlans.addAll(
new PhysicalOptimizer(columnNames).optimize(singleQuery, paths, in, start, end));
}
}
} else {
queryPlans.addAll(new PhysicalOptimizer(columnNames).optimize(null, paths, in, start, end));
}
// merge query plan
Map<List<String>, List<TSQueryPlan>> pathMap = new HashMap<>();
for (TSQueryPlan tsQueryPlan : queryPlans) {
if (pathMap.containsKey(tsQueryPlan.getPaths())) {
pathMap.get(tsQueryPlan.getPaths()).add(tsQueryPlan);
} else {
List<TSQueryPlan> plans = new ArrayList<>();
plans.add(tsQueryPlan);
pathMap.put(tsQueryPlan.getPaths(), plans);
}
}
queryPlans.clear();
for (List<TSQueryPlan> plans : pathMap.values()) {
TSQueryPlan mergePlan = null;
for (TSQueryPlan plan : plans) {
if (mergePlan == null) {
mergePlan = plan;
} else {
FilterOperator timeFilterOperator = new FilterOperator(SQLConstant.KW_OR);
List<FilterOperator> timeFilterChildren = new ArrayList<>();
timeFilterChildren.add(mergePlan.getTimeFilterOperator());
timeFilterChildren.add(plan.getTimeFilterOperator());
timeFilterOperator.setChildrenList(timeFilterChildren);
mergePlan.setTimeFilterOperator(timeFilterOperator);
FilterOperator valueFilterOperator = new FilterOperator(SQLConstant.KW_OR);
List<FilterOperator> valueFilterChildren = new ArrayList<>();
valueFilterChildren.add(mergePlan.getValueFilterOperator());
valueFilterChildren.add(plan.getValueFilterOperator());
valueFilterOperator.setChildrenList(valueFilterChildren);
mergePlan.setValueFilterOperator(valueFilterOperator);
}
}
queryPlans.add(mergePlan);
}
return queryPlans;
}