[
https://issues.apache.org/jira/browse/AVRO-4036?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Krzysztof Barczynski updated AVRO-4036:
---------------------------------------
Description:
There is a unit test which shows what's the issue:
*
[https://github.com/krisso-rtb/avro-custom-logical-types/blob/avro-1.12.0-test-case-for-weird-equals/custom-logical-types-used/src/test/java/com/rtbhouse/custom/logical/types/SerializeDeserializeTest.java]
Most important part is block of code around line 40.
In version 1.12.0 implementation of *equals()* has been changed to
{code:java}
public boolean equals(final Object o) {
if (!(o instanceof Collection)) {
return false;
}
return GenericData.get().compare(this, o, this.getSchema()) == 0;
}
{code}
which fails when logical types are used.
More precisely: when record's field is an array of union of "null" and logical
type.
----
Basically when originalPoi and deserializedPoi are Java class instances and
{code:java}
originalPoi.getLocations().equals(deserializedPoi.getLocations()) == true {code}
then
{code:java}
deserializedPoi.getLocations().equals(originalPoi.getLocations()) {code}
should be also true but it throws an exception:
{code:java}
org.apache.avro.AvroRuntimeException: Unknown datum type
com.rtbhouse.custom.logical.types.LatLon: LatLon[latitude=30.123,
longitude=-90.98762]
at org.apache.avro.generic.GenericData.getSchemaName(GenericData.java:975)
at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:934)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1310)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1286)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1300)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1201)
at
org.apache.avro.generic.GenericData$AbstractArray.equals(GenericData.java:357)
at
com.rtbhouse.custom.logical.types.SerializeDeserializeTest.shouldSerializeAndDeserializeAvro(SerializeDeserializeTest.java:46){code}
was:
There is a unit test which shows what's the issue:
*
[https://github.com/krisso-rtb/avro-custom-logical-types/blob/avro-1.12.0-test-case-for-weird-equals/custom-logical-types-used/src/test/java/com/rtbhouse/custom/logical/types/SerializeDeserializeTest.java]
Most important part is block of code around line 40.
In version 1.12.0 implementation of *equals()* has been changed to
{code:java}
public boolean equals(final Object o) {
if (!(o instanceof Collection)) {
return false;
}
return GenericData.get().compare(this, o, this.getSchema()) == 0;
}
{code}
which fails when logical types are used.
More precisely: when record's field is an array of union of "null" and logical
type.
----
Basically when originalPoi and deserializedPoi are Java class instances and
{code:java}
originalPoi.getLocations().equals(deserializedPoi.getLocations()) == true {code}
then
{code:java}
deserializedPoi.getLocations().equals(originalPoi.getLocations()) {code}
should be also true but it throws an exception:
{code:java}
org.apache.avro.AvroRuntimeException: Unknown datum type
com.rtbhouse.custom.logical.types.LatLon: LatLon[latitude=30.123,
longitude=-90.98762]
at org.apache.avro.generic.GenericData.getSchemaName(GenericData.java:975)
at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:934)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1310)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1286)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1300)
at org.apache.avro.generic.GenericData.compare(GenericData.java:1201)
at
org.apache.avro.generic.GenericData$AbstractArray.equals(GenericData.java:357)
at
com.rtbhouse.custom.logical.types.SerializeDeserializeTest.shouldSerializeAndDeserializeAvro(SerializeDeserializeTest.java:46){code}
> GenericData.Array.equals() method does not adhere to standards
> --------------------------------------------------------------
>
> Key: AVRO-4036
> URL: https://issues.apache.org/jira/browse/AVRO-4036
> Project: Apache Avro
> Issue Type: Bug
> Components: java
> Affects Versions: 1.12.0
> Environment: Avro 1.12.0
> JDK 21
> Maven
>
> Reporter: Krzysztof Barczynski
> Priority: Major
>
> There is a unit test which shows what's the issue:
> *
> [https://github.com/krisso-rtb/avro-custom-logical-types/blob/avro-1.12.0-test-case-for-weird-equals/custom-logical-types-used/src/test/java/com/rtbhouse/custom/logical/types/SerializeDeserializeTest.java]
> Most important part is block of code around line 40.
> In version 1.12.0 implementation of *equals()* has been changed to
> {code:java}
> public boolean equals(final Object o) {
> if (!(o instanceof Collection)) {
> return false;
> }
> return GenericData.get().compare(this, o, this.getSchema()) == 0;
> }
> {code}
> which fails when logical types are used.
> More precisely: when record's field is an array of union of "null" and
> logical type.
> ----
> Basically when originalPoi and deserializedPoi are Java class instances and
> {code:java}
> originalPoi.getLocations().equals(deserializedPoi.getLocations()) == true
> {code}
> then
> {code:java}
> deserializedPoi.getLocations().equals(originalPoi.getLocations()) {code}
> should be also true but it throws an exception:
> {code:java}
> org.apache.avro.AvroRuntimeException: Unknown datum type
> com.rtbhouse.custom.logical.types.LatLon: LatLon[latitude=30.123,
> longitude=-90.98762]
> at org.apache.avro.generic.GenericData.getSchemaName(GenericData.java:975)
> at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:934)
> at org.apache.avro.generic.GenericData.compare(GenericData.java:1310)
> at org.apache.avro.generic.GenericData.compare(GenericData.java:1286)
> at org.apache.avro.generic.GenericData.compare(GenericData.java:1300)
> at org.apache.avro.generic.GenericData.compare(GenericData.java:1201)
> at
> org.apache.avro.generic.GenericData$AbstractArray.equals(GenericData.java:357)
> at
> com.rtbhouse.custom.logical.types.SerializeDeserializeTest.shouldSerializeAndDeserializeAvro(SerializeDeserializeTest.java:46){code}
>
>
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)