You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Ryan Skraba (Jira)" <ji...@apache.org> on 2021/08/26 15:24:00 UTC

[jira] [Commented] (AVRO-2493) Unable to register Logical Type for custom Conversion class

    [ https://issues.apache.org/jira/browse/AVRO-2493?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17405302#comment-17405302 ] 

Ryan Skraba commented on AVRO-2493:
-----------------------------------

Just a quick comment for future reference: it looks like this is fixed for IDL by the same commit.  The correct IDL that corresponds to the test case would be:

{code}
@namespace("org.apache.avro.codegentest.testdata")
protocol CustConv {

  /** Test unions with logical types in generated Java classes */
  record LogicalTypesWithCustomConversion {

    union {
      null,
      decimal(9,2)
    } nullableCustomField = null;

    decimal(9,2) nonNullCustomField;

    union {
      null,
      @logicalType("fixed-size-string")
      @minLength(1)
      @maxLength(50)
      bytes
    } nullableFixedSizeString = null;

    @logicalType("fixed-size-string")
    @minLength(1)
    @maxLength(50)
    bytes nonNullFixedSizeString;
  }
}
{code}

You can specify the extra logical type properties just by an annotation, and the unit test relies on a default value being set.

This might be worth adding to the integration test as a example we can point to!

> Unable to register Logical Type for custom Conversion class
> -----------------------------------------------------------
>
>                 Key: AVRO-2493
>                 URL: https://issues.apache.org/jira/browse/AVRO-2493
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java, logical types
>    Affects Versions: 1.9.0
>            Reporter: Travis Yocum
>            Assignee: Pavel Likin
>            Priority: Major
>             Fix For: 1.10.0
>
>
> I have created a custom conversion class for Java's (1.8) java.time.OffsetDateTime.
> {code:java}
> public class OffsetDateTimeConversion extends Conversion<OffsetDateTime> {
>     private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnnZZZZZ");
>     @Override
>     public Class<OffsetDateTime> getConvertedType() {
>         return OffsetDateTime.class;
>     }
>     @Override
>     public String getLogicalTypeName() {
>         return "offset-date-time";
>     }
>     @Override
>     public OffsetDateTime fromCharSequence(CharSequence value, Schema schema, LogicalType type) {
>         return OffsetDateTime.parse(value, DATE_TIME_FORMATTER);
>     }
>     @Override
>     public CharSequence toCharSequence(OffsetDateTime value, Schema schema, LogicalType type) {
>         return value.format(DATE_TIME_FORMATTER);
>     }
> }
> {code}
>  And my simple schema to test (including a field that uses the built-in "time-millis" converter in Avro 1.9 for testing purposes):
> TimeTest.avsc
>  
> {code:java}
> {
>    "type": "record",
>    "name": "TimeTest",
>    "namespace": "time.test",
>    "fields": [
>       {
>            "name": "createTime",
>            "type": {
>                "type": "int",
>                "logicalType": "time-millis"
>            }
>       },
>       {
>            "name": "createDateTime",
>            "type": {
>                "type": "string",
>                "logicalType": "offset-date-time"
>            }
>       }
>    ]
> }
> {code}
>  
> I've also created a LogicalType for my conversion field that I need to register:
>  
> {code:java}
> public class OffsetDateTimeLogicalType extends LogicalType {
>     public static final String LOGICAL_DATE_TIME_NAME = "offset-date-time";
>     public OffsetDateTimeLogicalType() {
>         super(LOGICAL_DATE_TIME_NAME);
>     }
>     @Override
>     public void validate(Schema schema) {
>         super.validate(schema);
>         if (schema.getType() != Schema.Type.STRING) {
>             throw new IllegalArgumentException("Logical type 'offset-date-time' must be of type string");
>         }
>     }
> }{code}
>  
> I've been debugging the avro-maven-plugin and have been able to pinpoint where my issue is occurring while parsing the schema:
>  
> {code:java}
> // parse logical type if present
> result.logicalType = LogicalTypes.fromSchemaIgnoreInvalid(result);
> {code}
>  
> The schema's "logicalType" property is being set to null because it's not a registered logical type.
> The code I need to execute is:
>  
> {code:java}
> LogicalTypes.register(getLogicalTypeName(), schema -> new OffsetDateTimeLogicalType());
> {code}
> Without modifying the plugin code, I see no way to execute this register so that the Schema.parse method (which is called before the conversion class is executed) will recognize this LogicalType.
>  
> The plugin has a config property <enableDecimalLogicalType> to allow for registering the Decimal logical types but nothing to enable other logical types.
> Am I missing something or is this a real issue?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)