Repository: nifi Updated Branches: refs/heads/master caa71fce9 -> 06d1276f0
NIFI-5141: Updated regex for doubles to allow for numbers that have no decimal 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 Signed-off-by: Matthew Burgess <[email protected]> This closes #2679 Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/06d1276f Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/06d1276f Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/06d1276f Branch: refs/heads/master Commit: 06d1276f0948fd44975a6c8e5758fd39148e5506 Parents: caa71fc Author: Mark Payne <[email protected]> Authored: Fri May 4 15:35:00 2018 -0400 Committer: Matthew Burgess <[email protected]> Committed: Mon Jun 4 12:23:57 2018 -0400 ---------------------------------------------------------------------- .../record/util/DataTypeUtils.java | 11 ++++---- .../serialization/record/TestDataTypeUtils.java | 29 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/06d1276f/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java ---------------------------------------------------------------------- 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 d15f379..687d9ed 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 @@ -63,11 +63,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 = "(\\.\\d*)?"; - 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 = @@ -75,7 +75,7 @@ public class DataTypeUtils { "(" + Infinity + "|" + NotANumber + "|"+ - "(" + Base10Digits + Base10Decimal + ")" + "|" + + "(" + Base10Digits + OptionalBase10Decimal + ")" + "|" + "(" + Base10Digits + OptionalBase10Decimal + Base10Exponent + ")" + "|" + "(" + Base10Decimal + OptionalBase10Exponent + ")" + ")"; @@ -408,6 +408,7 @@ public class DataTypeUtils { * @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) { http://git-wip-us.apache.org/repos/asf/nifi/blob/06d1276f/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java ---------------------------------------------------------------------- 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 2c068c2..a8bc28d 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 class TestDataTypeUtils { } @Test + @SuppressWarnings("unchecked") public void testConvertRecordFieldToObject() { assertNull(DataTypeUtils.convertRecordFieldtoObject(null, null)); assertNull(DataTypeUtils.convertRecordFieldtoObject(null, RecordFieldType.MAP.getDataType())); @@ -195,4 +196,32 @@ public class TestDataTypeUtils { 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); + } + } + } + } + } }
