Skip to content

Updated DynamoDBEnhancedClient to support '0' and '1' as valid boolean values #1948

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "feature",
"category": "Amazon DynamoDB Enhanced Client",
"description": "Support converting \"0\" and \"1\" numbers read from DynamoDB to Boolean and AtomicBoolean."
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@
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.converter.TypeConvertingVisitor;
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.string.AtomicBooleanStringConverter;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;

/**
Expand All @@ -43,8 +41,7 @@
@ThreadSafe
@Immutable
public final class AtomicBooleanAttributeConverter implements AttributeConverter<AtomicBoolean> {
private static final Visitor VISITOR = new Visitor();
private static final AtomicBooleanStringConverter STRING_CONVERTER = AtomicBooleanStringConverter.create();
private static final BooleanAttributeConverter BOOLEAN_CONVERTER = BooleanAttributeConverter.create();

private AtomicBooleanAttributeConverter() {
}
Expand All @@ -70,26 +67,6 @@ public AttributeValue transformFrom(AtomicBoolean input) {

@Override
public AtomicBoolean transformTo(AttributeValue input) {
if (input.bool() != null) {
return EnhancedAttributeValue.fromBoolean(input.bool()).convert(VISITOR);
}

return EnhancedAttributeValue.fromAttributeValue(input).convert(VISITOR);
}

private static final class Visitor extends TypeConvertingVisitor<AtomicBoolean> {
private Visitor() {
super(AtomicBoolean.class, AtomicBooleanAttributeConverter.class);
}

@Override
public AtomicBoolean convertString(String value) {
return STRING_CONVERTER.fromString(value);
}

@Override
public AtomicBoolean convertBoolean(Boolean value) {
return new AtomicBoolean(value);
}
return new AtomicBoolean(BOOLEAN_CONVERTER.transformTo(input));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,15 @@ public Boolean convertString(String value) {
return STRING_CONVERTER.fromString(value);
}

@Override
public Boolean convertNumber(String value) {
switch (value) {
case "0": return false;
case "1": return true;
default: throw new IllegalArgumentException("Number could not be converted to boolean: " + value);
}
}

@Override
public Boolean convertBoolean(Boolean value) {
return value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ public void atomicBooleanAttributeConverterBehaves() {
assertFails(() -> transformTo(converter, EnhancedAttributeValue.fromString("0").toAttributeValue()));
assertFails(() -> transformTo(converter, EnhancedAttributeValue.fromString("1").toAttributeValue()));
assertFails(() -> transformTo(converter, EnhancedAttributeValue.fromString("").toAttributeValue()));
assertThat(transformTo(converter, EnhancedAttributeValue.fromNumber("1").toAttributeValue())).isTrue();
assertThat(transformTo(converter, EnhancedAttributeValue.fromNumber("0").toAttributeValue())).isFalse();
assertThat(transformTo(converter, EnhancedAttributeValue.fromString("true").toAttributeValue())).isTrue();
assertThat(transformTo(converter, EnhancedAttributeValue.fromString("false").toAttributeValue())).isFalse();
assertThat(transformTo(converter, EnhancedAttributeValue.fromBoolean(true).toAttributeValue())).isTrue();
Expand All @@ -58,6 +60,8 @@ public void booleanAttributeConverterBehaves() {
assertFails(() -> transformTo(converter, EnhancedAttributeValue.fromString("0").toAttributeValue()));
assertFails(() -> transformTo(converter, EnhancedAttributeValue.fromString("1").toAttributeValue()));
assertFails(() -> transformTo(converter, EnhancedAttributeValue.fromString("").toAttributeValue()));
assertThat(transformTo(converter, EnhancedAttributeValue.fromNumber("1").toAttributeValue())).isTrue();
assertThat(transformTo(converter, EnhancedAttributeValue.fromNumber("0").toAttributeValue())).isFalse();
assertThat(transformTo(converter, EnhancedAttributeValue.fromString("true").toAttributeValue())).isTrue();
assertThat(transformTo(converter, EnhancedAttributeValue.fromString("false").toAttributeValue())).isFalse();
assertThat(transformTo(converter, EnhancedAttributeValue.fromBoolean(true).toAttributeValue())).isTrue();
Expand Down