code: public void processUserDefinedFields(List<Row> fields, List<Row> values)
     {
        // Process fields
        Map<Integer, String> tableNameMap = new HashMap<Integer, String>();
        for (Row row : fields)
        {
           Integer fieldId = row.getInteger("udf_type_id");
           String tableName = row.getString("table_name");
           tableNameMap.put(fieldId, tableName);
  
           FieldTypeClass fieldType = FIELD_TYPE_MAP.get(tableName);
           if (fieldType != null)
           {
              String fieldDataType = row.getString("logical_data_type");
              String fieldName = row.getString("udf_type_label");
  
              m_udfFields.put(fieldId, fieldName);
              addUserDefinedField(fieldType, UserFieldDataType.valueOf(fieldDataType), fieldName);
           }
        }
  
        // Process values
        for (Row row : values)
        {
           Integer typeID = row.getInteger("udf_type_id");
           String tableName = tableNameMap.get(typeID);
           Map<Integer, List<Row>> tableData = m_udfValues.get(tableName);
           if (tableData == null)
           {
              tableData = new HashMap<Integer, List<Row>>();
              m_udfValues.put(tableName, tableData);
           }
  
           Integer id = row.getInteger("fk_id");
           List<Row> list = tableData.get(id);
           if (list == null)
           {
              list = new ArrayList<Row>();
              tableData.put(id, list);
           }
           list.add(row);
        }
     }
docs: Process User Defined Fields (UDF).
  
  @param fields field definitions
  @param values field values