Werner Daehn created AVRO-2495:
----------------------------------

             Summary: Java: LogicalTypes not implemented nicely
                 Key: AVRO-2495
                 URL: https://issues.apache.org/jira/browse/AVRO-2495
             Project: Apache Avro
          Issue Type: Improvement
          Components: java
    Affects Versions: 1.9.0
            Reporter: Werner Daehn


I'd like to use this Jira as a boilerplate for a couple of issues in the 
LogicalType handling. Will split those into individual ones, once it has been 
confirmed I am not completely wrong.

 

Generally speaking, the LogicalTypes and their backing with a native type is 
quite nice but from a usability point of view there are multiple areas where we 
could do better.
 # Provided LogicalTypes and custom LogicalTypes are handled differently. The 
latter are registered via LogicalTypes.register(), the provided ones are all 
hardcoded.
 # Java <–> Avro conversion is not nice. From a user perspective, I'd like to 
set a record via record.put("timestampmillis_column", LocalDateTime.now()); So 
by providing one of many possible value objects like Date, Instant, 
LocalDateTime,... even s proper formatted string. Another example is the amount 
of code you have to write in order to set a Decimal. When all the user wants is 
to say record.put("Quantity", 1.2). see below
 # toString() of a record does not consider LogicalTypes, e.g. a BigDecimal is 
shown as the backing \u0000\u00FF value instead of a human readable format.
 # Where ever a value is used, you have to check if there is a logical type. If 
not use the base type. This can be done better.
 # Lacking extension points. Imagine I want to extend the TimestampMillis 
LogicalType to add my own code. Not possible. First because how the LogicalType 
is created and second because constructors are private.

Do you agree or am I missing an important point?

 

{{{{DecimalConversion DECIMAL_CONVERTER = new DecimalConversion();
}}}}{{{{Schema s = item.getSchema().getField("Quantity").schema();
}}}}{{{{Decimal l = (Decimal) s.getLogicalType();
}}}}{{{{BigDecimal d = BigDecimal.valueOf(4.0).setScale(l.getScale());
}}}}{{{{ByteBuffer value = DECIMAL_CONVERTER.toBytes(d, null, l);
}}}}{{{{item.put("Quantity", value);}}}}



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to