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

Ryan Blue commented on AVRO-680:
--------------------------------

bq. For user-defined classes like `Map<Foo, Bar>`, we cannot generate 
`FooBarPair` because the Foo/Bar names may be present in multiple packages.

True, but this is only a problem if you have a conflict that is used in the 
same position in the resulting Avro schema. So you need both {{one.Foo}} and 
{{two.Foo}} classes, present in the same Avro schema, both used as keys (or 
both used as values), and paired with the same type. That seems unlikely enough 
that I'm comfortable with it. Otherwise, we could restrict it to just primitive 
types.

bq. Can you give me the code which did not give array schema for a non-string 
map?

{code:java}
Map<Integer, String> m = new HashMap<Integer, String>();
m.put(34, "s");
ReflectData.get().getSchema(m);
{code}

bq. we changed [normal array write logic] to the current implementation based 
on some discussion that happened above

I think you're referring to this comment:

bq. Apparently, it isn't exactly possible to call 
ReflectDatumWriter#writeNonStringMap() from inside 
ReflectDatumWriter#writeArray(). This is so because if that happens, then it 
means the array-part of non-string-map is already processed and we are at the 
individual record level. And at this level, we cannot distinguish the map-entry 
from a normal array-element. Due to this, mapEntry.getKey() and 
mapEntry.getValue() could not be called, leading us back to relying on the 
names "key" and "value".

Does this still apply? In {{ReflectDatumWriter#writeNonStringMap}}, you call 
{{writeField(mapEntry, keyField, outEnc, state)}} that doesn't call 
{{mapEntry.getKey()}}. It looks like you use the accessor and rely on the 
field's name being "key" anyway. It would also make sense to have the accessor 
fall back to {{Map.Entry#getKey()}} if the underlying field isn't available. I 
think you might be able to change back to the regular array logic now.

> Allow for non-string keys
> -------------------------
>
>                 Key: AVRO-680
>                 URL: https://issues.apache.org/jira/browse/AVRO-680
>             Project: Avro
>          Issue Type: Improvement
>    Affects Versions: 1.7.6, 1.7.7
>            Reporter: Jeremy Hanna
>         Attachments: AVRO-680.patch, AVRO-680.patch, PERF_8000_cycles.zip, 
> isMap_Call_Hierarchy.png, non_string_map_keys.zip, non_string_map_keys2.zip, 
> non_string_map_keys3.zip, non_string_map_keys4.patch, 
> non_string_map_keys5.patch, non_string_map_keys6.patch, 
> non_string_map_keys7.patch, non_string_map_perf.txt, 
> non_string_map_perf2.txt, original_perf.txt
>
>
> Based on an email thread back in April, Doug Cutting proposed a possible 
> solution for having non-string keys:
> Stu Hood wrote:
> > I can understand the reasoning behind AVRO-9, but now I need to look for an 
> > alternative to a 'map' that will allow me to store an association of bytes 
> > keys to values.
> A map of Foo has the same binary format as an array of records, each
> with a string field and a Foo field.  So an application can use an array
> schema similar to this to represent map-like structures with, e.g.,
> non-string keys.
> Perhaps we could establish standard properties that indicate that a
> given array of records should be represented in a map-like way if
> possible?  E.g.,:
> {"type": "array", "isMap": true, "items": {"type":"record", ...}}
> Doug



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to