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}]");