Author: cutting Date: Fri Dec 9 20:27:29 2011 New Revision: 1212611 URL: http://svn.apache.org/viewvc?rev=1212611&view=rev Log: AVRO-972. Java: Add support for Infinity and NaN as default values for float and double. Modified: avro/trunk/CHANGES.txt avro/trunk/lang/java/avro/src/main/java/org/apache/avro/Schema.java avro/trunk/lang/java/compiler/src/main/javacc/org/apache/avro/compiler/idl/idl.jj avro/trunk/lang/java/compiler/src/test/idl/input/simple.avdl avro/trunk/lang/java/compiler/src/test/idl/output/simple.avpr 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=1212611&r1=1212610&r2=1212611&view=diff ============================================================================== --- avro/trunk/CHANGES.txt (original) +++ avro/trunk/CHANGES.txt Fri Dec 9 20:27:29 2011 @@ -14,6 +14,11 @@ Avro 1.6.2 (unreleased) AVRO-953. Python: Permit users to override HTTP path in RPC. (Craig Landry via cutting) + AVRO-972. Java: Add support for Infinity and NaN as default values + for float and double. Since JSON does not permit these as numeric + types, we use the strings "NaN", "Infinity" and "-Infinity" in + schemas. These are also permitted in IDL. (cutting) + BUG FIXES AVRO-962. Java: Fix Maven plugin to support string type override. Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/Schema.java URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/Schema.java?rev=1212611&r1=1212610&r2=1212611&view=diff ============================================================================== --- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/Schema.java (original) +++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/Schema.java Fri Dec 9 20:27:29 2011 @@ -41,6 +41,7 @@ import org.codehaus.jackson.JsonParseExc import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.node.DoubleNode; /** An abstract data type. *
A schema may be one of:
@@ -443,14 +444,19 @@ public abstract class Schema {
Field that = (Field) other;
return (name.equals(that.name)) &&
(schema.equals(that.schema)) &&
- (defaultValue == null
- ? that.defaultValue == null
- : (defaultValue.equals(that.defaultValue))) &&
- (order.equals(that.order)) &&
+ defaultValueEquals(that.defaultValue) &&
props.equals(that.props);
}
public int hashCode() { return name.hashCode() + schema.computeHash(); }
+ private boolean defaultValueEquals(JsonNode thatDefaultValue) {
+ if (defaultValue == null)
+ return thatDefaultValue == null;
+ if (Double.isNaN(defaultValue.getValueAsDouble()))
+ return Double.isNaN(thatDefaultValue.getValueAsDouble());
+ return defaultValue.equals(thatDefaultValue);
+ }
+
@Override
public String toString() {
return name + " type:" + schema.type + " pos:" + position;
@@ -1137,8 +1143,15 @@ public abstract class Schema {
JsonNode orderNode = field.get("order");
if (orderNode != null)
order = Field.Order.valueOf(orderNode.getTextValue().toUpperCase());
+ JsonNode defaultValue = field.get("default");
+ if (defaultValue != null
+ && (Type.FLOAT.equals(fieldSchema.getType())
+ || Type.DOUBLE.equals(fieldSchema.getType()))
+ && defaultValue.isTextual())
+ defaultValue =
+ new DoubleNode(Double.valueOf(defaultValue.getTextValue()));
Field f = new Field(fieldName, fieldSchema,
- fieldDoc, field.get("default"), order);
+ fieldDoc, defaultValue, order);
Iterator