private List prioritizeSearchConditions()

in emr-dynamodb-hive/src/main/java/org/apache/hadoop/hive/dynamodb/filter/DynamoDBFilterPushdown.java [181:223]


  private List<IndexSearchCondition> prioritizeSearchConditions(List<IndexSearchCondition>
      searchConditions) {
    Map<String, IndexSearchCondition> priorityFilterMap = new HashMap<>();
    Map<String, List<IndexSearchCondition>> completeFilterMap = new HashMap<>();

    for (IndexSearchCondition condition : searchConditions) {
      String name = condition.getColumnDesc().getColumn();
      DynamoDBFilterOperator op =
          DynamoDBFilterOperator.getFilterOperationFromHiveClass(condition.getComparisonOp());
      if (priorityFilterMap.containsKey(name)) {
        if (DynamoDBFilterOperator.getFilterOperationFromHiveClass(priorityFilterMap.get(name)
            .getComparisonOp()).isLowerPrecedence(op)) {
          priorityFilterMap.put(name, condition);
        }
      } else {
        completeFilterMap.put(name, new ArrayList<IndexSearchCondition>());
        priorityFilterMap.put(name, condition);
      }
      completeFilterMap.get(name).add(condition);
    }

    List<IndexSearchCondition> finalSearchConditions = new ArrayList<>();
    finalSearchConditions.addAll(priorityFilterMap.values());

    // Special case code for BETWEEN filter as it does not directly map to a
    // Hive filter

    for (Map.Entry<String, List<IndexSearchCondition>> entry : completeFilterMap.entrySet()) {
      for (IndexSearchCondition condition : entry.getValue()) {
        DynamoDBFilterOperator op1 =
            DynamoDBFilterOperator.getFilterOperationFromHiveClass(condition.getComparisonOp());
        DynamoDBFilterOperator op2 =
            DynamoDBFilterOperator.getFilterOperationFromHiveClass(
                priorityFilterMap.get(entry.getKey()).getComparisonOp()
            );
        if (isBetweenFilter(op1, op2)) {
          finalSearchConditions.add(condition);
        }
      }
    }

    return finalSearchConditions;
  }