Skip to content

Commit

Permalink
Convert null string to null attribute value
Browse files Browse the repository at this point in the history
  • Loading branch information
zoewangg committed Jan 22, 2021
1 parent d0e47d0 commit 9f3e7c7
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"category": "DynamoDB Enhanced Client",
"contributor": "",
"type": "bugfix",
"description": "Converts string to NULL attribute if it's null. See [#2243](https://github.com/aws/aws-sdk-java-v2/issues/2243)"
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter;
import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType;
import software.amazon.awssdk.enhanced.dynamodb.EnhancedType;
import software.amazon.awssdk.enhanced.dynamodb.internal.AttributeValues;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.TypeConvertingVisitor;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.string.BooleanStringConverter;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.string.ByteArrayStringConverter;
Expand Down Expand Up @@ -64,7 +65,7 @@ public AttributeValueType attributeValueType() {

@Override
public AttributeValue transformFrom(String input) {
return AttributeValue.builder().s(input).build();
return input == null ? AttributeValues.nullAttributeValue() : AttributeValue.builder().s(input).build();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.junit.Test;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType;
import software.amazon.awssdk.enhanced.dynamodb.internal.AttributeValues;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.CharSequenceAttributeConverter;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.CharacterArrayAttributeConverter;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.CharacterAttributeConverter;
Expand Down Expand Up @@ -128,6 +129,7 @@ public void stringAttributeConverterBehaves() {
String chars = "foo";
String numChars = "42";

assertThat(transformFrom(converter, null)).isSameAs(AttributeValues.nullAttributeValue());
assertThat(transformFrom(converter, chars).s()).isSameAs(chars);
assertThat(transformFrom(converter, emptyChars).s()).isSameAs(emptyChars);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,35 @@ public void mapBean_stringStringMap() {
assertThat(reverse, is(equalTo(mapBean)));
}

@Test
public void mapBean_mapWithNullValue() {
BeanTableSchema<MapBean> beanTableSchema = BeanTableSchema.create(MapBean.class);
MapBean mapBean = new MapBean();
mapBean.setId("id-value");

Map<String, String> testMap = new HashMap<>();
testMap.put("one", null);
testMap.put("three", "four");

mapBean.setStringMap(testMap);

Map<String, AttributeValue> itemMap = beanTableSchema.itemToMap(mapBean, true);

Map<String, AttributeValue> expectedMap = new HashMap<>();
expectedMap.put("one", AttributeValues.nullAttributeValue());
expectedMap.put("three", stringValue("four"));
AttributeValue expectedMapValue = AttributeValue.builder()
.m(expectedMap)
.build();

assertThat(itemMap.size(), is(2));
assertThat(itemMap, hasEntry("id", stringValue("id-value")));
assertThat(itemMap, hasEntry("stringMap", expectedMapValue));

MapBean reverse = beanTableSchema.mapToItem(itemMap);
assertThat(reverse, is(equalTo(mapBean)));
}

@Test
public void mapBean_nestedStringMap() {
BeanTableSchema<MapBean> beanTableSchema = BeanTableSchema.create(MapBean.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1216,6 +1216,24 @@ public void mapperCanHandleGenericMap() {
AttributeValue.builder().m(attributeValueMap).build());
}

@Test
public void mapperCanHandleMapWithNullValue() {
Map<String, String> stringMap = new HashMap<>();
stringMap.put("one", null);
stringMap.put("two", "three");

Map<String, AttributeValue> attributeValueMap = new HashMap<>();
attributeValueMap.put("one", AttributeValue.builder().nul(true).build());
attributeValueMap.put("two", AttributeValue.builder().s("three").build());

verifyNullableAttribute(EnhancedType.mapOf(String.class, String.class),
a -> a.name("value")
.getter(FakeMappedItem::getAStringMap)
.setter(FakeMappedItem::setAStringMap),
FakeMappedItem.builder().aStringMap(stringMap).build(),
AttributeValue.builder().m(attributeValueMap).build());
}

@Test
public void mapperCanHandleIntDoubleMap() {
Map<Integer, Double> intDoubleMap = new ConcurrentHashMap<>();
Expand Down

0 comments on commit 9f3e7c7

Please sign in to comment.