NIFI-8297: Report incompatible value if it doesn't fit in an Integer

Signed-off-by: Pierre Villard <pierre.villard.fr@gmail.com>

This closes #4886.
This commit is contained in:
Matthew Burgess 2021-03-10 12:32:06 -05:00 committed by Pierre Villard
parent 931f8fe798
commit b039606cf8
No known key found for this signature in database
GPG Key ID: F92A93B30C07C6D5
2 changed files with 24 additions and 0 deletions

View File

@ -1598,6 +1598,14 @@ public class DataTypeUtils {
}
public static boolean isIntegerTypeCompatible(final Object value) {
if (value instanceof Number) {
try {
Math.toIntExact(((Number) value).longValue());
return true;
} catch (ArithmeticException ae) {
return false;
}
}
return isNumberTypeCompatible(value, s -> isIntegral(s, Integer.MIN_VALUE, Integer.MAX_VALUE));
}

View File

@ -429,6 +429,22 @@ public class TestDataTypeUtils {
assertFalse(DataTypeUtils.isCompatibleDataType(new Long[]{1L, 2L}, dataType));
}
@Test
public void testIsCompatibleDataTypeInteger() {
final DataType dataType = RecordFieldType.INT.getDataType();
assertTrue(DataTypeUtils.isCompatibleDataType(new Integer("1234567"), dataType));
assertTrue(DataTypeUtils.isCompatibleDataType("1234567", dataType));
assertFalse(DataTypeUtils.isCompatibleDataType(new BigInteger("12345678901234567890"), dataType));
assertFalse(DataTypeUtils.isCompatibleDataType(1234567890123456789L, dataType));
assertTrue(DataTypeUtils.isCompatibleDataType(1, dataType));
assertTrue(DataTypeUtils.isCompatibleDataType((short) 1, dataType));
assertFalse(DataTypeUtils.isCompatibleDataType("12345678901234567890", dataType));
assertTrue(DataTypeUtils.isCompatibleDataType(3.1f, dataType));
assertTrue(DataTypeUtils.isCompatibleDataType(3.0, dataType));
assertFalse(DataTypeUtils.isCompatibleDataType("1234567XYZ", dataType));
assertFalse(DataTypeUtils.isCompatibleDataType(new Long[]{1L, 2L}, dataType));
}
@Test
public void testIsCompatibleDataTypeArrayDifferentElementTypes() {
Object[] array = new Object[]{"2", 1};