Skip to content

Commit 8c39b17

Browse files
committed
Add Tests for multi-level nesting updates to work correctly
1 parent 1a2c32a commit 8c39b17

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticImmutableTableSchema.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,12 @@ public void nestedUpdateAttributeMapper(Map<String, AttributeValue> attributeVal
559559
boolean ignoreNulls) {
560560
updateItemAttributeMap.forEach((mapKey, mapValue) -> {
561561
if (!ignoreNulls || !isNullAttributeValue(mapValue)) {
562-
attributeValueMap.put(attributeKey + NESTED_OBJECT_UPDATE + mapKey, mapValue);
562+
if (mapValue.hasM()) {
563+
nestedUpdateAttributeMapper(attributeValueMap, mapValue.m(), attributeKey + NESTED_OBJECT_UPDATE + mapKey,
564+
ignoreNulls);
565+
} else {
566+
attributeValueMap.put(attributeKey + NESTED_OBJECT_UPDATE + mapKey, mapValue);
567+
}
563568
}
564569
});
565570
}

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/UpdateBehaviorTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,51 @@ public void updateBehaviors_nested() {
182182
assertThat(persistedRecord.getNestedRecord().getNestedTimeAttribute()).isEqualTo(INSTANT_1);
183183
}
184184

185+
@Test
186+
public void updateBehaviors_multi_level_nested() {
187+
188+
NestedRecordWithUpdateBehavior nestedRecord1 = new NestedRecordWithUpdateBehavior();
189+
nestedRecord1.setId("id789");
190+
nestedRecord1.setNestedCounter(50L);
191+
nestedRecord1.setNestedUpdateBehaviorAttribute("TEST_BEHAVIOUR_ATTRIBUTE");
192+
nestedRecord1.setNestedTimeAttribute(INSTANT_1);
193+
194+
NestedRecordWithUpdateBehavior nestedRecord2 = new NestedRecordWithUpdateBehavior();
195+
nestedRecord2.setId("id456");
196+
nestedRecord2.setNestedCounter(5L);
197+
nestedRecord2.setNestedUpdateBehaviorAttribute("TEST_BEHAVIOUR_ATTRIBUTE");
198+
nestedRecord2.setNestedTimeAttribute(INSTANT_1);
199+
nestedRecord2.setNestedRecord(nestedRecord1);
200+
201+
RecordWithUpdateBehaviors record = new RecordWithUpdateBehaviors();
202+
record.setId("id123");
203+
record.setNestedRecord(nestedRecord2);
204+
205+
mappedTable.putItem(record);
206+
207+
NestedRecordWithUpdateBehavior updatedNestedRecord2 = new NestedRecordWithUpdateBehavior();
208+
updatedNestedRecord2.setNestedCounter(100L);
209+
210+
NestedRecordWithUpdateBehavior updatedNestedRecord1 = new NestedRecordWithUpdateBehavior();
211+
updatedNestedRecord1.setNestedRecord(updatedNestedRecord2);
212+
213+
RecordWithUpdateBehaviors update_record = new RecordWithUpdateBehaviors();
214+
update_record.setId("id123");
215+
update_record.setVersion(1L);
216+
update_record.setNestedRecord(updatedNestedRecord1);
217+
218+
mappedTable.updateItem(r -> r.item(update_record).ignoreNulls(true));
219+
220+
RecordWithUpdateBehaviors persistedRecord = mappedTable.getItem(r -> r.key(k -> k.partitionValue("id123")));
221+
222+
assertThat(persistedRecord.getVersion()).isEqualTo(2L);
223+
assertThat(persistedRecord.getNestedRecord()).isNotNull();
224+
assertThat(persistedRecord.getNestedRecord().getNestedRecord()).isNotNull();
225+
assertThat(persistedRecord.getNestedRecord().getNestedRecord().getNestedCounter()).isEqualTo(100L);
226+
//assertThat(persistedRecord.getNestedRecord().getNestedRecord().getNestedUpdateBehaviorAttribute()).isEqualTo("TEST_BEHAVIOUR_ATTRIBUTE");
227+
assertThat(persistedRecord.getNestedRecord().getNestedRecord().getNestedTimeAttribute()).isEqualTo(INSTANT_1);
228+
}
229+
185230
/**
186231
* Currently, nested records are not updated through extensions.
187232
*/

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/models/NestedRecordWithUpdateBehavior.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class NestedRecordWithUpdateBehavior {
3232
private Long nestedVersionedAttribute;
3333
private Instant nestedTimeAttribute;
3434
private Long nestedCounter;
35+
private NestedRecordWithUpdateBehavior nestedRecord;
3536

3637
@DynamoDbPartitionKey
3738
public String getId() {
@@ -77,4 +78,12 @@ public Long getNestedCounter() {
7778
public void setNestedCounter(Long nestedCounter) {
7879
this.nestedCounter = nestedCounter;
7980
}
81+
82+
public NestedRecordWithUpdateBehavior getNestedRecord() {
83+
return nestedRecord;
84+
}
85+
86+
public void setNestedRecord(NestedRecordWithUpdateBehavior nestedRecord) {
87+
this.nestedRecord = nestedRecord;
88+
}
8089
}

0 commit comments

Comments
 (0)