You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Frank Grimes (Jira)" <ji...@apache.org> on 2020/11/03 21:50:00 UTC

[jira] [Commented] (AVRO-2943) Map comparison between Utf8 and String keys fails

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

Frank Grimes commented on AVRO-2943:
------------------------------------

Yes, the problem arises because the AVDL/AVSC schema just specifies a type as `string`. However, depending on how code is generated it'll either be a java.lang.String or an org.apache.avro.util.Utf8.

We'd like comparisons to be agnostic to the `stringType` used during SpecificRecord code generation (e.g. through the Avro maven plugin)

This is already handled when comparing record string fields but isn't handled for either Maps or Arrays (collections).

Could probably also consider doing the same for Avro `ARRAY` types as well... I'll try to find time to submit a PR for this. If it looks good and gets accepted I can make another PR for ARRAY types.

> Map comparison between Utf8 and String keys fails
> -------------------------------------------------
>
>                 Key: AVRO-2943
>                 URL: https://issues.apache.org/jira/browse/AVRO-2943
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.10.0
>         Environment: Mac OS Catalina 10.15.6
>  
> openjdk version "1.8.0_265"
> OpenJDK Runtime Environment Corretto-8.265.01.1 (build 1.8.0_265-b01)
> OpenJDK 64-Bit Server VM Corretto-8.265.01.1 (build 25.265-b01, mixed mode)
>            Reporter: Frank Grimes
>            Priority: Major
>         Attachments: AVRO-2943-frankgrimes97.patch
>
>
> The following test I locally added to org.apache.avro.generic.TestGenericData on master demonstrates the problem:
> {code:java}
>   @Test
>   public void testMapKeyEquals() {
>     Schema mapSchema = new Schema.Parser().parse("{\"type\": \"map\", \"values\": \"string\"}");
>     Field myMapField = new Field("my_map", Schema.createMap(mapSchema), null, null);
>     Schema schema = Schema.createRecord("my_record", "doc", "mytest", false);
>     schema.setFields(Arrays.asList(myMapField));
>     GenericRecord r0 = new GenericData.Record(schema);
>     GenericRecord r1 = new GenericData.Record(schema);
>     HashMap<CharSequence, String> pair1 = new HashMap<>();
>     pair1.put("keyOne", "valueOne");
>     r0.put("my_map", pair1);
>     HashMap<CharSequence, String> pair2 = new HashMap<>();
>     pair2.put(new Utf8("keyOne"), "valueOne");
>     r1.put("my_map", pair2);
>     assertEquals(r0, r1);
>     assertEquals(r1, r0);
>   }
> {code}



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