You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2011/03/29 22:34:13 UTC
svn commit: r1086727 - in /avro/trunk: ./
lang/java/avro/src/main/java/org/apache/avro/generic/
lang/java/avro/src/main/java/org/apache/avro/reflect/
lang/java/avro/src/main/java/org/apache/avro/specific/
lang/java/ipc/src/test/java/org/apache/avro/
Author: cutting
Date: Tue Mar 29 20:34:13 2011
New Revision: 1086727
URL: http://svn.apache.org/viewvc?rev=1086727&view=rev
Log:
AVRO-786. Java: Fix equals() to work on objects containing maps.
Modified:
avro/trunk/CHANGES.txt
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestSchema.java
Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1086727&r1=1086726&r2=1086727&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Tue Mar 29 20:34:13 2011
@@ -14,6 +14,8 @@ Avro 1.5.1 (unreleased)
BUG FIXES
+ AVRO-786. Java: Fix equals() to work on objects containing maps. (cutting)
+
Avro 1.5.0 (10 March 2011)
INCOMPATIBLE CHANGES
Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java?rev=1086727&r1=1086726&r2=1086727&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java Tue Mar 29 20:34:13 2011
@@ -70,7 +70,7 @@ public class GenericData {
Record that = (Record)o;
if (!schema.getFullName().equals(that.schema.getFullName()))
return false; // not the same schema
- return this.compareTo(that) == 0;
+ return GenericData.get().compare(this, that, schema, true) == 0;
}
@Override public int hashCode() {
return GenericData.get().hashCode(this, schema);
@@ -609,8 +609,14 @@ public class GenericData {
* greater-than, return 1, if less than return -1. Order is consistent with
* that of {@link BinaryData#compare(byte[], int, byte[], int, Schema)}.
*/
- @SuppressWarnings(value="unchecked")
public int compare(Object o1, Object o2, Schema s) {
+ return compare(o1, o2, s, false);
+ }
+
+ /** Comparison implementation. When equals is true, only checks for equality,
+ * not for order. */
+ @SuppressWarnings(value="unchecked")
+ protected int compare(Object o1, Object o2, Schema s, boolean equals) {
if (o1 == o2) return 0;
switch (s.getType()) {
case RECORD:
@@ -620,7 +626,8 @@ public class GenericData {
int pos = f.pos();
String name = f.name();
int compare =
- compare(getField(o1, name, pos), getField(o2, name, pos), f.schema());
+ compare(getField(o1, name, pos), getField(o2, name, pos),
+ f.schema(), equals);
if (compare != 0) // not equal
return f.order() == Field.Order.DESCENDING ? -compare : compare;
}
@@ -634,17 +641,19 @@ public class GenericData {
Iterator e2 = a2.iterator();
Schema elementType = s.getElementType();
while(e1.hasNext() && e2.hasNext()) {
- int compare = compare(e1.next(), e2.next(), elementType);
+ int compare = compare(e1.next(), e2.next(), elementType, equals);
if (compare != 0) return compare;
}
return e1.hasNext() ? 1 : (e2.hasNext() ? -1 : 0);
case MAP:
+ if (equals)
+ return ((Map)o1).equals(o2) ? 0 : 1;
throw new AvroRuntimeException("Can't compare maps!");
case UNION:
int i1 = resolveUnion(s, o1);
int i2 = resolveUnion(s, o2);
return (i1 == i2)
- ? compare(o1, o2, s.getTypes().get(i1))
+ ? compare(o1, o2, s.getTypes().get(i1), equals)
: i1 - i2;
case NULL:
return 0;
Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java?rev=1086727&r1=1086726&r2=1086727&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java Tue Mar 29 20:34:13 2011
@@ -449,7 +449,7 @@ public class ReflectData extends Specifi
}
@Override
- public int compare(Object o1, Object o2, Schema s) {
+ protected int compare(Object o1, Object o2, Schema s, boolean equals) {
switch (s.getType()) {
case ARRAY:
if (!o1.getClass().isArray())
@@ -461,7 +461,7 @@ public class ReflectData extends Specifi
for (int i = 0; i < l; i++) {
int compare = compare(java.lang.reflect.Array.get(o1, i),
java.lang.reflect.Array.get(o2, i),
- elementType);
+ elementType, equals);
if (compare != 0) return compare;
}
return l1 - l2;
@@ -472,7 +472,7 @@ public class ReflectData extends Specifi
byte[] b2 = (byte[])o2;
return BinaryData.compareBytes(b1, 0, b1.length, b2, 0, b2.length);
}
- return super.compare(o1, o2, s);
+ return super.compare(o1, o2, s, equals);
}
}
Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java?rev=1086727&r1=1086726&r2=1086727&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java Tue Mar 29 20:34:13 2011
@@ -189,13 +189,13 @@ public class SpecificData extends Generi
}
@Override
- public int compare(Object o1, Object o2, Schema s) {
+ protected int compare(Object o1, Object o2, Schema s, boolean eq) {
switch (s.getType()) {
case ENUM:
if (o1 instanceof Enum)
return ((Enum)o1).ordinal() - ((Enum)o2).ordinal();
default:
- return super.compare(o1, o2, s);
+ return super.compare(o1, o2, s, eq);
}
}
Modified: avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestSchema.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestSchema.java?rev=1086727&r1=1086726&r2=1086727&view=diff
==============================================================================
--- avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestSchema.java (original)
+++ avro/trunk/lang/java/ipc/src/test/java/org/apache/avro/TestSchema.java Tue Mar 29 20:34:13 2011
@@ -200,6 +200,20 @@ public class TestSchema {
}
@Test
+ public void testMapInRecord() throws Exception {
+ String json = "{\"type\":\"record\", \"name\":\"Test\", \"fields\":"
+ +"[{\"name\":\"f\", \"type\": {\"type\":\"map\", \"values\":\"long\"}}]}";
+ Schema schema = Schema.parse(json);
+
+ HashMap<Utf8,Long> map = new HashMap<Utf8,Long>();
+ map.put(new Utf8("a"), 1L);
+ GenericData.Record record = new GenericData.Record(schema);
+ record.put("f", map);
+ check(json, "{\"f\":{\"a\":1}}", record, false);
+ }
+
+
+ @Test
public void testEnum() throws Exception {
check(BASIC_ENUM_SCHEMA, "\"B\"",
new GenericData.EnumSymbol(Schema.parse(BASIC_ENUM_SCHEMA), "B"),