Skip to content

Commit 179d56d

Browse files
fix: obj -> fr -> obj preserves boolean nullability
1 parent 975e9d8 commit 179d56d

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

hollow/src/main/java/com/netflix/hollow/core/write/objectmapper/HollowObjectTypeMapper.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,9 @@ public void copy(Object obj, HollowObjectWriteRecord rec, FlatRecordWriter flatR
589589
public void copy(Object pojo, GenericHollowObject rec) {
590590
switch (fieldType) {
591591
case BOOLEAN:
592-
unsafe.putBoolean(pojo, fieldOffset, rec.getBoolean(fieldName));
592+
if (!rec.isNull(fieldName)) {
593+
unsafe.putBoolean(pojo, fieldOffset, rec.getBoolean(fieldName));
594+
}
593595
break;
594596
case INT:
595597
int intValue = rec.getInt(fieldName);
@@ -833,9 +835,9 @@ private Object parseBoxedWrapper(FlatRecordTraversalObjectNode record) {
833835
private void copy(Object obj, FlatRecordTraversalObjectNode node) {
834836
switch (fieldType) {
835837
case BOOLEAN: {
836-
Boolean value = node.getFieldValueBooleanBoxed(fieldName);
837-
if (value != null) {
838-
unsafe.putBoolean(obj, fieldOffset, value == Boolean.TRUE);
838+
if (!node.isFieldNull(fieldName)) {
839+
boolean value = node.getFieldValueBoolean(fieldName);
840+
unsafe.putBoolean(obj, fieldOffset, value);
839841
}
840842
break;
841843
}
@@ -901,8 +903,8 @@ private void copy(Object obj, FlatRecordTraversalObjectNode node) {
901903
break;
902904
}
903905
case INLINED_BOOLEAN: {
904-
Boolean value = node.getFieldValueBooleanBoxed(fieldName);
905-
if (value != null) {
906+
if (!node.isFieldNull(fieldName)) {
907+
boolean value = node.getFieldValueBoolean(fieldName);
906908
unsafe.putObject(obj, fieldOffset, value);
907909
}
908910
break;

hollow/src/test/java/com/netflix/hollow/core/write/objectmapper/HollowObjectMapperFlatRecordParserTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,31 @@ public void testSpecialWrapperTypes() {
5252
Assert.assertEquals(wrapperTypesTest.complexEnum.anotherValue, result.complexEnum.anotherValue);
5353
}
5454

55+
@Test
56+
public void roundTripPreservesNullability() {
57+
TypeWithAllSimpleTypes obj = new TypeWithAllSimpleTypes();
58+
// set PK
59+
obj.boxedIntegerField = 1;
60+
obj.stringField = "hello";
61+
// all inlined values are null
62+
63+
flatRecordWriter.reset();
64+
mapper.writeFlat(obj, flatRecordWriter);
65+
FlatRecord fr = flatRecordWriter.generateFlatRecord();
66+
67+
TypeWithAllSimpleTypes result = mapper.readFlat(fr);
68+
Assert.assertEquals(obj, result);
69+
70+
// round trip the record: obj -> flatRecord -> obj -> flatRecord -> obj
71+
flatRecordWriter.reset();
72+
TypeWithAllSimpleTypes roundTrippedObj = mapper.readFlat(fr);
73+
mapper.writeFlat(roundTrippedObj, flatRecordWriter);
74+
FlatRecord roundTrippedFr = flatRecordWriter.generateFlatRecord();
75+
76+
TypeWithAllSimpleTypes roundTrippedResult = mapper.readFlat(roundTrippedFr);
77+
Assert.assertEquals(obj, roundTrippedResult);
78+
}
79+
5580
@Test
5681
public void testSimpleTypes() {
5782
TypeWithAllSimpleTypes typeWithAllSimpleTypes = new TypeWithAllSimpleTypes();

0 commit comments

Comments
 (0)