in emr-dynamodb-hive/src/main/java/org/apache/hadoop/hive/dynamodb/filter/DynamoDBFilterPushdown.java [242:300]
private DynamoDBQueryFilter getDynamoDBQueryFilter(List<KeySchemaElement> schema,
List<LocalSecondaryIndexDescription> localSecondaryIndexes,
List<GlobalSecondaryIndexDescription> globalSecondaryIndexes,
Map<String, String> hiveDynamoDBMapping,
Map<String, DynamoDBFilter> filterMap) {
DynamoDBQueryFilter filter = new DynamoDBQueryFilter();
List<DynamoDBFilter> keyFiltersUseForQuery = getDynamoDBFiltersFromSchema(schema, filterMap);
DynamoDBIndexInfo indexUseForQuery = null;
if (keyFiltersUseForQuery.size() < schema.size()) {
if (keyFiltersUseForQuery.size() == 0 && globalSecondaryIndexes != null) {
// Hash key not found. Check GSIs.
indexUseForQuery = getIndexUseForQuery(
schema,
globalSecondaryIndexes.stream()
.map(index -> new DynamoDBIndexInfo(index.getIndexName(),
index.getKeySchema(), index.getProjection()))
.collect(Collectors.toList()),
hiveDynamoDBMapping,
filterMap,
keyFiltersUseForQuery);
// Don't use GSI when it is not a fully match.
// Refer to method comment for detailed explanation
if (indexUseForQuery != null
&& indexUseForQuery.getIndexSchema().size() > keyFiltersUseForQuery.size()) {
indexUseForQuery = null;
keyFiltersUseForQuery.clear();
}
} else if (keyFiltersUseForQuery.size() == 1 && localSecondaryIndexes != null) {
// Hash key found but Range key not found. Check LSIs.
indexUseForQuery = getIndexUseForQuery(
schema,
localSecondaryIndexes.stream()
.map(index -> new DynamoDBIndexInfo(index.getIndexName(),
index.getKeySchema(), index.getProjection()))
.collect(Collectors.toList()),
hiveDynamoDBMapping,
filterMap,
keyFiltersUseForQuery);
}
}
if (indexUseForQuery != null) {
log.info("Setting index name used for query: " + indexUseForQuery.getIndexName());
filter.setIndex(indexUseForQuery);
}
for (DynamoDBFilter f : keyFiltersUseForQuery) {
filter.addKeyCondition(f);
}
for (DynamoDBFilter f : filterMap.values()) {
if (!filter.getKeyConditions().containsKey(f.getColumnName())) {
filter.addScanFilter(f);
}
}
return filter;
}