Сбой условного сохранения картографа DynamoDB для новых обновлений строк - PullRequest
1 голос
/ 06 июня 2019

Предположим, у меня есть следующая таблица в DDB.Один хеш-ключ (давайте назовем его «Имя»), один ключ диапазона (давайте назовем его «Активность») и один атрибут (назовем его «Дата»)

|---------------------|------------------|------------------|
|       HashKey(S)    |     RangeKey(S)  |      Date(S)     |
|---------------------|------------------|------------------|  
|          Sam        |     Fishing      |      2019        |  
|---------------------|------------------|------------------|
|          Sam        |     Kayaking     |      2019        |  
|---------------------|------------------|------------------|
|          Peter      |     Kayaking     |      2019        | 
|---------------------|------------------|------------------|

Я хочу сделать условное сохранениепо этому так, что я хочу добавить новое «имя + активность» и поддерживать самую актуальную дату в БД.Таким образом, разбивка этих двух возможностей будет выглядеть следующим образом:

1) Если существует уже существующий хэш + ключ диапазона, основанный на том, что я передал в сохранение, я хочу проверить выражение условия и не обновлять его в случае сбоя.
2) Если это новый хэш + ключ диапазона, я хочу создать новую строку, а не проверять выражение моего условия (поскольку в таблице нет значений для проверки)

Примериз того, что я пробовал

public void methodToDoSave() {
  final Map<String, ExpectedAttributeValue> expectedAttributes = 
      getExpectedAttributes(date);
  final DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression()
      .withExpected(expectedAttributes);
  mapper.save(dbItem, saveExpression);
}

private Map<String, ExpectedAttributeValue> getExpectedAttributes(
        final Date date){

    final Map expectedAttributeSetupForConditionalUpdate = new HashMap();
    expectedAttributeSetupForConditionalUpdate
            .put("Date",new ExpectedAttributeValue(new AttributeValue().withS(date))
                            .withComparisonOperator(ComparisonOperator.LE));
    return expectedAttributeSetupForConditionalUpdate;
}

Это прекрасно работает для выполнения условной проверки и успешного выполнения / прохода, когда ключ хэш + диапазона уже находится в таблице, однако, если я предоставлю новый ключ диапазона, условная проверка кажетсявсегда терпеть неудачу.

Трассировка стека для условной проверки не настолько полезна, чтобы объяснить мне проблему, но я предполагаю, что условная проверка применяется даже для совершенно новых созданий строк, поэтому она не работает.

Есть ли способ заставить это работать в одной операции сохранения или мне нужно будет сначала прочитать, проверить, если существует, если да, то сохранить без условных проверок, если нет сохранения с условными проверками?

1 Ответ

0 голосов
/ 24 июня 2019

Мне удалось использовать подсказку Тавана выше и сделать что-то подобное.

final Map expectedAttributeSetupForConditionalUpdate = new HashMap();

expectedAttributeSetupForConditionalUpdate
  .put("name", new ExpectedAttributeValue().withExists(false));
expectedAttributeSetupForConditionalUpdate
  .put("activity", new ExpectedAttributeValue().withExists(false));
expectedAttributeSetupForConditionalUpdate
  .put("Date", new ExpectedAttributeValue(new AttributeValue().withS(date))
  .withComparisonOperator(ComparisonOperator.LE));

final DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression() .withExpected(expectedAttributeSetupForConditionalUpdate)
.withConditionalOperator(ConditionalOperator.OR);

Мне не удалось использовать более новые выражения условия, поскольку преобразователь DynamoDB их пока не поддерживает в используемой версии. По сути, это «проходит» условную проверку, когда строка не существует, но использует дату, когда она существует.

...