public Tuple toTuple ( Message msg ) { if ( msg == null ) { // Pig tuples deal gracefully with nulls. // Also, we can be called with null here in recursive calls. return null ; } Descriptor msgDescriptor = msg . getDescriptorForType ( ) ; Tuple tuple = tupleFactory_ . newTuple ( msgDescriptor . getFields ( ) . size ( ) ) ; int curField = 0 ; try { // Walk through all the possible fields in the message. for ( FieldDescriptor fieldDescriptor : msgDescriptor . getFields ( ) ) { // Get the set value, or the default value, or null. Object fieldValue = msg . getField ( fieldDescriptor ) ; if ( fieldDescriptor . getType ( ) == FieldDescriptor . Type . MESSAGE ) { tuple . set ( curField ++ , messageToTuple ( fieldDescriptor , fieldValue ) ) ; } else { tuple . set ( curField ++ , singleFieldToTuple ( fieldDescriptor , fieldValue ) ) ; } } } catch ( ExecException e ) { LOG . warn ( "Could not convert msg " + msg + " to tuple" , e ) ; } return tuple ; }
Turn a generic message into a Tuple . Individual fields that are enums are converted into their string equivalents . Fields that are not filled out in the protobuf are set to null unless there is a default field value in which case that is used instead .