You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Ed Berezitsky (JIRA)" <ji...@apache.org> on 2018/05/08 03:46:00 UTC

[jira] [Comment Edited] (NIFI-5141) ValidateRecord considers a record invalid if it has an integer value and schema says double, even if strict type checking is disabled

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