private Collection<OAuth2AccessToken> loadTokensByClientAndUserIndex(
      Map<String, Condition> keyCondition, boolean filterOutNullUsers) {
    List<OAuth2AccessToken> accessTokens = new ArrayList<OAuth2AccessToken>();

    List<String> accessTokenIds = null;
    try {
      accessTokenIds =
          dynamoDBTemplate.query(
              schema.getAccessTableName(),
              schema.getAccessIndexClientIdAndUserName(),
              keyCondition, //
              new ObjectExtractor<String>() {

                public String extract(Map<String, AttributeValue> values) {
                  return values.get(schema.getAccessColumnTokenId()).getS();
                }
              },
              schema.getAccessColumnTokenId());

      List<Map<String, AttributeValue>> keys =
          new ArrayList<Map<String, AttributeValue>>(accessTokenIds.size());
      for (String accessTokenId : accessTokenIds) {
        keys.add(
            Collections.singletonMap(
                schema.getAccessColumnTokenId(), new AttributeValue(accessTokenId)));
      }
      if (filterOutNullUsers) {
        accessTokens =
            dynamoDBTemplate.batchGet(
                schema.getAccessTableName(), //
                new KeysAndAttributes()
                    .withKeys(keys)
                    .withConsistentRead(true)
                    .withAttributesToGet(
                        schema.getAccessColumnTokenId(),
                        schema.getAccessColumnToken(),
                        schema.getAccessColumnIsNullUser()), //
                new NonNullUserSafeAccessTokenExtractor());
      } else {
        accessTokens =
            dynamoDBTemplate.batchGet(
                schema.getAccessTableName(), //
                new KeysAndAttributes()
                    .withKeys(keys)
                    .withConsistentRead(true)
                    .withAttributesToGet(
                        schema.getAccessColumnTokenId(), schema.getAccessColumnToken()), //
                new SafeAccessTokenExtractor());
      }
    } catch (EmptyResultDataAccessException e) {
      if (LOG.isInfoEnabled()) {
        LOG.info("Failed to find access token for " + keyCondition.toString());
      }
    }
    accessTokens = removeNulls(accessTokens);

    return accessTokens;
  }