Skip to content

Commit 193da6b

Browse files
committed
add configurable boolean encoding
1 parent 44ca176 commit 193da6b

File tree

5 files changed

+157
-6
lines changed

5 files changed

+157
-6
lines changed

src/main/java/com/aerospike/mapper/tools/ValueType.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,11 @@ public void set(final Object obj, final Object value) throws ReflectiveOperation
9797
DeferredObjectSetter objectSetter = new DeferredObjectSetter(setter, (DeferredObject) value);
9898
DeferredObjectLoader.add(objectSetter);
9999
} else {
100-
this.field.set(obj, value);
100+
if (this.field.getType().isAssignableFrom(Boolean.class) && value instanceof Long) {
101+
this.field.set(obj, (Long) value != 0);
102+
} else {
103+
this.field.set(obj, value);
104+
}
101105
}
102106
}
103107

src/main/java/com/aerospike/mapper/tools/configuration/ClassConfig.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.aerospike.mapper.annotations.AerospikeEmbed;
1010
import com.aerospike.mapper.annotations.AerospikeReference;
1111
import com.aerospike.mapper.tools.ConfigurationUtils;
12+
import com.aerospike.mapper.tools.mappers.BooleanMapper;
1213
import com.fasterxml.jackson.annotation.JsonProperty;
1314

1415
public class ClassConfig {
@@ -26,11 +27,17 @@ public class ClassConfig {
2627
private String factoryClass;
2728
private String factoryMethod;
2829
private final List<BinConfig> bins;
30+
private BooleanMapper.Encoding boolEncoding = BooleanMapper.Encoding.Numeric;
31+
2932

3033
public ClassConfig() {
3134
bins = new ArrayList<>();
3235
}
3336

37+
public BooleanMapper.Encoding getBoolEncoding() {
38+
return boolEncoding;
39+
}
40+
3441
public String getClassName() {
3542
return className;
3643
}
@@ -163,16 +170,21 @@ private void setKey(KeyConfig key) {
163170
private void setShortName(String shortName) {
164171
this.shortName = shortName;
165172
}
166-
173+
174+
private void setBoolEncoding( BooleanMapper.Encoding boolEncoding) {
175+
this.boolEncoding = boolEncoding;
176+
}
177+
167178
public static class Builder {
168179
private final Class<?> clazz;
169180
private final ClassConfig classConfig;
181+
170182
public Builder(final Class<?> clazz) {
171183
this.clazz = clazz;
172184
this.classConfig = new ClassConfig();
173185
this.classConfig.setClassName(clazz.getName());
174186
}
175-
187+
176188
private void validateFieldExists(String fieldName) {
177189
if (!ConfigurationUtils.validateFieldOnClass(this.clazz, fieldName)) {
178190
throw new AerospikeException(String.format("Field %s does not exist on class %s or its superclasses", fieldName, this.clazz));
@@ -199,6 +211,11 @@ public Builder withTtl(int ttl) {
199211
return this;
200212
}
201213

214+
public Builder withBoolEncoding(BooleanMapper.Encoding boolEncoding) {
215+
this.classConfig.setBoolEncoding(boolEncoding);
216+
return this;
217+
}
218+
202219
public Builder withVersion(int version) {
203220
this.classConfig.setVersion(version);
204221
return this;
@@ -223,7 +240,7 @@ public Builder withShortName(boolean sendKey) {
223240
this.classConfig.setSendKey(sendKey);
224241
return this;
225242
}
226-
243+
227244
public Builder withFactoryClassAndMethod(@NotNull Class<?> factoryClass, @NotNull String factoryMethod) {
228245
this.classConfig.setFactoryClass(factoryClass.getName());
229246
this.classConfig.setFactoryMethod(factoryMethod);

src/main/java/com/aerospike/mapper/tools/mappers/BooleanMapper.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,42 @@
11
package com.aerospike.mapper.tools.mappers;
22

3+
import com.aerospike.mapper.tools.ClassCache;
34
import com.aerospike.mapper.tools.TypeMapper;
5+
import com.aerospike.mapper.tools.configuration.ClassConfig;
46

57
import static com.aerospike.client.Value.UseBoolBin;
68

79
public class BooleanMapper extends TypeMapper {
810

11+
public enum Encoding {
12+
Numeric,
13+
Object
14+
}
15+
16+
private final ClassConfig classConfig;
17+
18+
public BooleanMapper(final ClassConfig config) {
19+
super();
20+
classConfig = config;
21+
}
22+
923
@Override
1024
public Object toAerospikeFormat(Object value) {
25+
final boolean useObjectEncoding;
26+
if (ClassCache.getInstance().hasClassConfig(Boolean.class)) {
27+
useObjectEncoding = ClassCache.getInstance()
28+
.getClassConfig(Boolean.class)
29+
.getBoolEncoding()
30+
.equals(Encoding.Object);
31+
} else {
32+
useObjectEncoding = false;
33+
}
34+
35+
1136
if (value == null) {
1237
return null;
1338
}
14-
if (UseBoolBin) {
39+
if (UseBoolBin && useObjectEncoding) {
1540
return value;
1641
}
1742
return ((Boolean) value) ? 1 : 0;

src/main/java/com/aerospike/mapper/tools/utils/TypeUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ private static TypeMapper getMapper(Class<?> clazz, AnnotatedType type, IBaseAer
111111
} else if (Integer.class.isAssignableFrom(clazz) || Integer.TYPE.isAssignableFrom(clazz)) {
112112
typeMapper = new IntMapper();
113113
} else if (Boolean.class.isAssignableFrom(clazz) || Boolean.TYPE.isAssignableFrom(clazz)) {
114-
typeMapper = new BooleanMapper();
114+
ClassConfig config = ClassCache.getInstance().getClassConfig(clazz);
115+
typeMapper = new BooleanMapper(config);
115116
} else if (Float.class.isAssignableFrom(clazz) || Float.TYPE.isAssignableFrom(clazz)) {
116117
typeMapper = new FloatMapper();
117118
} else if (clazz.isEnum()) {
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.aerospike.mapper;
2+
3+
import com.aerospike.client.Key;
4+
import com.aerospike.client.Record;
5+
import com.aerospike.client.policy.Policy;
6+
import com.aerospike.mapper.annotations.AerospikeKey;
7+
import com.aerospike.mapper.annotations.AerospikeRecord;
8+
import com.aerospike.mapper.tools.AeroMapper;
9+
import com.fasterxml.jackson.core.JsonProcessingException;
10+
import org.junit.jupiter.api.Test;
11+
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
14+
public class BooleanTest extends AeroMapperBaseTest {
15+
@AerospikeRecord(namespace = "test", set = "B")
16+
public static class B {
17+
@AerospikeKey
18+
public int id;
19+
public Boolean boolValue;
20+
}
21+
22+
@Test
23+
public void testNumericEncoding() throws JsonProcessingException {
24+
B b = new B();
25+
b.boolValue = true;
26+
b.id = 1;
27+
String config =
28+
"---\n" +
29+
"classes:\n" +
30+
" - class: com.aerospike.mapper.BooleanTest$B\n" +
31+
" namespace: test\n" +
32+
" set: B\n" +
33+
" key:\n" +
34+
" field: id\n" +
35+
" - class: java.lang.Boolean\n" +
36+
" boolEncoding: Numeric\n";
37+
38+
AeroMapper mapper = new AeroMapper.Builder(client).withConfiguration(config).build();
39+
mapper.save(b);
40+
41+
B b2 = mapper.read(B.class, 1);
42+
43+
assertEquals(b.id, b2.id);
44+
assertEquals(b.boolValue, b2.boolValue);
45+
final Record rec = mapper.getClient().get(new Policy(), new Key("test", "B", 1));
46+
final Object rawRepresentation = rec.bins.get("boolValue");
47+
assertEquals(Long.class, rawRepresentation.getClass());
48+
}
49+
50+
@Test
51+
public void testObjectEncoding() throws JsonProcessingException {
52+
B b = new B();
53+
b.boolValue = true;
54+
b.id = 1;
55+
String config =
56+
"---\n" +
57+
"classes:\n" +
58+
" - class: com.aerospike.mapper.BooleanTest$B\n" +
59+
" namespace: test\n" +
60+
" set: B\n" +
61+
" key:\n" +
62+
" field: id\n" +
63+
" - class: java.lang.Boolean\n" +
64+
" boolEncoding: Object\n";
65+
66+
AeroMapper mapper = new AeroMapper.Builder(client).withConfiguration(config).build();
67+
mapper.save(b);
68+
69+
B b2 = mapper.read(B.class, 1);
70+
71+
assertEquals(b.id, b2.id);
72+
assertEquals(b.boolValue, b2.boolValue);
73+
final Record rec = mapper.getClient().get(new Policy(), new Key("test", "B", 1));
74+
final Object rawRepresentation = rec.bins.get("boolValue");
75+
assertEquals(Boolean.class, rawRepresentation.getClass());
76+
}
77+
78+
@Test
79+
public void testNumericByDefault() throws JsonProcessingException {
80+
B b = new B();
81+
b.boolValue = true;
82+
b.id = 1;
83+
String config =
84+
"---\n" +
85+
"classes:\n" +
86+
" - class: com.aerospike.mapper.BooleanTest$B\n" +
87+
" namespace: test\n" +
88+
" set: B\n" +
89+
" key:\n" +
90+
" field: id\n";
91+
92+
AeroMapper mapper = new AeroMapper.Builder(client).withConfiguration(config).build();
93+
mapper.save(b);
94+
95+
B b2 = mapper.read(B.class, 1);
96+
97+
assertEquals(b.id, b2.id);
98+
assertEquals(b.boolValue, b2.boolValue);
99+
final Record rec = mapper.getClient().get(new Policy(), new Key("test", "B", 1));
100+
final Object rawRepresentation = rec.bins.get("boolValue");
101+
assertEquals(Long.class, rawRepresentation.getClass());
102+
}
103+
104+
}

0 commit comments

Comments
 (0)