From de6068ba0ae2eca75ab9275781e22c79a64e5761 Mon Sep 17 00:00:00 2001 From: Gabor Szadovszky Date: Mon, 3 Oct 2016 13:03:55 +0200 Subject: [PATCH 1/2] AVRO-1860 - DefaultValue() returns Ints for Long fields --- .../src/main/java/org/apache/avro/Schema.java | 30 ++++++++++++++++++- .../org/apache/avro/TestSchemaBuilder.java | 21 +++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lang/java/avro/src/main/java/org/apache/avro/Schema.java b/lang/java/avro/src/main/java/org/apache/avro/Schema.java index 8125692326b..e6c719995d4 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/Schema.java +++ b/lang/java/avro/src/main/java/org/apache/avro/Schema.java @@ -44,6 +44,8 @@ import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.DoubleNode; +import org.codehaus.jackson.node.IntNode; +import org.codehaus.jackson.node.LongNode; /** An abstract data type. *

A schema may be one of: @@ -1168,7 +1170,7 @@ private static JsonNode validateDefault(String fieldName, Schema schema, +": "+defaultValue+" not a "+schema; throw new AvroTypeException(message); // throw exception } - return defaultValue; + return convertToProperType(schema, defaultValue); } private static boolean isValidDefault(Schema schema, JsonNode defaultValue) { @@ -1220,6 +1222,32 @@ private static boolean isValidDefault(Schema schema, JsonNode defaultValue) { } } + private static JsonNode convertToProperType(Schema schema, JsonNode defaultValue) { + if (defaultValue == null) + return null; + switch (schema.getType()) { + case DOUBLE: + if (!defaultValue.isDouble() && defaultValue.isFloatingPointNumber()) + return new DoubleNode(defaultValue.asDouble()); + break; + case FLOAT: + // TODO: FloatNode exists in Jackson >=2.2, use it after upgrade + break; + case LONG: + if (!defaultValue.isLong() && defaultValue.isIntegralNumber()) + return new LongNode(defaultValue.asLong()); + break; + case INT: + if (!defaultValue.isInt() && defaultValue.isIntegralNumber()) + return new IntNode(defaultValue.asInt()); + break; + default: + // Nothing to do; returning the original defaultValue + break; + } + return defaultValue; + } + /** @see #parse(String) */ static Schema parse(JsonNode schema, Names names) { if (schema.isTextual()) { // name diff --git a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java index 70dc1e52e23..ffa8e679d37 100644 --- a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java +++ b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java @@ -725,4 +725,25 @@ public void testDefaults() throws IOException { Assert.assertEquals(5, rec2read.get("newNullableIntWithDefault")); } + @Test + public void testDefaultTypes() { + Integer intDef = 1; + Long longDef = 2L; + Float floatDef = 3F; + Double doubleDef = 4D; + Schema schema = SchemaBuilder.record("r").fields() + .name("int").type().intType().intDefault(intDef) + .name("long").type().longType().longDefault(longDef) + .name("float").type().floatType().floatDefault(floatDef) + .name("double").type().doubleType().doubleDefault(doubleDef) + .endRecord(); + + Assert.assertEquals("int field default type or value mismatch", intDef, schema.getField("int").defaultVal()); + Assert.assertEquals("long field default type or value mismatch", longDef, schema.getField("long").defaultVal()); + // TODO: Currently failing; will be solved after having the Jackson >=2.2 upgrade +// Assert.assertEquals("float field default type or value mismatch", floatDef, schema.getField("float").defaultVal()); + Assert.assertEquals("double field default type or value mismatch", doubleDef, + schema.getField("double").defaultVal()); + } + } From 861b02a62e567432f7bcd665496852e5e833d338 Mon Sep 17 00:00:00 2001 From: Gabor Szadovszky Date: Tue, 4 Oct 2016 11:13:13 +0200 Subject: [PATCH 2/2] AVRO-1860 & AVRO-1861 - Returning the proper object for Integer-Long or Float-Double --- .../src/main/java/org/apache/avro/Schema.java | 32 ++----------------- .../org/apache/avro/TestSchemaBuilder.java | 3 +- 2 files changed, 3 insertions(+), 32 deletions(-) diff --git a/lang/java/avro/src/main/java/org/apache/avro/Schema.java b/lang/java/avro/src/main/java/org/apache/avro/Schema.java index e6c719995d4..2019c1f7d9f 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/Schema.java +++ b/lang/java/avro/src/main/java/org/apache/avro/Schema.java @@ -44,8 +44,6 @@ import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.DoubleNode; -import org.codehaus.jackson.node.IntNode; -import org.codehaus.jackson.node.LongNode; /** An abstract data type. *

A schema may be one of: @@ -437,7 +435,7 @@ public Field(String name, Schema schema, String doc, * @return the default value for this field specified using the mapping * in {@link JsonProperties} */ - public Object defaultVal() { return JacksonUtils.toObject(defaultValue); } + public Object defaultVal() { return JacksonUtils.toObject(defaultValue, schema); } public Order order() { return order; } @Deprecated public Map props() { return getProps(); } public void addAlias(String alias) { @@ -1170,7 +1168,7 @@ private static JsonNode validateDefault(String fieldName, Schema schema, +": "+defaultValue+" not a "+schema; throw new AvroTypeException(message); // throw exception } - return convertToProperType(schema, defaultValue); + return defaultValue; } private static boolean isValidDefault(Schema schema, JsonNode defaultValue) { @@ -1222,32 +1220,6 @@ private static boolean isValidDefault(Schema schema, JsonNode defaultValue) { } } - private static JsonNode convertToProperType(Schema schema, JsonNode defaultValue) { - if (defaultValue == null) - return null; - switch (schema.getType()) { - case DOUBLE: - if (!defaultValue.isDouble() && defaultValue.isFloatingPointNumber()) - return new DoubleNode(defaultValue.asDouble()); - break; - case FLOAT: - // TODO: FloatNode exists in Jackson >=2.2, use it after upgrade - break; - case LONG: - if (!defaultValue.isLong() && defaultValue.isIntegralNumber()) - return new LongNode(defaultValue.asLong()); - break; - case INT: - if (!defaultValue.isInt() && defaultValue.isIntegralNumber()) - return new IntNode(defaultValue.asInt()); - break; - default: - // Nothing to do; returning the original defaultValue - break; - } - return defaultValue; - } - /** @see #parse(String) */ static Schema parse(JsonNode schema, Names names) { if (schema.isTextual()) { // name diff --git a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java index ffa8e679d37..74d30223936 100644 --- a/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java +++ b/lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java @@ -740,8 +740,7 @@ public void testDefaultTypes() { Assert.assertEquals("int field default type or value mismatch", intDef, schema.getField("int").defaultVal()); Assert.assertEquals("long field default type or value mismatch", longDef, schema.getField("long").defaultVal()); - // TODO: Currently failing; will be solved after having the Jackson >=2.2 upgrade -// Assert.assertEquals("float field default type or value mismatch", floatDef, schema.getField("float").defaultVal()); + Assert.assertEquals("float field default type or value mismatch", floatDef, schema.getField("float").defaultVal()); Assert.assertEquals("double field default type or value mismatch", doubleDef, schema.getField("double").defaultVal()); }