From a46ab9a94eb2b9ae49cd3b8a4d26d7d694f23cf3 Mon Sep 17 00:00:00 2001 From: Mark Payne Date: Fri, 4 May 2018 15:35:00 -0400 Subject: [PATCH 1/2] NIFI-5141: Updated regex for doubles to allow for numbers that have no decimal --- .../nifi/serialization/record/util/DataTypeUtils.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 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 477b02a54bdd..8231723e9d12 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 @@ -60,11 +60,11 @@ public class DataTypeUtils { private static final String Infinity = "(Infinity)"; private static final String NotANumber = "(NaN)"; - private static final String Base10Digits = "\\d+"; - private static final String Base10Decimal = "\\." + Base10Digits; - private static final String OptionalBase10Decimal = Base10Decimal + "?"; + private static final String Base10Digits = "\\d+"; + private static final String Base10Decimal = "\\." + Base10Digits; + private static final String OptionalBase10Decimal = "(" + Base10Decimal + ")?"; - private static final String Base10Exponent = "[eE]" + OptionalSign + Base10Digits; + private static final String Base10Exponent = "[eE]" + OptionalSign + Base10Digits; private static final String OptionalBase10Exponent = "(" + Base10Exponent + ")?"; private static final String doubleRegex = @@ -72,7 +72,7 @@ public class DataTypeUtils { "(" + Infinity + "|" + NotANumber + "|"+ - "(" + Base10Digits + Base10Decimal + ")" + "|" + + "(" + Base10Digits + OptionalBase10Decimal + ")" + "|" + "(" + Base10Digits + OptionalBase10Decimal + Base10Exponent + ")" + "|" + "(" + Base10Decimal + OptionalBase10Exponent + ")" + ")"; From 05c6ef04da66917c58ccf02a667da4f53d0ac382 Mon Sep 17 00:00:00 2001 From: Mark Payne Date: Tue, 15 May 2018 15:08:13 -0400 Subject: [PATCH 2/2] NIFI-5141: Loosened regex for floating-point numbers to account for decimal place followed by 0 digits, such as '13.' and also added unit tests --- .../record/util/DataTypeUtils.java | 3 +- .../record/TestDataTypeUtils.java | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) 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 8231723e9d12..d7eddf335e4a 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 @@ -62,7 +62,7 @@ public class DataTypeUtils { private static final String Base10Digits = "\\d+"; private static final String Base10Decimal = "\\." + Base10Digits; - private static final String OptionalBase10Decimal = "(" + Base10Decimal + ")?"; + private static final String OptionalBase10Decimal = "(\\.\\d*)?"; private static final String Base10Exponent = "[eE]" + OptionalSign + Base10Digits; private static final String OptionalBase10Exponent = "(" + Base10Exponent + ")?"; @@ -376,6 +376,7 @@ public static Map toMap(final Object value, final String fieldNa * @param dataType The type of the provided object * @return An object representing a native Java conversion of the given input object */ + @SuppressWarnings({"unchecked", "rawtypes"}) public static Object convertRecordFieldtoObject(final Object value, final DataType dataType) { if (value == null) { diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java index 2c068c246afc..a8bc28d04e00 100644 --- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java +++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java @@ -92,6 +92,7 @@ public void testConvertRecordArrayToJavaArray() { } @Test + @SuppressWarnings("unchecked") public void testConvertRecordFieldToObject() { assertNull(DataTypeUtils.convertRecordFieldtoObject(null, null)); assertNull(DataTypeUtils.convertRecordFieldtoObject(null, RecordFieldType.MAP.getDataType())); @@ -195,4 +196,32 @@ public void testBytesToBytes() { assertTrue(b instanceof Byte[]); assertEquals("Conversion from byte[] to String failed at char 0", (Object) "Hello".getBytes(StandardCharsets.UTF_16)[0], ((Byte[]) b)[0]); } + + @Test + public void testFloatingPointCompatibility() { + final String[] prefixes = new String[] {"", "-", "+"}; + final String[] exponents = new String[] {"e0", "e1", "e-1", "E0", "E1", "E-1"}; + final String[] decimals = new String[] {"", ".0", ".1", "."}; + + for (final String prefix : prefixes) { + for (final String decimal : decimals) { + for (final String exp : exponents) { + String toTest = prefix + "100" + decimal + exp; + assertTrue(toTest + " not valid float", DataTypeUtils.isFloatTypeCompatible(toTest)); + assertTrue(toTest + " not valid double", DataTypeUtils.isDoubleTypeCompatible(toTest)); + + Double.parseDouble(toTest); // ensure we can actually parse it + Float.parseFloat(toTest); + + if (decimal.length() > 1) { + toTest = prefix + decimal + exp; + assertTrue(toTest + " not valid float", DataTypeUtils.isFloatTypeCompatible(toTest)); + assertTrue(toTest + " not valid double", DataTypeUtils.isDoubleTypeCompatible(toTest)); + Double.parseDouble(toTest); // ensure we can actually parse it + Float.parseFloat(toTest); + } + } + } + } + } }