Skip to content

Commit b24cbf5

Browse files
authored
Revert "Avro 3876 jackson util (#2529)" (#3584)
This reverts commit 51851d4.
1 parent 8a22cef commit b24cbf5

File tree

6 files changed

+38
-134
lines changed

6 files changed

+38
-134
lines changed

lang/java/avro/src/main/java/org/apache/avro/io/JsonEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public void writeLong(long n) throws IOException {
206206
@Override
207207
public void writeFloat(float f) throws IOException {
208208
parser.advance(Symbol.FLOAT);
209-
out.writeNumber(f + 0d);
209+
out.writeNumber(f);
210210
}
211211

212212
@Override

lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package org.apache.avro.util.internal;
1919

2020
import java.io.IOException;
21-
import java.io.UncheckedIOException;
2221
import java.math.BigDecimal;
2322
import java.math.BigInteger;
2423
import java.nio.charset.StandardCharsets;
@@ -88,7 +87,7 @@ static void toJson(Object datum, JsonGenerator generator) throws IOException {
8887
}
8988
generator.writeEndArray();
9089
} else if (datum instanceof byte[]) { // bytes, fixed
91-
generator.writeBinary((byte[]) datum);// writeString(new String((byte[]) datum, StandardCharsets.ISO_8859_1));
90+
generator.writeString(new String((byte[]) datum, StandardCharsets.ISO_8859_1));
9291
} else if (datum instanceof CharSequence || datum instanceof Enum<?>) { // string, enum
9392
generator.writeString(datum.toString());
9493
} else if (datum instanceof Double) { // double
@@ -149,23 +148,10 @@ public static Object toObject(JsonNode jsonNode, Schema schema) {
149148
return jsonNode.asDouble();
150149
}
151150
} else if (jsonNode.isDouble() || jsonNode.isFloat()) {
152-
if (schema != null) {
153-
if (schema.getType().equals(Schema.Type.DOUBLE)) {
154-
return jsonNode.doubleValue();
155-
} else if (schema.getType().equals(Schema.Type.FLOAT)) {
156-
return jsonNode.floatValue();
157-
}
158-
} else if (jsonNode.isDouble()) {
159-
return jsonNode.doubleValue();
160-
} else {
161-
return jsonNode.floatValue();
162-
}
163-
} else if (jsonNode.isBinary()) {
164-
try {
165-
return jsonNode.binaryValue();
166-
} catch (IOException ex) {
167-
// only for TextNode, so, can't happen with binaryNode.
168-
throw new UncheckedIOException(ex);
151+
if (schema == null || schema.getType().equals(Schema.Type.DOUBLE)) {
152+
return jsonNode.asDouble();
153+
} else if (schema.getType().equals(Schema.Type.FLOAT)) {
154+
return (float) jsonNode.asDouble();
169155
}
170156
} else if (jsonNode.isTextual()) {
171157
if (schema == null || schema.getType().equals(Schema.Type.STRING) || schema.getType().equals(Schema.Type.ENUM)) {
@@ -201,7 +187,7 @@ public static Object toObject(JsonNode jsonNode, Schema schema) {
201187

202188
/**
203189
* Convert an object into a map
204-
*
190+
*
205191
* @param datum The object
206192
* @return Its Map representation
207193
*/

lang/java/avro/src/test/java/org/apache/avro/TestSchemaBuilder.java

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.io.File;
2424
import java.io.IOException;
2525
import java.nio.ByteBuffer;
26-
import java.nio.charset.StandardCharsets;
2726
import java.util.ArrayList;
2827
import java.util.Arrays;
2928
import java.util.Collection;
@@ -112,14 +111,14 @@ void objectProps() {
112111
assertTrue(s.getObjectProp("intProp") instanceof Integer);
113112
assertTrue(s.getObjectProp("longProp") instanceof Long);
114113
assertEquals(Long.MAX_VALUE, s.getObjectProp("longProp"));
115-
assertTrue(s.getObjectProp("floatProp") instanceof Float);
114+
assertTrue(s.getObjectProp("floatProp") instanceof Double);
116115
// float converts to double
117-
assertEquals(1.0f, s.getObjectProp("floatProp"));
116+
assertEquals(1.0d, s.getObjectProp("floatProp"));
118117
assertTrue(s.getObjectProp("doubleProp") instanceof Double);
119118
assertEquals(Double.MAX_VALUE, s.getObjectProp("doubleProp"));
120119
// byte[] converts to string
121-
assertTrue(s.getObjectProp("byteProp") instanceof byte[]);
122-
assertArrayEquals(new byte[] { 0x41, 0x42, 0x43 }, (byte[]) s.getObjectProp("byteProp"));
120+
assertTrue(s.getObjectProp("byteProp") instanceof String);
121+
assertEquals("ABC", s.getObjectProp("byteProp"));
123122
assertTrue(s.getObjectProp("stringProp") instanceof String);
124123
assertEquals("abc", s.getObjectProp("stringProp"));
125124
}
@@ -142,14 +141,14 @@ void fieldObjectProps() {
142141
assertTrue(f.getObjectProp("intProp") instanceof Integer);
143142
assertTrue(f.getObjectProp("longProp") instanceof Long);
144143
assertEquals(Long.MAX_VALUE, f.getObjectProp("longProp"));
145-
assertTrue(f.getObjectProp("floatProp") instanceof Float);
144+
assertTrue(f.getObjectProp("floatProp") instanceof Double);
146145
// float converts to double
147-
assertEquals(1.0f, f.getObjectProp("floatProp"));
146+
assertEquals(1.0d, f.getObjectProp("floatProp"));
148147
assertTrue(f.getObjectProp("doubleProp") instanceof Double);
149148
assertEquals(Double.MAX_VALUE, f.getObjectProp("doubleProp"));
150149
// byte[] converts to string
151-
assertTrue(f.getObjectProp("byteProp") instanceof byte[]);
152-
assertArrayEquals(new byte[] { 0x41, 0x42, 0x43 }, (byte[]) f.getObjectProp("byteProp"));
150+
assertTrue(f.getObjectProp("byteProp") instanceof String);
151+
assertEquals("ABC", f.getObjectProp("byteProp"));
153152
assertTrue(f.getObjectProp("stringProp") instanceof String);
154153
assertEquals("abc", f.getObjectProp("stringProp"));
155154

@@ -181,11 +180,11 @@ void arrayObjectProp() {
181180
assertEquals(true, iter.next());
182181
assertEquals(Integer.MAX_VALUE, iter.next());
183182
assertEquals(Long.MAX_VALUE, iter.next());
184-
185-
assertEquals(1.0f, iter.next());
183+
// float converts to double
184+
assertEquals(1.0d, iter.next());
186185
assertEquals(Double.MAX_VALUE, iter.next());
187-
188-
assertArrayEquals(new byte[] { 0x41, 0x42, 0x43 }, (byte[]) iter.next());
186+
// byte[] converts to string
187+
assertEquals("ABC", iter.next());
189188
assertEquals("abc", iter.next());
190189
}
191190

@@ -216,11 +215,11 @@ void fieldArrayObjectProp() {
216215
assertEquals(true, iter.next());
217216
assertEquals(Integer.MAX_VALUE, iter.next());
218217
assertEquals(Long.MAX_VALUE, iter.next());
219-
220-
assertEquals(1.0f, iter.next());
218+
// float converts to double
219+
assertEquals(1.0d, iter.next());
221220
assertEquals(Double.MAX_VALUE, iter.next());
222-
223-
assertArrayEquals(new byte[] { 0x41, 0x42, 0x43 }, (byte[]) iter.next());
221+
// byte[] converts to string
222+
assertEquals("ABC", iter.next());
224223
assertEquals("abc", iter.next());
225224
}
226225

@@ -249,14 +248,14 @@ void mapObjectProp() {
249248
assertEquals(Integer.MAX_VALUE, valueMap.get("intKey"));
250249
assertTrue(valueMap.get("longKey") instanceof Long);
251250
assertEquals(Long.MAX_VALUE, valueMap.get("longKey"));
252-
253-
assertTrue(valueMap.get("floatKey") instanceof Float);
254-
assertEquals(1.0f, valueMap.get("floatKey"));
251+
// float converts to double
252+
assertTrue(valueMap.get("floatKey") instanceof Double);
253+
assertEquals(1.0d, valueMap.get("floatKey"));
255254
assertTrue(valueMap.get("doubleKey") instanceof Double);
256255
assertEquals(Double.MAX_VALUE, valueMap.get("doubleKey"));
257-
258-
assertTrue(valueMap.get("byteKey") instanceof byte[]);
259-
assertArrayEquals("ABC".getBytes(StandardCharsets.UTF_8), (byte[]) valueMap.get("byteKey"));
256+
// byte[] converts to string
257+
assertTrue(valueMap.get("byteKey") instanceof String);
258+
assertEquals("ABC", valueMap.get("byteKey"));
260259
assertTrue(valueMap.get("stringKey") instanceof String);
261260
assertEquals("abc", valueMap.get("stringKey"));
262261
}
@@ -289,14 +288,14 @@ void fieldMapObjectProp() {
289288
assertEquals(Integer.MAX_VALUE, valueMap.get("intKey"));
290289
assertTrue(valueMap.get("longKey") instanceof Long);
291290
assertEquals(Long.MAX_VALUE, valueMap.get("longKey"));
292-
293-
assertTrue(valueMap.get("floatKey") instanceof Float);
294-
assertEquals(1.0f, valueMap.get("floatKey"));
291+
// float converts to double
292+
assertTrue(valueMap.get("floatKey") instanceof Double);
293+
assertEquals(1.0d, valueMap.get("floatKey"));
295294
assertTrue(valueMap.get("doubleKey") instanceof Double);
296295
assertEquals(Double.MAX_VALUE, valueMap.get("doubleKey"));
297-
298-
assertTrue(valueMap.get("byteKey") instanceof byte[]);
299-
assertEquals("ABC", new String((byte[]) valueMap.get("byteKey")));
296+
// byte[] converts to string
297+
assertTrue(valueMap.get("byteKey") instanceof String);
298+
assertEquals("ABC", valueMap.get("byteKey"));
300299
assertTrue(valueMap.get("stringKey") instanceof String);
301300
assertEquals("abc", valueMap.get("stringKey"));
302301
}

lang/java/avro/src/test/java/org/apache/avro/io/TestBinaryDecoder.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@
2020
import org.apache.avro.AvroRuntimeException;
2121
import org.apache.avro.Schema;
2222
import org.apache.avro.SystemLimitException;
23-
import org.apache.avro.generic.GenericData;
2423
import org.apache.avro.generic.GenericDatumReader;
2524
import org.apache.avro.generic.GenericDatumWriter;
26-
import org.apache.avro.generic.GenericRecord;
2725
import org.apache.avro.util.ByteBufferInputStream;
2826
import org.apache.avro.util.ByteBufferOutputStream;
2927
import org.apache.avro.util.RandomData;
@@ -45,7 +43,6 @@
4543
import java.util.Arrays;
4644

4745
import static org.apache.avro.TestSystemLimitException.*;
48-
import static org.junit.jupiter.api.Assertions.assertEquals;
4946

5047
public class TestBinaryDecoder {
5148
// prime number buffer size so that looping tests hit the buffer edge
@@ -686,26 +683,4 @@ void eof(boolean useDirect) throws IOException {
686683
Assertions.assertThrows(EOFException.class, () -> d.readInt());
687684
}
688685

689-
@Test
690-
void testFloatPrecision() throws Exception {
691-
String def = "{\"type\":\"record\",\"name\":\"X\",\"fields\":" + "[{\"type\":\"float\",\"name\":\"n\"}]}";
692-
Schema schema = new Schema.Parser().parse(def);
693-
DatumReader<GenericRecord> reader = new GenericDatumReader<>(schema);
694-
695-
float value = 33.33000183105469f;
696-
697-
GenericData.Record record = new GenericData.Record(schema);
698-
record.put(0, value);
699-
ByteArrayOutputStream out = new ByteArrayOutputStream();
700-
Encoder encoder = EncoderFactory.get().directBinaryEncoder(out, null);
701-
702-
DatumWriter<GenericRecord> writer = new GenericDatumWriter<>(schema);
703-
writer.write(record, encoder);
704-
encoder.flush();
705-
706-
Decoder decoder = DecoderFactory.get().directBinaryDecoder(new ByteArrayInputStream(out.toByteArray()), null);
707-
GenericRecord r = reader.read(null, decoder);
708-
assertEquals(value + 0d, ((float) r.get("n")) + 0d);
709-
}
710-
711686
}

lang/java/avro/src/test/java/org/apache/avro/io/TestJsonDecoder.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,12 @@
2222
import org.apache.avro.AvroTypeException;
2323
import org.apache.avro.Schema;
2424
import org.apache.avro.SchemaBuilder;
25-
import org.apache.avro.generic.GenericData;
2625
import org.apache.avro.generic.GenericDatumReader;
27-
import org.apache.avro.generic.GenericDatumWriter;
2826
import org.apache.avro.generic.GenericRecord;
2927

3028
import org.junit.jupiter.api.Assertions;
3129
import org.junit.jupiter.api.Test;
3230

33-
import java.io.ByteArrayOutputStream;
3431
import java.io.IOException;
3532

3633
public class TestJsonDecoder {
@@ -69,29 +66,6 @@ private void checkNumeric(String type, Object value) throws Exception {
6966
}
7067
}
7168

72-
@Test
73-
void testFloatPrecision() throws Exception {
74-
String def = "{\"type\":\"record\",\"name\":\"X\",\"fields\":" + "[{\"type\":\"float\",\"name\":\"n\"}]}";
75-
Schema schema = new Schema.Parser().parse(def);
76-
DatumReader<GenericRecord> reader = new GenericDatumReader<>(schema);
77-
78-
float value = 33.33000183105469f;
79-
GenericData.Record record = new GenericData.Record(schema);
80-
record.put(0, value);
81-
ByteArrayOutputStream out = new ByteArrayOutputStream();
82-
JsonEncoder encoder = EncoderFactory.get().jsonEncoder(schema, out);
83-
84-
DatumWriter<GenericRecord> writer = new GenericDatumWriter<>(schema);
85-
writer.write(record, encoder);
86-
encoder.flush();
87-
// check the whole float precision is kept.
88-
assertEquals("{\"n\":33.33000183105469}", out.toString());
89-
90-
Decoder decoder = DecoderFactory.get().jsonDecoder(schema, out.toString());
91-
GenericRecord r = reader.read(null, decoder);
92-
assertEquals(value + 0d, ((float) r.get("n")) + 0d);
93-
}
94-
9569
// Ensure that even if the order of fields in JSON is different from the order
9670
// in schema,
9771
// it works.

lang/java/avro/src/test/java/org/apache/avro/util/internal/TestJacksonUtils.java

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@
2121
import static org.apache.avro.util.internal.JacksonUtils.toObject;
2222
import static org.junit.jupiter.api.Assertions.*;
2323

24-
import com.fasterxml.jackson.databind.JsonNode;
2524
import com.fasterxml.jackson.databind.node.ArrayNode;
2625
import com.fasterxml.jackson.databind.node.BigIntegerNode;
27-
import com.fasterxml.jackson.databind.node.BinaryNode;
2826
import com.fasterxml.jackson.databind.node.BooleanNode;
2927
import com.fasterxml.jackson.databind.node.DecimalNode;
3028
import com.fasterxml.jackson.databind.node.DoubleNode;
@@ -33,24 +31,15 @@
3331
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
3432
import com.fasterxml.jackson.databind.node.LongNode;
3533
import com.fasterxml.jackson.databind.node.NullNode;
36-
import com.fasterxml.jackson.databind.node.NumericNode;
3734
import com.fasterxml.jackson.databind.node.ObjectNode;
3835
import com.fasterxml.jackson.databind.node.TextNode;
3936
import java.math.BigDecimal;
4037
import java.math.BigInteger;
41-
import java.nio.charset.StandardCharsets;
4238
import java.util.Collections;
43-
import java.util.stream.Stream;
44-
4539
import org.apache.avro.JsonProperties;
4640
import org.apache.avro.Schema;
4741
import org.apache.avro.SchemaBuilder;
48-
49-
import org.junit.jupiter.api.Assertions;
5042
import org.junit.jupiter.api.Test;
51-
import org.junit.jupiter.params.ParameterizedTest;
52-
import org.junit.jupiter.params.provider.Arguments;
53-
import org.junit.jupiter.params.provider.MethodSource;
5443

5544
public class TestJacksonUtils {
5645

@@ -66,9 +55,8 @@ void testToJsonNode() {
6655
assertEquals(IntNode.valueOf(1), toJsonNode(1));
6756
assertEquals(LongNode.valueOf(2), toJsonNode(2L));
6857
assertEquals(FloatNode.valueOf(1.0f), toJsonNode(1.0f));
69-
assertEquals(FloatNode.valueOf(33.33000183105469f), toJsonNode(33.33000183105469f));
70-
assertEquals(DoubleNode.valueOf(2.0), toJsonNode(2.0d));
71-
assertEquals(BinaryNode.valueOf(new byte[] { 1, 2 }), toJsonNode(new byte[] { 1, 2 }));
58+
assertEquals(DoubleNode.valueOf(2.0), toJsonNode(2.0));
59+
assertEquals(TextNode.valueOf("\u0001\u0002"), toJsonNode(new byte[] { 1, 2 }));
7260
assertEquals(TextNode.valueOf("a"), toJsonNode("a"));
7361
assertEquals(TextNode.valueOf("UP"), toJsonNode(Direction.UP));
7462
assertEquals(BigIntegerNode.valueOf(BigInteger.ONE), toJsonNode(BigInteger.ONE));
@@ -92,7 +80,7 @@ void testToObject() {
9280
assertEquals(2L, toObject(IntNode.valueOf(2), Schema.create(Schema.Type.LONG)));
9381
assertEquals(1.0f, toObject(DoubleNode.valueOf(1.0), Schema.create(Schema.Type.FLOAT)));
9482
assertEquals(2.0, toObject(DoubleNode.valueOf(2.0)));
95-
assertEquals(BinaryNode.valueOf(new byte[] { 1, 2 }), toJsonNode(new byte[] { 1, 2 }));
83+
assertEquals(TextNode.valueOf("\u0001\u0002"), toJsonNode(new byte[] { 1, 2 }));
9684
assertArrayEquals(new byte[] { 1, 2 },
9785
(byte[]) toObject(TextNode.valueOf("\u0001\u0002"), Schema.create(Schema.Type.BYTES)));
9886
assertEquals("a", toObject(TextNode.valueOf("a")));
@@ -114,22 +102,4 @@ void testToObject() {
114102
assertEquals("a", toObject(TextNode.valueOf("a"), SchemaBuilder.unionOf().stringType().and().intType().endUnion()));
115103
}
116104

117-
@ParameterizedTest
118-
@MethodSource("nodes")
119-
void cycle(JsonNode input) {
120-
Object object = JacksonUtils.toObject(input);
121-
JsonNode node = JacksonUtils.toJsonNode(object);
122-
Assertions.assertEquals(input, node);
123-
}
124-
125-
public static Stream<Arguments> nodes() {
126-
ObjectNode o1 = JsonNodeFactory.instance.objectNode();
127-
o1.put("intField", 123);
128-
o1.put("floatField", 33.33000183105469f);
129-
o1.put("doubleField", 33.33000183105469245d);
130-
return Stream.of(JsonNodeFactory.instance.numberNode(33.33000183105469f),
131-
JsonNodeFactory.instance.binaryNode("Hello".getBytes(StandardCharsets.ISO_8859_1)),
132-
JsonNodeFactory.instance.arrayNode().add(1).add("Hello").add(o1)).map(Arguments::of);
133-
}
134-
135105
}

0 commit comments

Comments
 (0)