in sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoDynamicMessageSchema.java [113:188]
Convert createConverter(Schema.Field field) {
Schema.FieldType fieldType = field.getType();
if (fieldType.getNullable()) {
Schema.Field valueField =
withFieldNumber(Schema.Field.of("value", Schema.FieldType.BOOLEAN), 1);
switch (fieldType.getTypeName()) {
case BYTE:
case INT16:
case INT32:
case INT64:
case FLOAT:
case DOUBLE:
case STRING:
case BOOLEAN:
return new WrapperConvert(field, new PrimitiveConvert(valueField));
case BYTES:
return new WrapperConvert(field, new BytesConvert(valueField));
case LOGICAL_TYPE:
String identifier = field.getType().getLogicalType().getIdentifier();
switch (identifier) {
case ProtoSchemaLogicalTypes.UInt32.IDENTIFIER:
case ProtoSchemaLogicalTypes.UInt64.IDENTIFIER:
return new WrapperConvert(field, new PrimitiveConvert(valueField));
default:
}
// fall through
default:
}
}
switch (fieldType.getTypeName()) {
case BYTE:
case INT16:
case INT32:
case INT64:
case FLOAT:
case DOUBLE:
case STRING:
case BOOLEAN:
return new PrimitiveConvert(field);
case BYTES:
return new BytesConvert(field);
case ARRAY:
case ITERABLE:
return new ArrayConvert(this, field);
case MAP:
return new MapConvert(this, field);
case LOGICAL_TYPE:
String identifier = field.getType().getLogicalType().getIdentifier();
switch (identifier) {
case ProtoSchemaLogicalTypes.Fixed32.IDENTIFIER:
case ProtoSchemaLogicalTypes.Fixed64.IDENTIFIER:
case ProtoSchemaLogicalTypes.SFixed32.IDENTIFIER:
case ProtoSchemaLogicalTypes.SFixed64.IDENTIFIER:
case ProtoSchemaLogicalTypes.SInt32.IDENTIFIER:
case ProtoSchemaLogicalTypes.SInt64.IDENTIFIER:
case ProtoSchemaLogicalTypes.UInt32.IDENTIFIER:
case ProtoSchemaLogicalTypes.UInt64.IDENTIFIER:
return new LogicalTypeConvert(field, fieldType.getLogicalType());
case NanosInstant.IDENTIFIER:
return new TimestampConvert(field);
case NanosDuration.IDENTIFIER:
return new DurationConvert(field);
case EnumerationType.IDENTIFIER:
return new EnumConvert(field, fieldType.getLogicalType());
case OneOfType.IDENTIFIER:
return new OneOfConvert(this, field, fieldType.getLogicalType());
default:
throw new IllegalStateException("Unexpected logical type : " + identifier);
}
case ROW:
return new MessageConvert(this, field);
default:
throw new IllegalStateException("Unexpected value: " + fieldType);
}
}