You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by dk...@apache.org on 2018/12/10 20:14:58 UTC

[avro] branch master updated: [AVRO-2058] Fix issues with Utf8 keys maps being treated as non-strings This closes #237

This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/master by this push:
     new 269d0ff  [AVRO-2058] Fix issues with Utf8 keys maps being treated as non-strings This closes #237
269d0ff is described below

commit 269d0ff7d3025cf3370023e353a373916dd67433
Author: Daniel Kulp <dk...@apache.org>
AuthorDate: Mon Dec 10 15:13:30 2018 -0500

    [AVRO-2058] Fix issues with Utf8 keys maps being treated as non-strings
    This closes #237
    
    commit 8852da40e7a0ee58d9b027173a4972e7e71b432d
    Author: Sam Schlegel <gi...@lutin.us>
    Date:   Wed Jul 26 19:20:51 2017 -0700
    
        Add failing test
---
 .../src/main/java/org/apache/avro/reflect/ReflectData.java    |  2 +-
 .../src/main/java/org/apache/avro/specific/SpecificData.java  |  7 ++++++-
 .../src/test/java/org/apache/avro/reflect/TestReflect.java    | 11 +++++++++++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
index 6e9b779..10dab93 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
@@ -378,7 +378,7 @@ public class ReflectData extends SpecificData {
       Map m = (Map)datum;
       if (m.size() > 0) {
         Class keyClass = m.keySet().iterator().next().getClass();
-        if (isStringable(keyClass) || keyClass == String.class)
+        if (isStringable(keyClass) || isStringType(keyClass))
           return false;
         return true;
       }
diff --git a/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java b/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
index d7b2bf8..21c8d8c 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
@@ -351,10 +351,15 @@ public class SpecificData extends GenericData {
     return super.getSchemaName(datum);
   }
 
-  /** True iff a class should be serialized with toString(). */
+  /** True if a class should be serialized with toString(). */
   protected boolean isStringable(Class<?> c) {
     return stringableClasses.contains(c);
   }
+  /** True if a class IS a string type */
+  protected boolean isStringType(Class<?> c) {
+    // this will return true for String, Utf8, CharSequence
+    return CharSequence.class.isAssignableFrom(c);
+  }
 
   /** Return the protocol for a Java interface. */
   public Protocol getProtocol(Class iface) {
diff --git a/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java b/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
index c58030d..d667d55 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/reflect/TestReflect.java
@@ -35,6 +35,8 @@ import org.apache.avro.io.DecoderFactory;
 import org.apache.avro.io.Encoder;
 import org.apache.avro.io.EncoderFactory;
 import org.apache.avro.reflect.TestReflect.SampleRecord.AnotherSampleRecord;
+import org.apache.avro.util.Utf8;
+
 import org.junit.Test;
 
 public class TestReflect {
@@ -110,6 +112,15 @@ public class TestReflect {
     assertEquals(1, data.resolveUnion(s, new HashMap<String,Float>()));
   }
 
+  @Test public void testUnionWithMapWithUtf8Keys() {
+    Schema s = new Schema.Parser().parse
+      ("[\"null\", {\"type\":\"map\",\"values\":\"float\"}]");
+    GenericData data = ReflectData.get();
+    HashMap<Utf8,Float> map = new HashMap<Utf8,Float>();
+    map.put(new Utf8("foo"), 1.0f);
+    assertEquals(1, data.resolveUnion(s, map));
+  }
+
   @Test public void testUnionWithFixed() {
     Schema s = new Schema.Parser().parse
         ("[\"null\", {\"type\":\"fixed\",\"name\":\"f\",\"size\":1}]");