[ 
https://issues.apache.org/jira/browse/NIFI-9956?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Lehel Boér updated NIFI-9956:
-----------------------------
    Description: 
In QuerySalesforceObject, the converted NiFi RecordSchema is wrapped in a 
"records" schema field.

 
{code:java}
RecordSchema querySObjectResultSchema = new 
SimpleRecordSchema(Collections.singletonList(
        new RecordField(STARTING_FIELD_NAME, 
RecordFieldType.ARRAY.getArrayDataType(
                RecordFieldType.RECORD.getRecordDataType(
                        recordSchema
                )
        ))
)); {code}
In JsonTreeReader the fieldNames are extracted from the Json node, not from the 
schema.
{code:java}
final Iterator<String> fieldNames = jsonNode.fieldNames();{code}
When trying to get the recordField by the fieldName, the result is always null, 
because the schema is wrapped in an outer "record" array type and it does not 
have the field name. The value type will be inferred in _getRawNodeValue._
{code:java}
while (fieldNames.hasNext()) {
    final String fieldName = fieldNames.next();
    final JsonNode childNode = jsonNode.get(fieldName);

    final RecordField recordField = schema.getField(fieldName).orElse(null);

    final Object value;
    if (coerceTypes && recordField != null) {
        final DataType desiredType = recordField.getDataType();
        final String fullFieldName = fieldNamePrefix == null ? fieldName : 
fieldNamePrefix + fieldName;
        value = convertField(childNode, fullFieldName, desiredType, 
dropUnknown);
    } else {
        value = getRawNodeValue(childNode, recordField == null ? null : 
recordField.getDataType(), fieldName);
    }

    values.put(fieldName, value);
} {code}
I think the wrapper "record" array type can be removed from the 
SObjectResultSchema.

  was:
In QuerySalesforceObject, the converted NiFi RecordSchema is wrapped in a 
"records" schema field.

 
{code:java}
RecordSchema querySObjectResultSchema = new 
SimpleRecordSchema(Collections.singletonList(
        new RecordField(STARTING_FIELD_NAME, 
RecordFieldType.ARRAY.getArrayDataType(
                RecordFieldType.RECORD.getRecordDataType(
                        recordSchema
                )
        ))
)); {code}
In JsonTreeReader the fieldNames are extracted from the Json node, not from the 
schema.
{code:java}
final Iterator<String> fieldNames = jsonNode.fieldNames();{code}
When trying to get the recordField by the fieldName, the result is always null, 
because the schema is wrapped in an outer "record" array type and it does not 
have the field name. 
{code:java}
while (fieldNames.hasNext()) {
    final String fieldName = fieldNames.next();
    final JsonNode childNode = jsonNode.get(fieldName);

    final RecordField recordField = schema.getField(fieldName).orElse(null);

    final Object value;
    if (coerceTypes && recordField != null) {
        final DataType desiredType = recordField.getDataType();
        final String fullFieldName = fieldNamePrefix == null ? fieldName : 
fieldNamePrefix + fieldName;
        value = convertField(childNode, fullFieldName, desiredType, 
dropUnknown);
    } else {
        value = getRawNodeValue(childNode, recordField == null ? null : 
recordField.getDataType(), fieldName);
    }

    values.put(fieldName, value);
} {code}
I think the wrapper "record" array type can be removed from the 
SObjectResultSchema.


> QuerySalesforceObject schema parsing does not work
> --------------------------------------------------
>
>                 Key: NIFI-9956
>                 URL: https://issues.apache.org/jira/browse/NIFI-9956
>             Project: Apache NiFi
>          Issue Type: Bug
>            Reporter: Lehel Boér
>            Assignee: Lehel Boér
>            Priority: Major
>
> In QuerySalesforceObject, the converted NiFi RecordSchema is wrapped in a 
> "records" schema field.
>  
> {code:java}
> RecordSchema querySObjectResultSchema = new 
> SimpleRecordSchema(Collections.singletonList(
>         new RecordField(STARTING_FIELD_NAME, 
> RecordFieldType.ARRAY.getArrayDataType(
>                 RecordFieldType.RECORD.getRecordDataType(
>                         recordSchema
>                 )
>         ))
> )); {code}
> In JsonTreeReader the fieldNames are extracted from the Json node, not from 
> the schema.
> {code:java}
> final Iterator<String> fieldNames = jsonNode.fieldNames();{code}
> When trying to get the recordField by the fieldName, the result is always 
> null, because the schema is wrapped in an outer "record" array type and it 
> does not have the field name. The value type will be inferred in 
> _getRawNodeValue._
> {code:java}
> while (fieldNames.hasNext()) {
>     final String fieldName = fieldNames.next();
>     final JsonNode childNode = jsonNode.get(fieldName);
>     final RecordField recordField = schema.getField(fieldName).orElse(null);
>     final Object value;
>     if (coerceTypes && recordField != null) {
>         final DataType desiredType = recordField.getDataType();
>         final String fullFieldName = fieldNamePrefix == null ? fieldName : 
> fieldNamePrefix + fieldName;
>         value = convertField(childNode, fullFieldName, desiredType, 
> dropUnknown);
>     } else {
>         value = getRawNodeValue(childNode, recordField == null ? null : 
> recordField.getDataType(), fieldName);
>     }
>     values.put(fieldName, value);
> } {code}
> I think the wrapper "record" array type can be removed from the 
> SObjectResultSchema.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to