|
56 | 56 | import org.apache.beam.sdk.util.SerializableUtils; |
57 | 57 | import org.apache.beam.sdk.values.Row; |
58 | 58 | import org.apache.beam.vendor.grpc.v1p48p1.com.google.protobuf.ByteString; |
| 59 | +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.annotations.VisibleForTesting; |
59 | 60 | import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions; |
60 | 61 | import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; |
61 | 62 | import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Iterables; |
62 | 63 | import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps; |
63 | 64 | import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.io.ByteStreams; |
64 | 65 | import org.apache.commons.lang3.ClassUtils; |
65 | 66 | import org.checkerframework.checker.nullness.qual.Nullable; |
| 67 | +import org.slf4j.Logger; |
| 68 | +import org.slf4j.LoggerFactory; |
66 | 69 |
|
67 | 70 | /** Utility methods for translating schemas. */ |
68 | 71 | @Experimental(Kind.SCHEMAS) |
|
71 | 74 | "rawtypes" |
72 | 75 | }) |
73 | 76 | public class SchemaTranslation { |
| 77 | + private static final Logger LOG = LoggerFactory.getLogger(SchemaTranslation.class); |
74 | 78 |
|
75 | 79 | private static final String URN_BEAM_LOGICAL_DECIMAL = FixedPrecisionNumeric.BASE_IDENTIFIER; |
76 | 80 | private static final String URN_BEAM_LOGICAL_JAVASDK = "beam:logical_type:javasdk:v1"; |
@@ -124,8 +128,8 @@ private static SchemaApi.Field fieldToProto( |
124 | 128 | .build(); |
125 | 129 | } |
126 | 130 |
|
127 | | - private static SchemaApi.FieldType fieldTypeToProto( |
128 | | - FieldType fieldType, boolean serializeLogicalType) { |
| 131 | + @VisibleForTesting |
| 132 | + static SchemaApi.FieldType fieldTypeToProto(FieldType fieldType, boolean serializeLogicalType) { |
129 | 133 | SchemaApi.FieldType.Builder builder = SchemaApi.FieldType.newBuilder(); |
130 | 134 | switch (fieldType.getTypeName()) { |
131 | 135 | case ROW: |
@@ -297,7 +301,8 @@ private static Field fieldFromProto(SchemaApi.Field protoField) { |
297 | 301 | .withDescription(protoField.getDescription()); |
298 | 302 | } |
299 | 303 |
|
300 | | - private static FieldType fieldTypeFromProto(SchemaApi.FieldType protoFieldType) { |
| 304 | + @VisibleForTesting |
| 305 | + static FieldType fieldTypeFromProto(SchemaApi.FieldType protoFieldType) { |
301 | 306 | FieldType fieldType = fieldTypeFromProtoWithoutNullable(protoFieldType); |
302 | 307 |
|
303 | 308 | if (protoFieldType.getNullable()) { |
@@ -426,26 +431,32 @@ private static FieldType fieldTypeFromProtoWithoutNullable(SchemaApi.FieldType p |
426 | 431 | return FieldType.DATETIME; |
427 | 432 | } else if (urn.equals(URN_BEAM_LOGICAL_DECIMAL)) { |
428 | 433 | return FieldType.DECIMAL; |
429 | | - } else if (urn.equals(URN_BEAM_LOGICAL_JAVASDK)) { |
430 | | - return FieldType.logicalType( |
431 | | - (LogicalType) |
432 | | - SerializableUtils.deserializeFromByteArray( |
433 | | - logicalType.getPayload().toByteArray(), "logicalType")); |
434 | | - } else { |
435 | | - @Nullable FieldType argumentType = null; |
436 | | - @Nullable Object argumentValue = null; |
437 | | - if (logicalType.hasArgumentType()) { |
438 | | - argumentType = fieldTypeFromProto(logicalType.getArgumentType()); |
439 | | - argumentValue = fieldValueFromProto(argumentType, logicalType.getArgument()); |
| 434 | + } else if (urn.startsWith("beam:logical_type:")) { |
| 435 | + try { |
| 436 | + return FieldType.logicalType( |
| 437 | + (LogicalType) |
| 438 | + SerializableUtils.deserializeFromByteArray( |
| 439 | + logicalType.getPayload().toByteArray(), "logicalType")); |
| 440 | + } catch (IllegalArgumentException e) { |
| 441 | + LOG.warn( |
| 442 | + "Unable to deserialize the logical type {} from proto. Mark as UnknownLogicalType.", |
| 443 | + urn); |
440 | 444 | } |
441 | | - return FieldType.logicalType( |
442 | | - new UnknownLogicalType( |
443 | | - urn, |
444 | | - logicalType.getPayload().toByteArray(), |
445 | | - argumentType, |
446 | | - argumentValue, |
447 | | - fieldTypeFromProto(logicalType.getRepresentation()))); |
448 | 445 | } |
| 446 | + // assemble an UnknownLogicalType |
| 447 | + @Nullable FieldType argumentType = null; |
| 448 | + @Nullable Object argumentValue = null; |
| 449 | + if (logicalType.hasArgumentType()) { |
| 450 | + argumentType = fieldTypeFromProto(logicalType.getArgumentType()); |
| 451 | + argumentValue = fieldValueFromProto(argumentType, logicalType.getArgument()); |
| 452 | + } |
| 453 | + return FieldType.logicalType( |
| 454 | + new UnknownLogicalType( |
| 455 | + urn, |
| 456 | + logicalType.getPayload().toByteArray(), |
| 457 | + argumentType, |
| 458 | + argumentValue, |
| 459 | + fieldTypeFromProto(logicalType.getRepresentation()))); |
449 | 460 | default: |
450 | 461 | throw new IllegalArgumentException( |
451 | 462 | "Unexpected type_info: " + protoFieldType.getTypeInfoCase()); |
|
0 commit comments