private DynamoDBQueryFilter getDynamoDBQueryFilter()

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