[ 
https://issues.apache.org/jira/browse/NIFI-5141?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16466738#comment-16466738
 ] 

Ed Berezitsky edited comment on NIFI-5141 at 5/8/18 3:45 AM:
-------------------------------------------------------------

[~markap14],

this bug affected two methods: _DataTypeUtils.isFloatTypeCompatible_ and 
_DataTypeUtils.isDoubleTypeCompatible_.

Reproduced for both successfully. After applying patch both methods return 
desired results for format with numbers having digits after period (i.e. 
"13.45") and for integer/long looking number (i.e. "13"). But it still doesn't 
return "true" for numbers that have period, but don't have digits after it, 
i.e. "13.", while Double.parseDouble("13.") parses such values correctly. I 
think, regex for double/floats should support that format as well.

I would recommend to add one more pattern to support that:

 
{code:java}
    private static final String  doubleRegex =
        OptionalSign +
        "(" +
            Infinity + "|" +
            NotANumber + "|"+
            "(" + Base10Digits + OptionalBase10Decimal + ")" + "|" +
            "(" + Base10Digits + "\\." + ")" + "|" +   // recommend to add this 
pattern
            "(" + Base10Digits + OptionalBase10Decimal + Base10Exponent + ")" + 
"|" +
            "(" + Base10Decimal + OptionalBase10Exponent + ")" +
        ")";
 
{code}
Before:

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13")); --> 
{color:#ff0000}false{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13")); --> 
{color:#ff0000}false{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.")); --> 
{color:#ff0000}false{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.")); --> 
{color:#ff0000}false{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".13")); --> true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".13")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".")); --> false

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".")); --> false

After:

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13")); --> 
{color:#14892c}true{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13")); --> 
{color:#14892c}true{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.")); --> 
{color:#d04437}false — recommended update fixes this{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.")); --> 
{color:#d04437}false — recommended update fixes this{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".13")); --> true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".13")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".")); --> false

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".")); --> false


was (Author: bdesert):
[~markap14],

this bug affected two methods: _DataTypeUtils.isFloatTypeCompatible_ and 
_DataTypeUtils.isDoubleTypeCompatible_.

Reproduced for both successfully. After applying patch both methods return 
desired results for format with numbers having digits after period (i.e. 
"13.45"). But it still doesn't return "true" for numbers that have period, but 
don't have digits after it, i.e. "13.", while Double.parseDouble("13.") parses 
such values correctly. I think, regex for double/floats should support that 
format as well.

I would recommend to add one more pattern to support that:

 
{code:java}
    private static final String  doubleRegex =
        OptionalSign +
        "(" +
            Infinity + "|" +
            NotANumber + "|"+
            "(" + Base10Digits + OptionalBase10Decimal + ")" + "|" +
            "(" + Base10Digits + "\\." + ")" + "|" +   // recommend to add this 
pattern
            "(" + Base10Digits + OptionalBase10Decimal + Base10Exponent + ")" + 
"|" +
            "(" + Base10Decimal + OptionalBase10Exponent + ")" +
        ")";
 
{code}
Before:

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13")); --> 
{color:#FF0000}false{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13")); --> 
{color:#FF0000}false{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.")); --> 
{color:#FF0000}false{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.")); --> 
{color:#FF0000}false{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".13")); --> true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".13")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".")); --> false

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".")); --> false

After:

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13")); --> 
{color:#14892c}true{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13")); --> 
{color:#14892c}true{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.")); --> 
{color:#d04437}false — recommended update fixes this{color}

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.")); --> 
{color:#d04437}false — recommended update fixes this{color}

        System.out.println(DataTypeUtils.isFloatTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible("13.0")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".13")); --> true

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".13")); --> 
true

        System.out.println(DataTypeUtils.isFloatTypeCompatible(".")); --> false

        System.out.println(DataTypeUtils.isDoubleTypeCompatible(".")); --> false

> ValidateRecord considers a record invalid if it has an integer value and 
> schema says double, even if strict type checking is disabled
> -------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: NIFI-5141
>                 URL: https://issues.apache.org/jira/browse/NIFI-5141
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Extensions
>            Reporter: Mark Payne
>            Assignee: Mark Payne
>            Priority: Major
>              Labels: Record, beginner, newbie, validation
>             Fix For: 1.7.0
>
>




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to