@@ -52,6 +52,7 @@ public class HollowObjectTypeMapper extends HollowTypeMapper {
52
52
private final Class <?> clazz ;
53
53
private final HollowObjectSchema schema ;
54
54
private final HollowObjectTypeWriteState writeState ;
55
+ private final boolean [] fieldIsPrimaryKey ;
55
56
56
57
private final boolean hasAssignedOrdinalField ;
57
58
private final long assignedOrdinalFieldOffset ;
@@ -118,7 +119,6 @@ public HollowObjectTypeMapper(HollowObjectMapper parentMapper, Class<?> clazz, S
118
119
}
119
120
120
121
this .schema = new HollowObjectSchema (typeName , mappedFields .size (), getKeyFieldPaths (clazz ));
121
-
122
122
Set <String > fieldNamesSeen = new HashSet <>();
123
123
for (MappedField field : mappedFields ) {
124
124
if (!fieldNamesSeen .add (field .getFieldName ()))
@@ -131,6 +131,16 @@ public HollowObjectTypeMapper(HollowObjectMapper parentMapper, Class<?> clazz, S
131
131
}
132
132
}
133
133
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
+
134
144
HollowObjectTypeWriteState existingWriteState = (HollowObjectTypeWriteState ) parentMapper .getStateEngine ().getTypeState (typeName );
135
145
if (existingWriteState != null ) {
136
146
this .writeState = existingWriteState ;
@@ -194,7 +204,7 @@ private HollowObjectWriteRecord copyToWriteRecord(Object obj, FlatRecordWriter f
194
204
HollowObjectWriteRecord rec = (HollowObjectWriteRecord ) writeRecord ();
195
205
196
206
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 ] );
198
208
}
199
209
return rec ;
200
210
}
@@ -461,7 +471,7 @@ public String getReferencedTypeName() {
461
471
}
462
472
463
473
@ SuppressWarnings ("deprecation" )
464
- public void copy (Object obj , HollowObjectWriteRecord rec , FlatRecordWriter flatRecordWriter ) {
474
+ public void copy (Object obj , HollowObjectWriteRecord rec , FlatRecordWriter flatRecordWriter , boolean throwOnNull ) {
465
475
Object fieldObject ;
466
476
467
477
switch (fieldType ) {
@@ -512,61 +522,97 @@ public void copy(Object obj, HollowObjectWriteRecord rec, FlatRecordWriter flatR
512
522
fieldObject = unsafe .getObject (obj , fieldOffset );
513
523
if (fieldObject != null )
514
524
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
+ }
515
528
break ;
516
529
case BYTES :
517
530
fieldObject = unsafe .getObject (obj , fieldOffset );
518
531
if (fieldObject != null )
519
532
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
+ }
520
536
break ;
521
537
case INLINED_BOOLEAN :
522
538
fieldObject = unsafe .getObject (obj , fieldOffset );
523
539
if (fieldObject != null )
524
540
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
+ }
525
544
break ;
526
545
case INLINED_INT :
527
546
fieldObject = unsafe .getObject (obj , fieldOffset );
528
547
if (fieldObject != null )
529
548
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
+ }
530
552
break ;
531
553
case INLINED_SHORT :
532
554
fieldObject = unsafe .getObject (obj , fieldOffset );
533
555
if (fieldObject != null )
534
556
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
+ }
535
560
break ;
536
561
case INLINED_BYTE :
537
562
fieldObject = unsafe .getObject (obj , fieldOffset );
538
563
if (fieldObject != null )
539
564
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
+ }
540
568
break ;
541
569
case INLINED_CHAR :
542
570
fieldObject = unsafe .getObject (obj , fieldOffset );
543
571
if (fieldObject != null )
544
572
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
+ }
545
576
break ;
546
577
case INLINED_LONG :
547
578
fieldObject = unsafe .getObject (obj , fieldOffset );
548
579
if (fieldObject != null )
549
580
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
+ }
550
584
break ;
551
585
case INLINED_DOUBLE :
552
586
fieldObject = unsafe .getObject (obj , fieldOffset );
553
587
if (fieldObject != null )
554
588
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
+ }
555
592
break ;
556
593
case INLINED_FLOAT :
557
594
fieldObject = unsafe .getObject (obj , fieldOffset );
558
595
if (fieldObject != null )
559
596
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
+ }
560
600
break ;
561
601
case INLINED_STRING :
562
602
fieldObject = unsafe .getObject (obj , fieldOffset );
563
603
if (fieldObject != null )
564
604
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
+ }
565
608
break ;
566
609
case NULLABLE_PRIMITIVE_BOOLEAN :
567
610
fieldObject = unsafe .getObject (obj , fieldOffset );
568
611
if (fieldObject != null )
569
612
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
+ }
570
616
break ;
571
617
case DATE_TIME :
572
618
rec .setLong (fieldName , ((Date )obj ).getTime ());
@@ -581,6 +627,8 @@ public void copy(Object obj, HollowObjectWriteRecord rec, FlatRecordWriter flatR
581
627
rec .setReference (fieldName , subTypeMapper .write (fieldObject ));
582
628
else
583
629
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 ());
584
632
}
585
633
break ;
586
634
}
0 commit comments