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