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 ef8349f AVRO-2340: Use JDK compareTo and hashcode Methods
ef8349f is described below
commit ef8349ffd6da5c6f4693ac46548c96e22eeb7cd7
Author: Beluga Behr <[email protected]>
AuthorDate: Thu Mar 7 11:25:32 2019 -0500
AVRO-2340: Use JDK compareTo and hashcode Methods
---
.../java/org/apache/avro/generic/GenericData.java | 2 +-
.../main/java/org/apache/avro/io/BinaryData.java | 81 +++++++++-------------
.../java/org/apache/avro/reflect/ReflectData.java | 2 +-
3 files changed, 35 insertions(+), 50 deletions(-)
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
index f26b88e..e18acfb 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
@@ -989,7 +989,7 @@ public class GenericData {
int i2 = resolveUnion(s, o2);
return (i1 == i2)
? compare(o1, o2, s.getTypes().get(i1), equals)
- : i1 - i2;
+ : Integer.compare(i1, i2);
case NULL:
return 0;
case STRING:
diff --git a/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java
b/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java
index 06abfc6..4bc4d5c 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java
@@ -90,21 +90,23 @@ public class BinaryData {
continue;
}
int c = compare(d, field.schema());
- if (c != 0)
+ if (c != 0) {
return (field.order() != Field.Order.DESCENDING) ? c : -c;
+ }
}
return 0;
}
- case ENUM: case INT: {
- int i1 = d1.readInt();
- int i2 = d2.readInt();
- return i1 == i2 ? 0 : (i1 > i2 ? 1 : -1);
- }
- case LONG: {
- long l1 = d1.readLong();
- long l2 = d2.readLong();
- return l1 == l2 ? 0 : (l1 > l2 ? 1 : -1);
- }
+ case ENUM:
+ case INT:
+ return Integer.compare(d1.readInt(), d2.readInt());
+ case LONG:
+ return Long.compare(d1.readLong(), d2.readLong());
+ case FLOAT:
+ return Float.compare(d1.readFloat(), d2.readFloat());
+ case DOUBLE:
+ return Double.compare(d1.readDouble(), d2.readDouble());
+ case BOOLEAN:
+ return Boolean.compare(d1.readBoolean(), d2.readBoolean());
case ARRAY: {
long i = 0; // position in array
long r1 = 0, r2 = 0; // remaining in current block
@@ -121,7 +123,7 @@ public class BinaryData {
l2 += r2;
}
if (r1 == 0 || r2 == 0) // empty block: done
- return (l1 == l2) ? 0 : ((l1 > l2) ? 1 : -1);
+ return Long.compare(l1, l2);
long l = Math.min(l1, l2);
while (i < l) { // compare to end of block
int c = compare(d, schema.getElementType());
@@ -135,11 +137,8 @@ public class BinaryData {
case UNION: {
int i1 = d1.readInt();
int i2 = d2.readInt();
- if (i1 == i2) {
- return compare(d, schema.getTypes().get(i1));
- } else {
- return i1 - i2;
- }
+ int c = Integer.compare(i1, i2);
+ return c == 0 ? compare(d, schema.getTypes().get(i1)) : c;
}
case FIXED: {
int size = schema.getFixedSize();
@@ -149,7 +148,8 @@ public class BinaryData {
d.d2.skipFixed(size);
return c;
}
- case STRING: case BYTES: {
+ case STRING:
+ case BYTES: {
int l1 = d1.readInt();
int l2 = d2.readInt();
int c = compareBytes(d.d1.getBuf(), d.d1.getPos(), l1,
@@ -158,20 +158,6 @@ public class BinaryData {
d.d2.skipFixed(l2);
return c;
}
- case FLOAT: {
- float f1 = d1.readFloat();
- float f2 = d2.readFloat();
- return (f1 == f2) ? 0 : ((f1 > f2) ? 1 : -1);
- }
- case DOUBLE: {
- double f1 = d1.readDouble();
- double f2 = d2.readDouble();
- return (f1 == f2) ? 0 : ((f1 > f2) ? 1 : -1);
- }
- case BOOLEAN:
- boolean b1 = d1.readBoolean();
- boolean b2 = d2.readBoolean();
- return (b1 == b2) ? 0 : (b1 ? 1 : -1);
case NULL:
return 0;
default:
@@ -234,28 +220,29 @@ public class BinaryData {
GenericDatumReader.skip(field.schema(), decoder);
continue;
}
- hashCode = hashCode*31 + hashCode(data, field.schema());
+ hashCode = hashCode * 31 + hashCode(data, field.schema());
}
return hashCode;
}
- case ENUM: case INT:
+ case ENUM:
+ case INT:
return decoder.readInt();
+ case BOOLEAN:
+ return Boolean.hashCode(decoder.readBoolean());
case FLOAT:
- return Float.floatToIntBits(decoder.readFloat());
- case LONG: {
- long l = decoder.readLong();
- return (int)(l^(l>>>32));
- }
- case DOUBLE: {
- long l = Double.doubleToLongBits(decoder.readDouble());
- return (int)(l^(l>>>32));
- }
+ return Float.hashCode(decoder.readFloat());
+ case LONG:
+ return Long.hashCode(decoder.readLong());
+ case DOUBLE:
+ return Double.hashCode(decoder.readDouble());
case ARRAY: {
Schema elementType = schema.getElementType();
int hashCode = 1;
- for (long l = decoder.readArrayStart(); l != 0; l = decoder.arrayNext())
- for (long i = 0; i < l; i++)
- hashCode = hashCode*31 + hashCode(data, elementType);
+ for (long l = decoder.readArrayStart(); l != 0; l = decoder.arrayNext())
{
+ for (long i = 0; i < l; i++) {
+ hashCode = hashCode * 31 + hashCode(data, elementType);
+ }
+ }
return hashCode;
}
case MAP:
@@ -268,8 +255,6 @@ public class BinaryData {
return hashBytes(0, data, decoder.readInt(), false);
case BYTES:
return hashBytes(1, data, decoder.readInt(), true);
- case BOOLEAN:
- return decoder.readBoolean() ? 1231 : 1237;
case NULL:
return 0;
default:
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 3d2c30f..864b84e 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
@@ -866,7 +866,7 @@ public class ReflectData extends SpecificData {
elementType, equals);
if (compare != 0) return compare;
}
- return l1 - l2;
+ return Integer.compare(l1, l2);
case BYTES:
if (!o1.getClass().isArray())
break;