public List generatePlans()

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;
  }