Java源码示例:software.amazon.awssdk.services.dynamodb.model.UpdateItemRequest

示例1
@Test
public void testUpdateStatus() throws Exception {
  DyneinJobSpec jobSpec = getTestJobSpec(validToken, "test1");
  Schedule schedule = jobSpecToSchedule(jobSpec);
  UpdateItemRequest updateItemRequest =
      getUpdateItemReq(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);

  when(ddbClient.updateItem(updateItemRequest))
      .thenReturn(
          CompletableFuture.completedFuture(
              UpdateItemResponse.builder()
                  .attributes(
                      ImmutableMap.of(
                          Attribute.JOB_STATUS.columnName,
                          AttributeValue.builder().s(JobStatus.ACQUIRED.name()).build()))
                  .build()));

  CompletableFuture<Schedule> response =
      scheduleManager.updateStatus(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);
  Assert.assertEquals(response.get(1, TimeUnit.SECONDS), schedule.withStatus(JobStatus.ACQUIRED));

  verify(ddbClient, times(1)).updateItem(updateItemRequest);
  verifyNoMoreInteractions(ddbClient);
}
 
示例2
@Test
public void testUpdateStatus_emptyResponse() throws Exception {
  DyneinJobSpec jobSpec = getTestJobSpec(validToken, "test1");
  Schedule schedule = jobSpecToSchedule(jobSpec);
  UpdateItemRequest updateItemRequest =
      getUpdateItemReq(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);

  when(ddbClient.updateItem(updateItemRequest))
      .thenReturn(CompletableFuture.completedFuture(UpdateItemResponse.builder().build()));

  CompletableFuture<Schedule> response =
      scheduleManager.updateStatus(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);

  Throwable exception = getException(response);
  assertTrue(exception instanceof IllegalStateException);
  assertEquals(exception.getMessage(), "Status update successful but status isn't returned.");

  verify(ddbClient, times(1)).updateItem(updateItemRequest);
  verifyNoMoreInteractions(ddbClient);
}
 
示例3
@Test
public void testUpdateStatus_failure() throws Exception {
  DyneinJobSpec jobSpec = getTestJobSpec(validToken, "test1");
  Schedule schedule = jobSpecToSchedule(jobSpec);
  UpdateItemRequest updateItemRequest =
      getUpdateItemReq(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);

  Exception exception = new Exception();
  CompletableFuture<UpdateItemResponse> response = new CompletableFuture<>();
  response.completeExceptionally(exception);
  when(ddbClient.updateItem(updateItemRequest)).thenReturn(response);

  CompletableFuture<Schedule> ret =
      scheduleManager.updateStatus(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);

  assertSame(getException(ret), exception);

  verify(ddbClient, times(1)).updateItem(updateItemRequest);
  verifyNoMoreInteractions(ddbClient);
}
 
示例4
private UpdateItemRequest getUpdateItemReq(
    Schedule schedule, Schedule.JobStatus oldStatus, Schedule.JobStatus newStatus) {
  Map<String, AttributeValue> primaryKey = DynamoDBUtils.getPrimaryKey(schedule);
  Map<String, String> attributeNames = new HashMap<>();
  Map<String, AttributeValue> attributeValues = new HashMap<>();
  attributeNames.put("#jobStatus", DynamoDBUtils.Attribute.JOB_STATUS.columnName);
  attributeValues.put(":oldStatus", AttributeValue.builder().s(oldStatus.name()).build());
  attributeValues.put(":newStatus", AttributeValue.builder().s(newStatus.name()).build());

  String updated = "SET #jobStatus = :newStatus";

  return UpdateItemRequest.builder()
      .tableName(this.tableName)
      .key(primaryKey)
      .conditionExpression("#jobStatus = :oldStatus")
      .expressionAttributeNames(attributeNames)
      .expressionAttributeValues(attributeValues)
      .updateExpression(updated)
      .returnValues(ReturnValue.UPDATED_NEW)
      .build();
}
 
示例5
@Override
public TransactWriteItem generateTransactWriteItem(TableSchema<T> tableSchema, OperationContext operationContext,
                                                   DynamoDbEnhancedClientExtension dynamoDbEnhancedClientExtension) {
    UpdateItemRequest updateItemRequest = generateRequest(tableSchema, operationContext, dynamoDbEnhancedClientExtension);

    Update update = Update.builder()
                          .key(updateItemRequest.key())
                          .tableName(updateItemRequest.tableName())
                          .updateExpression(updateItemRequest.updateExpression())
                          .conditionExpression(updateItemRequest.conditionExpression())
                          .expressionAttributeValues(updateItemRequest.expressionAttributeValues())
                          .expressionAttributeNames(updateItemRequest.expressionAttributeNames())
                          .build();

    return TransactWriteItem.builder()
                            .update(update)
                            .build();
}
 
示例6
@Test
public void generateRequest_withMinimalConditionExpression() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    item.setOtherAttribute1("value-1");

    UpdateItemOperation<FakeItemWithSort> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItemWithSort.class)
                                                            .item(item)
                                                            .conditionExpression(MINIMAL_CONDITION_EXPRESSION)
                                                            .build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    Map<String, AttributeValue> expectedValues = new HashMap<>();
    expectedValues.put(OTHER_ATTRIBUTE_1_VALUE, AttributeValue.builder().s("value-1").build());
    Map<String, String> expectedNames = new HashMap<>();
    expectedNames.put(OTHER_ATTRIBUTE_1_NAME, "other_attribute_1");
    expectedNames.put(OTHER_ATTRIBUTE_2_NAME, "other_attribute_2");
    assertThat(request.conditionExpression(), is(MINIMAL_CONDITION_EXPRESSION.expression()));
    assertThat(request.expressionAttributeNames(), is(expectedNames));
    assertThat(request.expressionAttributeValues(), is(expectedValues));
}
 
示例7
@Test
public void generateRequest_keyOnlyItem() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    UpdateItemOperation<FakeItemWithSort> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItemWithSort.class)
                                                            .item(item)
                                                            .ignoreNulls(true)
                                                            .build());
    Map<String, AttributeValue> expectedKey = new HashMap<>();
    expectedKey.put("id", AttributeValue.builder().s(item.getId()).build());
    expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build());
    UpdateItemRequest expectedRequest = UpdateItemRequest.builder()
                                                         .tableName(TABLE_NAME)
                                                         .key(expectedKey)
                                                         .returnValues(ReturnValue.ALL_NEW)
                                                         .build();


    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    assertThat(request, is(expectedRequest));
}
 
示例8
@Test
public void generateRequest_withExtension_modifiesKeyPortionOfItem() {
    FakeItem baseFakeItem = createUniqueFakeItem();
    FakeItem fakeItem = createUniqueFakeItem();

    Map<String, AttributeValue> baseMap = FakeItem.getTableSchema().itemToMap(baseFakeItem, false);
    Map<String, AttributeValue> fakeMap = FakeItem.getTableSchema().itemToMap(fakeItem, false);
    Map<String, AttributeValue> keyMap = FakeItem.getTableSchema().itemToMap(fakeItem, singletonList("id"));

    when(mockDynamoDbEnhancedClientExtension.beforeWrite(any(DynamoDbExtensionContext.BeforeWrite.class)))
        .thenReturn(WriteModification.builder().transformedItem(fakeMap).build());

    UpdateItemOperation<FakeItem> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(baseFakeItem).build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    mockDynamoDbEnhancedClientExtension);

    assertThat(request.key(), is(keyMap));
    verify(mockDynamoDbEnhancedClientExtension).beforeWrite(DefaultDynamoDbExtensionContext.builder()
                                                                                           .tableMetadata(FakeItem.getTableMetadata())
                                                                                           .operationContext(PRIMARY_CONTEXT)
                                                                                           .items(baseMap).build());
}
 
示例9
@Test
public void generateRequest_withExtensions_singleCondition() {
    FakeItem baseFakeItem = createUniqueFakeItem();
    FakeItem fakeItem = createUniqueFakeItem();
    Map<String, AttributeValue> fakeMap = FakeItem.getTableSchema().itemToMap(fakeItem, true);
    Expression condition = Expression.builder().expression("condition").expressionValues(fakeMap).build();
    when(mockDynamoDbEnhancedClientExtension.beforeWrite(any(DynamoDbExtensionContext.BeforeWrite.class)))
        .thenReturn(WriteModification.builder().additionalConditionalExpression(condition).build());
    UpdateItemOperation<FakeItem> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class)
                                                            .item(baseFakeItem)
                                                            .ignoreNulls(true)
                                                            .build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    mockDynamoDbEnhancedClientExtension);

    assertThat(request.conditionExpression(), is("condition"));
    assertThat(request.expressionAttributeValues(), is(fakeMap));
}
 
示例10
@Test
public void generateRequest_withExtension_correctlyCoalescesIdenticalExpressionValues() {
    FakeItem baseFakeItem = createUniqueFakeItem();
    baseFakeItem.setSubclassAttribute("something");
    Map<String, AttributeValue> values = singletonMap(SUBCLASS_ATTRIBUTE_VALUE,
                                                       AttributeValue.builder().s("something").build());
    Expression condition = Expression.builder().expression("condition").expressionValues(values).build();
    when(mockDynamoDbEnhancedClientExtension.beforeWrite(any(DynamoDbExtensionContext.BeforeWrite.class)))
        .thenReturn(WriteModification.builder().additionalConditionalExpression(condition).build());

    UpdateItemOperation<FakeItem> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class)
                                                            .item(baseFakeItem)
                                                            .ignoreNulls(true)
                                                            .build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    mockDynamoDbEnhancedClientExtension);

    assertThat(request.expressionAttributeValues(), is(values));
}
 
示例11
@Test
public void generateRequest_withExtension_correctlyCoalescesIdenticalExpressionNames() {
    FakeItem baseFakeItem = createUniqueFakeItem();
    baseFakeItem.setSubclassAttribute("something");
    Map<String, String> names = singletonMap(SUBCLASS_ATTRIBUTE_NAME, "subclass_attribute");
    Expression condition = Expression.builder().expression("condition").expressionNames(names).build();
    when(mockDynamoDbEnhancedClientExtension.beforeWrite(any(DynamoDbExtensionContext.BeforeWrite.class)))
        .thenReturn(WriteModification.builder().additionalConditionalExpression(condition).build());

    UpdateItemOperation<FakeItem> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class)
                                                            .item(baseFakeItem)
                                                            .ignoreNulls(true)
                                                            .build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    mockDynamoDbEnhancedClientExtension);

    assertThat(request.expressionAttributeNames(), is(names));
}
 
示例12
@Test
public void generateRequest_withExtension_noModifications() {
    FakeItem baseFakeItem = createUniqueFakeItem();
    when(mockDynamoDbEnhancedClientExtension.beforeWrite(any(DynamoDbExtensionContext.BeforeWrite.class)))
        .thenReturn(WriteModification.builder().build());

    UpdateItemOperation<FakeItem> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class)
                                                            .item(baseFakeItem)
                                                            .ignoreNulls(true)
                                                            .build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    mockDynamoDbEnhancedClientExtension);
    assertThat(request.conditionExpression(), is(nullValue()));
    assertThat(request.expressionAttributeValues().size(), is(0));
}
 
示例13
@Override
public void doUnlock() {
    // Set lockUntil to now or lockAtLeastUntil whichever is later
    String unlockTimeIso = toIsoString(lockConfiguration.getUnlockTime());

    Map<String, AttributeValue> key = singletonMap(ID, attr(lockConfiguration.getName()));

    Map<String, AttributeValue> attributeUpdates = singletonMap(":lockUntil", attr(unlockTimeIso));

    UpdateItemRequest request = UpdateItemRequest.builder()
            .tableName(tableName)
            .key(key)
            .updateExpression(RELEASE_LOCK_QUERY)
            .expressionAttributeValues(attributeUpdates)
            .returnValues(ReturnValue.UPDATED_NEW)
            .build();

    dynamoDbClient.updateItem(request);
}
 
示例14
@Test
public void updateApplication_author() {
  String userId = UUID.randomUUID().toString();
  String applicationId = UUID.randomUUID().toString();
  String author = UUID.randomUUID().toString();
  Long version = 1L;
  Map<String, AttributeValue> recordMap = keyMap(userId, applicationId);
  recordMap.put("version", AttributeValue.builder().n(version.toString()).build());
  GetItemResponse response = GetItemResponse.builder()
        .item(recordMap)
        .build();
  Map<String, AttributeValue> updateMap = new HashMap<>();
  updateMap.put(":nv", AttributeValue.builder().n("2").build());
  updateMap.put(":v", AttributeValue.builder().n("1").build());
  updateMap.put(":a", AttributeValue.builder().s(author).build());

  when(principal.getName()).thenReturn(userId);
  when(dynamodb.getItem(any(GetItemRequest.class))).thenReturn(response);

  UpdateApplicationInput input = new UpdateApplicationInput().author(author);
  UpdateItemRequest expectedUpdateItemRequest = UpdateItemRequest.builder()
        .tableName(TABLE_NAME)
        .key(keyMap(userId, applicationId))
        .updateExpression("SET author = :a,version = :nv")
        .expressionAttributeValues(updateMap)
        .conditionExpression("version = :v")
        .build();

  Application application = service.updateApplication(input, applicationId);
  ArgumentCaptor<UpdateItemRequest> updateItemRequestArgumentCaptor = ArgumentCaptor.forClass(UpdateItemRequest.class);
  verify(dynamodb).updateItem(updateItemRequestArgumentCaptor.capture());

  UpdateItemRequest updateItemRequest = updateItemRequestArgumentCaptor.getValue();
  assertThat(updateItemRequest).isEqualTo(expectedUpdateItemRequest);
  assertThat(application.getApplicationId()).isEqualTo(applicationId);
  assertThat(application.getAuthor()).isEqualTo(author);
}
 
示例15
@Test
public void updateApplication_description() {
  String userId = UUID.randomUUID().toString();
  String applicationId = UUID.randomUUID().toString();
  String description = UUID.randomUUID().toString();
  Long version = 1L;
  Map<String, AttributeValue> recordMap = keyMap(userId, applicationId);
  recordMap.put("version", AttributeValue.builder().n(version.toString()).build());
  GetItemResponse response = GetItemResponse.builder()
        .item(recordMap)
        .build();
  Map<String, AttributeValue> updateMap = new HashMap<>();
  updateMap.put(":nv", AttributeValue.builder().n("2").build());
  updateMap.put(":v", AttributeValue.builder().n("1").build());
  updateMap.put(":d", AttributeValue.builder().s(description).build());

  when(principal.getName()).thenReturn(userId);
  when(dynamodb.getItem(any(GetItemRequest.class))).thenReturn(response);

  UpdateApplicationInput input = new UpdateApplicationInput().description(description);
  UpdateItemRequest expectedUpdateItemRequest = UpdateItemRequest.builder()
        .tableName(TABLE_NAME)
        .key(keyMap(userId, applicationId))
        .updateExpression("SET description = :d,version = :nv")
        .expressionAttributeValues(updateMap)
        .conditionExpression("version = :v")
        .build();

  Application application = service.updateApplication(input, applicationId);
  ArgumentCaptor<UpdateItemRequest> updateItemRequestArgumentCaptor = ArgumentCaptor.forClass(UpdateItemRequest.class);
  verify(dynamodb).updateItem(updateItemRequestArgumentCaptor.capture());

  UpdateItemRequest updateItemRequest = updateItemRequestArgumentCaptor.getValue();
  assertThat(updateItemRequest).isEqualTo(expectedUpdateItemRequest);
  assertThat(application.getApplicationId()).isEqualTo(applicationId);
  assertThat(application.getDescription()).isEqualTo(description);
}
 
示例16
@Test
public void updateApplication_homePageUrl() {
  String userId = UUID.randomUUID().toString();
  String applicationId = UUID.randomUUID().toString();
  String homePageUrl = UUID.randomUUID().toString();
  Long version = 1L;
  Map<String, AttributeValue> recordMap = keyMap(userId, applicationId);
  recordMap.put("version", AttributeValue.builder().n(version.toString()).build());
  GetItemResponse response = GetItemResponse.builder()
        .item(recordMap)
        .build();
  Map<String, AttributeValue> updateMap = new HashMap<>();
  updateMap.put(":nv", AttributeValue.builder().n("2").build());
  updateMap.put(":v", AttributeValue.builder().n("1").build());
  updateMap.put(":h", AttributeValue.builder().s(homePageUrl).build());

  when(principal.getName()).thenReturn(userId);
  when(dynamodb.getItem(any(GetItemRequest.class))).thenReturn(response);

  UpdateApplicationInput input = new UpdateApplicationInput().homePageUrl(homePageUrl);
  UpdateItemRequest expectedUpdateItemRequest = UpdateItemRequest.builder()
        .tableName(TABLE_NAME)
        .key(keyMap(userId, applicationId))
        .updateExpression("SET homePageUrl = :h,version = :nv")
        .expressionAttributeValues(updateMap)
        .conditionExpression("version = :v")
        .build();

  Application application = service.updateApplication(input, applicationId);
  ArgumentCaptor<UpdateItemRequest> updateItemRequestArgumentCaptor = ArgumentCaptor.forClass(UpdateItemRequest.class);
  verify(dynamodb).updateItem(updateItemRequestArgumentCaptor.capture());

  UpdateItemRequest updateItemRequest = updateItemRequestArgumentCaptor.getValue();
  assertThat(updateItemRequest).isEqualTo(expectedUpdateItemRequest);
  assertThat(application.getApplicationId()).isEqualTo(applicationId);
  assertThat(application.getHomePageUrl()).isEqualTo(homePageUrl);
}
 
示例17
@Test
public void testUpdateStatus_unknownResponse() throws Exception {
  DyneinJobSpec jobSpec = getTestJobSpec(validToken, "test1");
  Schedule schedule = jobSpecToSchedule(jobSpec);
  UpdateItemRequest updateItemRequest =
      getUpdateItemReq(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);

  when(ddbClient.updateItem(updateItemRequest))
      .thenReturn(
          CompletableFuture.completedFuture(
              UpdateItemResponse.builder()
                  .attributes(
                      ImmutableMap.of(
                          Attribute.JOB_STATUS.columnName,
                          AttributeValue.builder().s("magic").build()))
                  .build()));

  CompletableFuture<Schedule> response =
      scheduleManager.updateStatus(schedule, JobStatus.SCHEDULED, JobStatus.ACQUIRED);

  Throwable exception = getException(response);
  assertTrue(exception instanceof IllegalArgumentException);
  assertEquals(
      exception.getMessage(),
      "No enum constant com.airbnb.dynein.scheduler.Schedule.JobStatus.magic");

  verify(ddbClient, times(1)).updateItem(updateItemRequest);
  verifyNoMoreInteractions(ddbClient);
}
 
示例18
@Test
public void getServiceCall_makesTheRightCallAndReturnsResponse() {
    FakeItem item = createUniqueFakeItem();
    UpdateItemOperation<FakeItem> updateItemOperation = UpdateItemOperation.create(
        UpdateItemEnhancedRequest.builder(FakeItem.class).item(item).build());
    UpdateItemRequest updateItemRequest = UpdateItemRequest.builder().tableName(TABLE_NAME).build();
    UpdateItemResponse expectedResponse = UpdateItemResponse.builder().build();
    when(mockDynamoDbClient.updateItem(any(UpdateItemRequest.class))).thenReturn(expectedResponse);

    UpdateItemResponse response = updateItemOperation.serviceCall(mockDynamoDbClient).apply(updateItemRequest);

    assertThat(response, sameInstance(expectedResponse));
    verify(mockDynamoDbClient).updateItem(updateItemRequest);
}
 
示例19
@Test
public void generateRequest_nullValuesNotIgnoredByDefault() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    item.setOtherAttribute1("value-1");
    UpdateItemOperation<FakeItemWithSort> updateItemOperation = UpdateItemOperation.create(
        UpdateItemEnhancedRequest.builder(FakeItemWithSort.class).item(item).build());
    Map<String, AttributeValue> expectedKey = new HashMap<>();
    expectedKey.put("id", AttributeValue.builder().s(item.getId()).build());
    expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build());
    Map<String, AttributeValue> expectedValues = new HashMap<>();
    expectedValues.put(OTHER_ATTRIBUTE_1_VALUE, AttributeValue.builder().s("value-1").build());
    Map<String, String> expectedNames = new HashMap<>();
    expectedNames.put(OTHER_ATTRIBUTE_1_NAME, "other_attribute_1");
    expectedNames.put(OTHER_ATTRIBUTE_2_NAME, "other_attribute_2");
    UpdateItemRequest.Builder baseExpectedRequest = UpdateItemRequest.builder()
                                                                     .tableName(TABLE_NAME)
                                                                     .expressionAttributeValues(expectedValues)
                                                                     .expressionAttributeNames(expectedNames)
                                                                     .key(expectedKey)
                                                                     .returnValues(ReturnValue.ALL_NEW);
    UpdateItemRequest expectedRequest =
        baseExpectedRequest.updateExpression("SET " + OTHER_ATTRIBUTE_1_NAME + " = " + OTHER_ATTRIBUTE_1_VALUE +
                                             " REMOVE " + OTHER_ATTRIBUTE_2_NAME)
                           .build();

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    assertThat(request, is(expectedRequest));
}
 
示例20
@Test
public void generateRequest_withConditionExpression() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    item.setOtherAttribute1("value-1");
    UpdateItemOperation<FakeItemWithSort> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItemWithSort.class)
                                                            .item(item)
                                                            .conditionExpression(CONDITION_EXPRESSION)
                                                            .build());
    Map<String, AttributeValue> expectedKey = new HashMap<>();
    expectedKey.put("id", AttributeValue.builder().s(item.getId()).build());
    expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build());
    Map<String, AttributeValue> expectedValues = new HashMap<>(CONDITION_EXPRESSION.expressionValues());
    expectedValues.put(OTHER_ATTRIBUTE_1_VALUE, AttributeValue.builder().s("value-1").build());
    Map<String, String> expectedNames = new HashMap<>(CONDITION_EXPRESSION.expressionNames());
    expectedNames.put(OTHER_ATTRIBUTE_1_NAME, "other_attribute_1");
    expectedNames.put(OTHER_ATTRIBUTE_2_NAME, "other_attribute_2");
    UpdateItemRequest.Builder baseExpectedRequest =
        UpdateItemRequest.builder()
                         .tableName(TABLE_NAME)
                         .expressionAttributeValues(expectedValues)
                         .expressionAttributeNames(expectedNames)
                         .conditionExpression(CONDITION_EXPRESSION.expression())
                         .key(expectedKey)
                         .returnValues(ReturnValue.ALL_NEW);
    UpdateItemRequest expectedRequest =
        baseExpectedRequest.updateExpression("SET " + OTHER_ATTRIBUTE_1_NAME + " = " + OTHER_ATTRIBUTE_1_VALUE +
                                             " REMOVE " + OTHER_ATTRIBUTE_2_NAME)
                           .build();

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    assertThat(request, is(expectedRequest));
}
 
示例21
@Test
public void generateRequest_explicitlyUnsetIgnoreNulls() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    item.setOtherAttribute1("value-1");
    UpdateItemOperation<FakeItemWithSort> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItemWithSort.class)
                                                            .item(item)
                                                            .ignoreNulls(false)
                                                            .build());
    Map<String, AttributeValue> expectedKey = new HashMap<>();
    expectedKey.put("id", AttributeValue.builder().s(item.getId()).build());
    expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build());
    Map<String, AttributeValue> expectedValues = new HashMap<>();
    expectedValues.put(OTHER_ATTRIBUTE_1_VALUE, AttributeValue.builder().s("value-1").build());
    Map<String, String> expectedNames = new HashMap<>();
    expectedNames.put(OTHER_ATTRIBUTE_1_NAME, "other_attribute_1");
    expectedNames.put(OTHER_ATTRIBUTE_2_NAME, "other_attribute_2");
    UpdateItemRequest.Builder baseExpectedRequest = UpdateItemRequest.builder()
                                                                     .tableName(TABLE_NAME)
                                                                     .expressionAttributeValues(expectedValues)
                                                                     .expressionAttributeNames(expectedNames)
                                                                     .key(expectedKey)
                                                                     .returnValues(ReturnValue.ALL_NEW);
    UpdateItemRequest expectedRequest =
        baseExpectedRequest.updateExpression("SET " + OTHER_ATTRIBUTE_1_NAME + " = " + OTHER_ATTRIBUTE_1_VALUE +
                                             " REMOVE " + OTHER_ATTRIBUTE_2_NAME)
                           .build();

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    assertThat(request, is(expectedRequest));
}
 
示例22
@Test
public void generateRequest_multipleSetters() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    item.setOtherAttribute1("value-1");
    item.setOtherAttribute2("value-2");
    UpdateItemOperation<FakeItemWithSort> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItemWithSort.class)
                                                            .item(item)
                                                            .ignoreNulls(false)
                                                            .build());
    Map<String, AttributeValue> expectedKey = new HashMap<>();
    expectedKey.put("id", AttributeValue.builder().s(item.getId()).build());
    expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build());
    Map<String, AttributeValue> expectedValues = new HashMap<>();
    expectedValues.put(OTHER_ATTRIBUTE_1_VALUE, AttributeValue.builder().s("value-1").build());
    expectedValues.put(OTHER_ATTRIBUTE_2_VALUE, AttributeValue.builder().s("value-2").build());
    Map<String, String> expectedNames = new HashMap<>();
    expectedNames.put(OTHER_ATTRIBUTE_1_NAME, "other_attribute_1");
    expectedNames.put(OTHER_ATTRIBUTE_2_NAME, "other_attribute_2");
    UpdateItemRequest.Builder baseExpectedRequest = UpdateItemRequest.builder()
                                                                     .tableName(TABLE_NAME)
                                                                     .expressionAttributeValues(expectedValues)
                                                                     .expressionAttributeNames(expectedNames)
                                                                     .key(expectedKey)
                                                                     .returnValues(ReturnValue.ALL_NEW);
    UpdateItemRequest expectedRequest1 =
        baseExpectedRequest.updateExpression("SET " + OTHER_ATTRIBUTE_1_NAME + " = " + OTHER_ATTRIBUTE_1_VALUE +
                                             ", " + OTHER_ATTRIBUTE_2_NAME + " = " + OTHER_ATTRIBUTE_2_VALUE)
                           .build();
    UpdateItemRequest expectedRequest2 =
        baseExpectedRequest.updateExpression("SET " + OTHER_ATTRIBUTE_2_NAME + " = " + OTHER_ATTRIBUTE_2_VALUE +
                                             ", " + OTHER_ATTRIBUTE_1_NAME + " = " + OTHER_ATTRIBUTE_1_VALUE)
                           .build();

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    assertThat(request, either(is(expectedRequest1)).or(is(expectedRequest2)));
}
 
示例23
@Test
public void generateRequest_multipleDeletes() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    UpdateItemOperation<FakeItemWithSort> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItemWithSort.class)
                                                            .item(item)
                                                            .ignoreNulls(false)
                                                            .build());
    Map<String, AttributeValue> expectedKey = new HashMap<>();
    expectedKey.put("id", AttributeValue.builder().s(item.getId()).build());
    expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build());
    Map<String, String> expectedNames = new HashMap<>();
    expectedNames.put(OTHER_ATTRIBUTE_1_NAME, "other_attribute_1");
    expectedNames.put(OTHER_ATTRIBUTE_2_NAME, "other_attribute_2");
    UpdateItemRequest.Builder baseExpectedRequest = UpdateItemRequest.builder()
                                                                     .tableName(TABLE_NAME)
                                                                     .expressionAttributeNames(expectedNames)
                                                                     .key(expectedKey)
                                                                     .returnValues(ReturnValue.ALL_NEW);
    UpdateItemRequest expectedRequest1 =
        baseExpectedRequest.updateExpression("REMOVE " + OTHER_ATTRIBUTE_1_NAME + ", " + OTHER_ATTRIBUTE_2_NAME)
                           .build();
    UpdateItemRequest expectedRequest2 =
        baseExpectedRequest.updateExpression("REMOVE " + OTHER_ATTRIBUTE_2_NAME + ", " + OTHER_ATTRIBUTE_1_NAME)
                           .build();

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    assertThat(request,either(is(expectedRequest1)).or(is(expectedRequest2)));
}
 
示例24
@Test
public void generateRequest_canIgnoreNullValues() {
    FakeItemWithSort item = createUniqueFakeItemWithSort();
    item.setOtherAttribute1("value-1");
    UpdateItemOperation<FakeItemWithSort> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItemWithSort.class)
                                                            .item(item)
                                                            .ignoreNulls(true)
                                                            .build());
    Map<String, AttributeValue> expectedKey = new HashMap<>();
    expectedKey.put("id", AttributeValue.builder().s(item.getId()).build());
    expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build());
    Map<String, AttributeValue> expectedValues =
        singletonMap(OTHER_ATTRIBUTE_1_VALUE, AttributeValue.builder().s("value-1").build());
    Map<String, String> expectedNames = singletonMap(OTHER_ATTRIBUTE_1_NAME, "other_attribute_1");
    UpdateItemRequest expectedRequest = UpdateItemRequest.builder()
        .tableName(TABLE_NAME)
        .updateExpression("SET " + OTHER_ATTRIBUTE_1_NAME + " = " + OTHER_ATTRIBUTE_1_VALUE)
        .expressionAttributeValues(expectedValues)
        .expressionAttributeNames(expectedNames)
        .key(expectedKey)
        .returnValues(ReturnValue.ALL_NEW)
        .build();


    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItemWithSort.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    null);

    assertThat(request, is(expectedRequest));
}
 
示例25
@Test
public void generateRequest_withExtension_modifiesUpdateExpression() {
    FakeItem fakeItem = createUniqueFakeItem();
    Map<String, AttributeValue> baseMap = new HashMap<>(FakeItem.getTableSchema().itemToMap(fakeItem, true));

    Map<String, AttributeValue> fakeMap = new HashMap<>(baseMap);
    fakeMap.put("subclass_attribute", AttributeValue.builder().s("1").build());

    when(mockDynamoDbEnhancedClientExtension.beforeWrite(any(DynamoDbExtensionContext.BeforeWrite.class)))
        .thenReturn(WriteModification.builder().transformedItem(fakeMap).build());


    UpdateItemOperation<FakeItem> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class)
                                                            .item(fakeItem)
                                                            .ignoreNulls(true)
                                                            .build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    mockDynamoDbEnhancedClientExtension);

    assertThat(request.updateExpression(), is("SET " + SUBCLASS_ATTRIBUTE_NAME + " = " + SUBCLASS_ATTRIBUTE_VALUE));
    assertThat(request.expressionAttributeValues(), hasEntry(SUBCLASS_ATTRIBUTE_VALUE,
        AttributeValue.builder().s("1").build()));
    assertThat(request.expressionAttributeNames(), hasEntry(SUBCLASS_ATTRIBUTE_NAME, "subclass_attribute"));
}
 
示例26
@Test
public void generateRequest_withExtension_conditionAndModification() {
    FakeItem baseFakeItem = createUniqueFakeItem();
    Map<String, AttributeValue> baseMap = new HashMap<>(FakeItem.getTableSchema().itemToMap(baseFakeItem, true));

    Map<String, AttributeValue> fakeMap = new HashMap<>(baseMap);
    fakeMap.put("subclass_attribute", AttributeValue.builder().s("1").build());

    Map<String, AttributeValue> conditionValues = new HashMap<>();
    conditionValues.put(":condition_value", AttributeValue.builder().s("2").build());

    when(mockDynamoDbEnhancedClientExtension.beforeWrite(any(DynamoDbExtensionContext.BeforeWrite.class)))
        .thenReturn(WriteModification.builder()
                                     .transformedItem(fakeMap)
                                     .additionalConditionalExpression(Expression.builder()
                                                                                .expression("condition")
                                                                                .expressionValues(conditionValues)
                                                                                .build())
                                     .build());

    UpdateItemOperation<FakeItem> updateItemOperation =
        UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class)
                                                            .item(baseFakeItem)
                                                            .ignoreNulls(true)
                                                            .build());

    UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(),
                                                                    PRIMARY_CONTEXT,
                                                                    mockDynamoDbEnhancedClientExtension);

    assertThat(request.updateExpression(), is("SET " + SUBCLASS_ATTRIBUTE_NAME + " = " + SUBCLASS_ATTRIBUTE_VALUE));
    assertThat(request.expressionAttributeValues(), hasEntry(SUBCLASS_ATTRIBUTE_VALUE,
                                                             AttributeValue.builder().s("1").build()));
    assertThat(request.expressionAttributeValues(), hasEntry(":condition_value",
                                                             AttributeValue.builder().s("2").build()));
    assertThat(request.expressionAttributeNames(), hasEntry(SUBCLASS_ATTRIBUTE_NAME, "subclass_attribute"));
}
 
示例27
@Test
public void generateTransactWriteItem_basicRequest() {
    FakeItem fakeItem = createUniqueFakeItem();
    Map<String, AttributeValue> fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true);
    UpdateItemOperation<FakeItem> updateItemOperation =
        spy(UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build()));
    OperationContext context = DefaultOperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName());
    String updateExpression = "update-expression";
    Map<String, AttributeValue> attributeValues = Collections.singletonMap("key", stringValue("value1"));
    Map<String, String> attributeNames = Collections.singletonMap("key", "value2");

    UpdateItemRequest updateItemRequest = UpdateItemRequest.builder()
                                                           .tableName(TABLE_NAME)
                                                           .key(fakeItemMap)
                                                           .updateExpression(updateExpression)
                                                           .expressionAttributeValues(attributeValues)
                                                           .expressionAttributeNames(attributeNames)
                                                           .build();
    doReturn(updateItemRequest).when(updateItemOperation).generateRequest(any(), any(), any());

    TransactWriteItem actualResult = updateItemOperation.generateTransactWriteItem(FakeItem.getTableSchema(),
                                                                                   context,
                                                                                   mockDynamoDbEnhancedClientExtension);

    TransactWriteItem expectedResult = TransactWriteItem.builder()
                                                        .update(Update.builder()
                                                                      .key(fakeItemMap)
                                                                      .tableName(TABLE_NAME)
                                                                      .updateExpression(updateExpression)
                                                                      .expressionAttributeNames(attributeNames)
                                                                      .expressionAttributeValues(attributeValues)
                                                                      .build())
                                                        .build();
    assertThat(actualResult, is(expectedResult));
    verify(updateItemOperation).generateRequest(FakeItem.getTableSchema(), context, mockDynamoDbEnhancedClientExtension);
}
 
示例28
@Test
public void generateTransactWriteItem_conditionalRequest() {
    FakeItem fakeItem = createUniqueFakeItem();
    Map<String, AttributeValue> fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true);
    UpdateItemOperation<FakeItem> updateItemOperation =
        spy(UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build()));
    OperationContext context = DefaultOperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName());
    String updateExpression = "update-expression";
    String conditionExpression = "condition-expression";
    Map<String, AttributeValue> attributeValues = Collections.singletonMap("key", stringValue("value1"));
    Map<String, String> attributeNames = Collections.singletonMap("key", "value2");

    UpdateItemRequest updateItemRequest = UpdateItemRequest.builder()
                                                           .tableName(TABLE_NAME)
                                                           .key(fakeItemMap)
                                                           .updateExpression(updateExpression)
                                                           .conditionExpression(conditionExpression)
                                                           .expressionAttributeValues(attributeValues)
                                                           .expressionAttributeNames(attributeNames)
                                                           .build();
    doReturn(updateItemRequest).when(updateItemOperation).generateRequest(any(), any(), any());

    TransactWriteItem actualResult = updateItemOperation.generateTransactWriteItem(FakeItem.getTableSchema(),
                                                                                   context,
                                                                                   mockDynamoDbEnhancedClientExtension);

    TransactWriteItem expectedResult = TransactWriteItem.builder()
                                                        .update(Update.builder()
                                                                      .key(fakeItemMap)
                                                                      .tableName(TABLE_NAME)
                                                                      .updateExpression(updateExpression)
                                                                      .conditionExpression(conditionExpression)
                                                                      .expressionAttributeNames(attributeNames)
                                                                      .expressionAttributeValues(attributeValues)
                                                                      .build())
                                                        .build();
    assertThat(actualResult, is(expectedResult));
    verify(updateItemOperation).generateRequest(FakeItem.getTableSchema(), context, mockDynamoDbEnhancedClientExtension);
}
 
示例29
@Override
@NonNull
public Optional<SimpleLock> lock(@NonNull LockConfiguration lockConfiguration) {
    String nowIso = toIsoString(now());
    String lockUntilIso = toIsoString(lockConfiguration.getLockAtMostUntil());

    Map<String, AttributeValue> key = singletonMap(ID, attr(lockConfiguration.getName()));

    Map<String, AttributeValue> attributeUpdates = new HashMap<>(3);
    attributeUpdates.put(":lockUntil", attr(lockUntilIso));
    attributeUpdates.put(":lockedAt", attr(nowIso));
    attributeUpdates.put(":lockedBy", attr(hostname));

    UpdateItemRequest request = UpdateItemRequest.builder()
            .tableName(tableName)
            .key(key)
            .updateExpression(OBTAIN_LOCK_QUERY)
            .conditionExpression(OBTAIN_LOCK_CONDITION)
            .expressionAttributeValues(attributeUpdates)
            .returnValues(ReturnValue.UPDATED_NEW)
            .build();

    try {
        // There are three possible situations:
        // 1. The lock document does not exist yet - it is inserted - we have the lock
        // 2. The lock document exists and lockUtil <= now - it is updated - we have the lock
        // 3. The lock document exists and lockUtil > now - ConditionalCheckFailedException is thrown
        dynamoDbClient.updateItem(request);
        return Optional.of(new DynamoDBLock(dynamoDbClient, tableName, lockConfiguration));
    } catch (ConditionalCheckFailedException e) {
        // Condition failed. This means there was a lock with lockUntil > now.
        return Optional.empty();
    }
}
 
示例30
private void setupUpdateItemTest() throws Exception {
    TimeoutException te = setRuleForDependencyTimeout();

    when(leaseSerializer.getDynamoHashKey(any(Lease.class))).thenReturn(Collections.emptyMap());
    when(leaseSerializer.getDynamoLeaseCounterExpectation(any(Lease.class))).thenReturn(Collections.emptyMap());
    when(leaseSerializer.getDynamoLeaseCounterUpdate(any(Lease.class))).thenReturn(Collections.emptyMap());
    when(leaseSerializer.getDynamoTakeLeaseUpdate(any(), anyString())).thenReturn(Collections.emptyMap());

    when(dynamoDbClient.updateItem(any(UpdateItemRequest.class))).thenReturn(mockUpdateFuture);
    when(mockUpdateFuture.get(anyLong(), any())).thenThrow(te);
}