public DynamoDBQueryFilter predicateToDynamoDBFilter()

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