in emr-dynamodb-hive/src/main/java/org/apache/hadoop/hive/dynamodb/filter/DynamoDBFilterPushdown.java [88:134]
public DynamoDBQueryFilter predicateToDynamoDBFilter(List<KeySchemaElement> schema,
List<LocalSecondaryIndexDescription> localSecondaryIndexes,
List<GlobalSecondaryIndexDescription> globalSecondaryIndexes,
Map<String, String> hiveDynamoDBMapping,
Map<String, String> hiveTypeMapping,
ExprNodeDesc predicate) {
List<IndexSearchCondition> searchConditions = getGenericSearchConditions(hiveTypeMapping,
predicate);
if (searchConditions.isEmpty()) {
return null;
}
Map<String, DynamoDBFilter> filterMap = new HashMap<>();
DynamoDBFilterFactory factory = new DynamoDBFilterFactory();
// The search conditions are supposed to be unique at this point, so not
// prioritizing them
for (IndexSearchCondition condition : searchConditions) {
String hiveColumnName = condition.getColumnDesc().getColumn();
String dynamoDBColumnName = hiveDynamoDBMapping.get(hiveColumnName);
DynamoDBFilterOperator op =
DynamoDBFilterOperator.getFilterOperationFromHiveClass(condition.getComparisonOp());
DynamoDBFilter filter =
factory.getFilter(op, dynamoDBColumnName, hiveTypeMapping.get(hiveColumnName), condition);
if (filterMap.containsKey(dynamoDBColumnName)) {
// We have special case code for DynamoDB filter BETWEEN because
// it does not directly map to any Hive predicate
DynamoDBFilter existingFilter = filterMap.get(dynamoDBColumnName);
if (isBetweenFilter(op, existingFilter.getOperator())) {
filterMap.put(dynamoDBColumnName, getBetweenFilter(filter, existingFilter));
} else {
throw new RuntimeException("Found two filters for same column: " + dynamoDBColumnName
+ " Filter 1: " + op + " Filter 2: " + existingFilter.getOperator());
}
} else {
filterMap.put(dynamoDBColumnName, filter);
}
}
return getDynamoDBQueryFilter(schema,
localSecondaryIndexes,
globalSecondaryIndexes,
hiveDynamoDBMapping,
filterMap);
}