in connectors/spark-tsfile/src/main/java/org/apache/iotdb/spark/tsfile/qp/QueryProcessor.java [137:194]
private SingleQuery constructSelectPlan(FilterOperator filterOperator, List<String> columnNames)
throws QueryOperatorException {
FilterOperator timeFilter = null;
FilterOperator valueFilter = null;
List<FilterOperator> columnFilterOperators = new ArrayList<>();
List<FilterOperator> singleFilterList = null;
if (filterOperator.isSingle()) {
singleFilterList = new ArrayList<>();
singleFilterList.add(filterOperator);
} else if (filterOperator.getTokenIntType() == SQLConstant.KW_AND) {
// original query plan has been dealt with merge optimizer, thus all nodes with same
// path have been merged to one node
singleFilterList = filterOperator.getChildren();
}
if (singleFilterList == null) {
return null;
}
List<FilterOperator> valueList = new ArrayList<>();
for (FilterOperator child : singleFilterList) {
if (!child.isSingle()) {
valueList.add(child);
} else {
String singlePath = child.getSinglePath();
if (columnNames.contains(singlePath)) {
if (!columnFilterOperators.contains(child)) {
columnFilterOperators.add(child);
} else {
throw new QueryOperatorException(
"The same key filter has been specified more than once: " + singlePath);
}
} else {
if (SQLConstant.RESERVED_TIME.equals(child.getSinglePath())) {
if (timeFilter != null) {
throw new QueryOperatorException("time filter has been specified more than once");
}
timeFilter = child;
} else {
valueList.add(child);
}
}
}
}
if (valueList.size() == 1) {
valueFilter = valueList.get(0);
} else if (valueList.size() > 1) {
valueFilter = new FilterOperator(SQLConstant.KW_AND, false);
valueFilter.setChildOperators(valueList);
}
return new SingleQuery(columnFilterOperators, timeFilter, valueFilter);
}