[ 
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)

Reply via email to