Условный переход на основе метки времени в DynamoDB с использованием картографа DynamoDB Java - PullRequest
0 голосов
/ 19 марта 2020

У меня есть таблица с lastModificationTimestamp:

@DynamoDBTable(tableName = Association.TABLE_NAME)
public class Association {
    ...
    @DynamoDBAttribute
    Long lastModificationTimestamp;
}

Я хочу сохранить запись условно, то есть, учитывая запись r:

  • Если нет записи с PK r, вставьте r;
  • Если существует запись s с тем же PK, что и r, и s.lastModificationTimestamp >= r.lastModificationTimestamp, ничего не делать;
  • Если существует запись s с тем же PK, что и r, и s.lastModificationTimestamp < r.lastModificationTimestamp, перезаписать s с помощью r.

Я хочу сделать это, используя DynamoDBMapper. У меня сложилось впечатление, что это можно сделать с помощью условной проверки всего за один запрос:

final Map<String, ExpectedAttributeValue> expectedAttributes = new HashMap<>();
expectedAttributes.put("lastModificationTimestamp",
                new ExpectedAttributeValue()
                        .withValue(new AttributeValue(r.getLastModificationTimestamp.toString()))
                        .withComparisonOperator(ComparisonOperator.LT));

mapper.save(r, new DynamoDBSaveExpression().withExpected(expectedAttributes));

Я интерпретирую это как «ожидаю, что lastModificationTimestamp сохраненной записи будет меньше r 's lastModificationTimestamp.

Однако, это терпит неудачу с ConditionalCheckFailedException. Я попытался использовать ComparisonOperator.GE, в случае, если моя интерпретация документов была противоположной, но это не так, как хорошо, поэтому я подозреваю, что я делаю что-то ужасно неправильно. Мой объект DynamoDBMapper настроен с параметрами по умолчанию. Я использую AWS SDK Java 1.11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...