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

Reply via email to