This is an automated email from the ASF dual-hosted git repository.

ijokarumawak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/master by this push:
     new 3bfef33  NIFI-6442: ExecuteSQL/ExecuteSQLRecord convert to Avro date 
type incorrectly when set 'Use Avro Logical Types' to true
3bfef33 is described below

commit 3bfef3356e158d8691008e3675bb7a5cc65064fb
Author: archon <qq349074...@live.com>
AuthorDate: Wed Jul 17 10:12:24 2019 +0800

    NIFI-6442: ExecuteSQL/ExecuteSQLRecord convert to Avro date type 
incorrectly when set 'Use Avro Logical Types' to true
    
    This closes #3584.
    
    Signed-off-by: Koji Kawamura <ijokaruma...@apache.org>
---
 .../nifi/serialization/record/util/DataTypeUtils.java   | 16 ++++++++--------
 .../main/java/org/apache/nifi/avro/AvroTypeUtil.java    |  8 +++-----
 .../java/org/apache/nifi/avro/TestAvroTypeUtil.java     | 17 +++++++++++++++++
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git 
a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
 
b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
index bab455a..0686dcf 100644
--- 
a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
+++ 
b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
@@ -892,15 +892,15 @@ public class DataTypeUtils {
             return null;
         }
 
+        if (value instanceof Date) {
+            return (Date) value;
+        }
+
         if (value instanceof java.util.Date) {
             java.util.Date _temp = (java.util.Date)value;
             return new Date(_temp.getTime());
         }
 
-        if (value instanceof Date) {
-            return (Date) value;
-        }
-
         if (value instanceof Number) {
             final long longValue = ((Number) value).longValue();
             return new Date(longValue);
@@ -1038,14 +1038,14 @@ public class DataTypeUtils {
             return null;
         }
 
-        if (value instanceof java.util.Date) {
-            return new Timestamp(((java.util.Date)value).getTime());
-        }
-
         if (value instanceof Timestamp) {
             return (Timestamp) value;
         }
 
+        if (value instanceof java.util.Date) {
+            return new Timestamp(((java.util.Date)value).getTime());
+        }
+
         if (value instanceof Number) {
             final long longValue = ((Number) value).longValue();
             return new Timestamp(longValue);
diff --git 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
index 097844a..a60c993 100644
--- 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
+++ 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
@@ -60,6 +60,7 @@ import java.sql.Blob;
 import java.sql.Time;
 import java.sql.Timestamp;
 import java.time.Duration;
+import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
 import java.util.AbstractMap;
 import java.util.ArrayList;
@@ -652,9 +653,8 @@ public class AvroTypeUtil {
 
                 if (LOGICAL_TYPE_DATE.equals(logicalType.getName())) {
                     final String format = 
AvroTypeUtil.determineDataType(fieldSchema).getFormat();
-                    final Date date = DataTypeUtils.toDate(rawValue, () -> 
DataTypeUtils.getDateFormat(format), fieldName);
-                    final Duration duration = Duration.between(new 
Date(0L).toInstant(), new Date(date.getTime()).toInstant());
-                    final long days = duration.toDays();
+                    final java.sql.Date date = DataTypeUtils.toDate(rawValue, 
() -> DataTypeUtils.getDateFormat(format), fieldName);
+                    final long days = 
ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), date.toLocalDate());
                     return (int) days;
                 } else if 
(LOGICAL_TYPE_TIME_MILLIS.equals(logicalType.getName())) {
                     final String format = 
AvroTypeUtil.determineDataType(fieldSchema).getFormat();
@@ -679,8 +679,6 @@ public class AvroTypeUtil {
                     final Duration duration = 
Duration.between(date.toInstant().truncatedTo(ChronoUnit.DAYS), 
date.toInstant());
                     return duration.toMillis() * 1000L;
                 } else if 
(LOGICAL_TYPE_TIMESTAMP_MILLIS.equals(logicalType.getName())) {
-                    final String format = 
AvroTypeUtil.determineDataType(fieldSchema).getFormat();
-                    Timestamp t = DataTypeUtils.toTimestamp(rawValue, () -> 
DataTypeUtils.getDateFormat(format), fieldName);
                     return getLongFromTimestamp(rawValue, fieldSchema, 
fieldName);
                 } else if 
(LOGICAL_TYPE_TIMESTAMP_MICROS.equals(logicalType.getName())) {
                     return getLongFromTimestamp(rawValue, fieldSchema, 
fieldName) * 1000L;
diff --git 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
index 3431da6..e60c164 100644
--- 
a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
+++ 
b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/test/java/org/apache/nifi/avro/TestAvroTypeUtil.java
@@ -44,8 +44,11 @@ import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.sql.Date;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -414,6 +417,20 @@ public class TestAvroTypeUtil {
     }
 
     @Test
+    public void testDateConversion() {
+        final Calendar c = Calendar.getInstance();
+        c.set(2019, Calendar.JANUARY, 1, 0, 0, 0);
+        final long epochMillis = c.getTimeInMillis();
+
+        final LogicalTypes.Date dateType = LogicalTypes.date();
+        final Schema fieldSchema = Schema.create(Type.INT);
+        dateType.addToSchema(fieldSchema);
+        final Object convertedValue = AvroTypeUtil.convertToAvroObject(new 
Date(epochMillis), fieldSchema);
+        assertTrue(convertedValue instanceof Integer);
+        assertEquals((int) convertedValue, LocalDate.of(2019, 1, 
1).toEpochDay());
+    }
+
+    @Test
     public void testFixedDecimalConversion(){
         final LogicalTypes.Decimal decimalType = LogicalTypes.decimal(18, 8);
         final Schema fieldSchema = Schema.createFixed("mydecimal", "no doc", 
"myspace", 18);

Reply via email to