You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by rs...@apache.org on 2021/04/30 13:36:54 UTC
[avro] branch master updated: AVRO-3124: Produce valid string for
Temporal JSON toString() (#1204)
This is an automated email from the ASF dual-hosted git repository.
rskraba 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 1ac15ed AVRO-3124: Produce valid string for Temporal JSON toString() (#1204)
1ac15ed is described below
commit 1ac15edc8609d700aa0ed5ece207ab904f1a8623
Author: Artur Kalimullin <ka...@gmail.com>
AuthorDate: Fri Apr 30 15:36:44 2021 +0200
AVRO-3124: Produce valid string for Temporal JSON toString() (#1204)
---
.../src/main/java/org/apache/avro/generic/GenericData.java | 14 +++++++++++---
.../test/java/org/apache/avro/generic/TestGenericData.java | 13 +++++++++++++
2 files changed, 24 insertions(+), 3 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 30cf326..e93ecbb 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
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
+import java.time.temporal.Temporal;
import java.util.AbstractList;
import java.util.Arrays;
import java.util.Collection;
@@ -692,9 +693,7 @@ public class GenericData {
ByteBuffer bytes = ((ByteBuffer) datum).duplicate();
writeEscapedString(StandardCharsets.ISO_8859_1.decode(bytes), buffer);
buffer.append("\"");
- } else if (((datum instanceof Float) && // quote Nan & Infinity
- (((Float) datum).isInfinite() || ((Float) datum).isNaN()))
- || ((datum instanceof Double) && (((Double) datum).isInfinite() || ((Double) datum).isNaN()))) {
+ } else if (isNanOrInfinity(datum) || isTemporal(datum)) {
buffer.append("\"");
buffer.append(datum);
buffer.append("\"");
@@ -711,6 +710,15 @@ public class GenericData {
}
}
+ private boolean isTemporal(Object datum) {
+ return datum instanceof Temporal;
+ }
+
+ private boolean isNanOrInfinity(Object datum) {
+ return ((datum instanceof Float) && (((Float) datum).isInfinite() || ((Float) datum).isNaN()))
+ || ((datum instanceof Double) && (((Double) datum).isInfinite() || ((Double) datum).isNaN()));
+ }
+
/* Adapted from https://code.google.com/p/json-simple */
private static void writeEscapedString(CharSequence string, StringBuilder builder) {
for (int i = 0; i < string.length(); i++) {
diff --git a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
index 27006ad..5b36812 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
@@ -24,6 +24,10 @@ import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.*;
import com.fasterxml.jackson.core.JsonFactory;
@@ -409,6 +413,15 @@ public class TestGenericData {
}
@Test
+ public void testToStringConvertsDatesAsStrings() throws Exception {
+ GenericData data = GenericData.get();
+ assertEquals("\"1961-04-12T06:07:10Z\"", data.toString(Instant.parse("1961-04-12T06:07:10Z")));
+ assertEquals("\"1961-04-12\"", data.toString(LocalDate.parse("1961-04-12")));
+ assertEquals("\"1961-04-12T06:07:10\"", data.toString(LocalDateTime.parse("1961-04-12T06:07:10")));
+ assertEquals("\"10:10:10\"", data.toString(LocalTime.parse("10:10:10")));
+ }
+
+ @Test
public void testCompare() {
// Prepare a schema for testing.
Field integerField = new Field("test", Schema.create(Type.INT), null, null);