NIFI-3951: Fixed bug that calculated the index incorrectly when filtering for ArrayIndexPath

This closes #1835.

Signed-off-by: Bryan Bende <bbende@apache.org>
This commit is contained in:
Mark Payne 2017-05-22 09:45:35 -04:00 committed by Bryan Bende
parent 7f8987471d
commit 1a3c525dd6
No known key found for this signature in database
GPG Key ID: A0DDA9ED50711C39
1 changed files with 6 additions and 2 deletions

View File

@ -42,16 +42,20 @@ public class ArrayIndexPath extends RecordPathSegment {
return parentResult return parentResult
.filter(Filters.fieldTypeFilter(RecordFieldType.ARRAY)) .filter(Filters.fieldTypeFilter(RecordFieldType.ARRAY))
.filter(fieldValue -> fieldValue.getValue() != null && ((Object[]) fieldValue.getValue()).length >= Math.abs(index) - 1) .filter(fieldValue -> fieldValue.getValue() != null && ((Object[]) fieldValue.getValue()).length > getArrayIndex(((Object[]) fieldValue.getValue()).length))
.map(fieldValue -> { .map(fieldValue -> {
final ArrayDataType arrayDataType = (ArrayDataType) fieldValue.getField().getDataType(); final ArrayDataType arrayDataType = (ArrayDataType) fieldValue.getField().getDataType();
final DataType elementDataType = arrayDataType.getElementType(); final DataType elementDataType = arrayDataType.getElementType();
final RecordField arrayField = new RecordField(fieldValue.getField().getFieldName(), elementDataType); final RecordField arrayField = new RecordField(fieldValue.getField().getFieldName(), elementDataType);
final Object[] values = (Object[]) fieldValue.getValue(); final Object[] values = (Object[]) fieldValue.getValue();
final int arrayIndex = index < 0 ? values.length + index : index; final int arrayIndex = getArrayIndex(values.length);
final RecordField elementField = new RecordField(arrayField.getFieldName() + "[" + arrayIndex + "]", elementDataType); final RecordField elementField = new RecordField(arrayField.getFieldName() + "[" + arrayIndex + "]", elementDataType);
final FieldValue result = new ArrayIndexFieldValue(values[arrayIndex], elementField, fieldValue, arrayIndex); final FieldValue result = new ArrayIndexFieldValue(values[arrayIndex], elementField, fieldValue, arrayIndex);
return result; return result;
}); });
} }
private int getArrayIndex(final int arrayLength) {
return index < 0 ? arrayLength + index : index;
}
} }