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);