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