Skip to content

Commit dfa5518

Browse files
committed
add null check for the primary key in the write path;
NOTE: need to figure out how to check for nested primary type;
1 parent 325c60c commit dfa5518

File tree

1 file changed

+51
-3
lines changed

1 file changed

+51
-3
lines changed

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

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class HollowObjectTypeMapper extends HollowTypeMapper {
5252
private final Class<?> clazz;
5353
private final HollowObjectSchema schema;
5454
private final HollowObjectTypeWriteState writeState;
55+
private final boolean[] fieldIsPrimaryKey;
5556

5657
private final boolean hasAssignedOrdinalField;
5758
private final long assignedOrdinalFieldOffset;
@@ -118,7 +119,6 @@ public HollowObjectTypeMapper(HollowObjectMapper parentMapper, Class<?> clazz, S
118119
}
119120

120121
this.schema = new HollowObjectSchema(typeName, mappedFields.size(), getKeyFieldPaths(clazz));
121-
122122
Set<String> fieldNamesSeen = new HashSet<>();
123123
for(MappedField field : mappedFields) {
124124
if(!fieldNamesSeen.add(field.getFieldName()))
@@ -131,6 +131,16 @@ public HollowObjectTypeMapper(HollowObjectMapper parentMapper, Class<?> clazz, S
131131
}
132132
}
133133

134+
this.fieldIsPrimaryKey = new boolean[schema.numFields()];
135+
List<String> primaryKeyFieldPaths = Arrays.asList(schema.getPrimaryKey().getFieldPaths());
136+
if (this.schema.getPrimaryKey() != null && this.schema.getPrimaryKey().getFieldPaths() != null) {
137+
for (int i = 0; i < this.schema.numFields(); i++) {
138+
if (primaryKeyFieldPaths.contains(schema.getFieldName(i))) {
139+
fieldIsPrimaryKey[i] = true;
140+
}
141+
}
142+
}
143+
134144
HollowObjectTypeWriteState existingWriteState = (HollowObjectTypeWriteState) parentMapper.getStateEngine().getTypeState(typeName);
135145
if (existingWriteState != null) {
136146
this.writeState = existingWriteState;
@@ -194,7 +204,7 @@ private HollowObjectWriteRecord copyToWriteRecord(Object obj, FlatRecordWriter f
194204
HollowObjectWriteRecord rec = (HollowObjectWriteRecord) writeRecord();
195205

196206
for (int i = 0; i < mappedFields.size(); i++) {
197-
mappedFields.get(i).copy(obj, rec, flatRecordWriter);
207+
mappedFields.get(i).copy(obj, rec, flatRecordWriter, fieldIsPrimaryKey[i]);
198208
}
199209
return rec;
200210
}
@@ -461,7 +471,7 @@ public String getReferencedTypeName() {
461471
}
462472

463473
@SuppressWarnings("deprecation")
464-
public void copy(Object obj, HollowObjectWriteRecord rec, FlatRecordWriter flatRecordWriter) {
474+
public void copy(Object obj, HollowObjectWriteRecord rec, FlatRecordWriter flatRecordWriter, boolean throwOnNull) {
465475
Object fieldObject;
466476

467477
switch(fieldType) {
@@ -512,61 +522,97 @@ public void copy(Object obj, HollowObjectWriteRecord rec, FlatRecordWriter flatR
512522
fieldObject = unsafe.getObject(obj, fieldOffset);
513523
if(fieldObject != null)
514524
rec.setString(fieldName, getStringFromField(obj, fieldObject));
525+
else if (throwOnNull) {
526+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
527+
}
515528
break;
516529
case BYTES:
517530
fieldObject = unsafe.getObject(obj, fieldOffset);
518531
if(fieldObject != null)
519532
rec.setBytes(fieldName, (byte[])fieldObject);
533+
else if (throwOnNull) {
534+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
535+
}
520536
break;
521537
case INLINED_BOOLEAN:
522538
fieldObject = unsafe.getObject(obj, fieldOffset);
523539
if(fieldObject != null)
524540
rec.setBoolean(fieldName, ((Boolean)fieldObject).booleanValue());
541+
else if (throwOnNull) {
542+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
543+
}
525544
break;
526545
case INLINED_INT:
527546
fieldObject = unsafe.getObject(obj, fieldOffset);
528547
if(fieldObject != null)
529548
rec.setInt(fieldName, ((Integer)fieldObject).intValue());
549+
else if (throwOnNull) {
550+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
551+
}
530552
break;
531553
case INLINED_SHORT:
532554
fieldObject = unsafe.getObject(obj, fieldOffset);
533555
if(fieldObject != null)
534556
rec.setInt(fieldName, ((Short)fieldObject).intValue());
557+
else if (throwOnNull) {
558+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
559+
}
535560
break;
536561
case INLINED_BYTE:
537562
fieldObject = unsafe.getObject(obj, fieldOffset);
538563
if(fieldObject != null)
539564
rec.setInt(fieldName, ((Byte)fieldObject).intValue());
565+
else if (throwOnNull) {
566+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
567+
}
540568
break;
541569
case INLINED_CHAR:
542570
fieldObject = unsafe.getObject(obj, fieldOffset);
543571
if(fieldObject != null)
544572
rec.setInt(fieldName, (int)((Character)fieldObject).charValue());
573+
else if (throwOnNull) {
574+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
575+
}
545576
break;
546577
case INLINED_LONG:
547578
fieldObject = unsafe.getObject(obj, fieldOffset);
548579
if(fieldObject != null)
549580
rec.setLong(fieldName, ((Long)fieldObject).longValue());
581+
else if (throwOnNull) {
582+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
583+
}
550584
break;
551585
case INLINED_DOUBLE:
552586
fieldObject = unsafe.getObject(obj, fieldOffset);
553587
if(fieldObject != null)
554588
rec.setDouble(fieldName, ((Double)fieldObject).doubleValue());
589+
else if (throwOnNull) {
590+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
591+
}
555592
break;
556593
case INLINED_FLOAT:
557594
fieldObject = unsafe.getObject(obj, fieldOffset);
558595
if(fieldObject != null)
559596
rec.setFloat(fieldName, ((Float)fieldObject).floatValue());
597+
else if (throwOnNull) {
598+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
599+
}
560600
break;
561601
case INLINED_STRING:
562602
fieldObject = unsafe.getObject(obj, fieldOffset);
563603
if(fieldObject != null)
564604
rec.setString(fieldName, (String)fieldObject);
605+
else if (throwOnNull) {
606+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
607+
}
565608
break;
566609
case NULLABLE_PRIMITIVE_BOOLEAN:
567610
fieldObject = unsafe.getObject(obj, fieldOffset);
568611
if(fieldObject != null)
569612
rec.setBoolean(fieldName, ((NullablePrimitiveBoolean)fieldObject).getBooleanValue());
613+
else if (throwOnNull) {
614+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
615+
}
570616
break;
571617
case DATE_TIME:
572618
rec.setLong(fieldName, ((Date)obj).getTime());
@@ -581,6 +627,8 @@ public void copy(Object obj, HollowObjectWriteRecord rec, FlatRecordWriter flatR
581627
rec.setReference(fieldName, subTypeMapper.write(fieldObject));
582628
else
583629
rec.setReference(fieldName, subTypeMapper.writeFlat(fieldObject, flatRecordWriter));
630+
} else if (throwOnNull) {
631+
throw new NullPointerException("Null value found for non-nullable field " + fieldName + " on object of type " + clazz.getName());
584632
}
585633
break;
586634
}

0 commit comments

Comments
 (0)