/**
 * 
 *
 * @param string $ps_refinery_name 
 * 
 * @return array
 */
function caGenericImportSplitter($ps_refinery_name, $ps_item_prefix, $ps_table, $po_refinery_instance, &$pa_destination_data, $pa_group, $pa_item, $pa_source_data, $pa_options)
{
    global $g_ui_locale_id;
    $po_refinery_instance->setReturnsMultipleValues(true);
    $o_dm = Datamodel::load();
    $po_refinery_instance->setReturnsMultipleValues(true);
    $o_log = caGetOption('log', $pa_options, null);
    $o_reader = caGetOption('reader', $pa_options, null);
    $o_trans = caGetOption('transaction', $pa_options, null);
    $pn_value_index = caGetOption('valueIndex', $pa_options, 0);
    // We can probably always use the item destination – using group destination is a vestige of older code and no longer is used
    // but we're leaving it in for now as a fallback it item dest is not set for some reason
    $va_group_dest = isset($pa_item['destination']) && $pa_item['destination'] ? explode(".", $pa_item['destination']) : explode(".", $pa_group['destination']);
    $vs_terminal = array_pop($va_group_dest);
    $vs_dest_table = $va_group_dest[0];
    $va_group_dest[] = $vs_terminal;
    $pm_value = !isset($pa_source_data[$pa_item['source']]) && $o_reader ? caProcessImportItemSettingsForValue($o_reader->get($pa_item['source'], array('returnAsArray' => true)), $pa_item['settings']) : $pa_source_data[$pa_item['source']];
    if (is_array($pm_value)) {
        if (isset($pm_value[$pn_value_index])) {
            $va_delimited_items = $pm_value[$pn_value_index];
            // for input formats that support repeating values
        } else {
            $va_delimited_items = array_shift($va_delimited_items);
        }
    } else {
        $va_delimited_items = array($pm_value);
    }
    if (!is_array($va_delimited_items)) {
        $va_delimited_items = array($va_delimited_items);
    }
    $va_delimiter = $pa_item['settings']["{$ps_refinery_name}_delimiter"];
    if (!is_array($va_delimiter)) {
        $va_delimiter = array($va_delimiter);
    }
    if (sizeof($va_delimiter)) {
        foreach ($va_delimiter as $vn_index => $vs_delim) {
            if (!trim($vs_delim, "\t ")) {
                unset($va_delimiter[$vn_index]);
                continue;
            }
            $va_delimiter[$vn_index] = preg_quote($vs_delim, "!");
        }
    }
    $va_match_on = caGetOption('matchOn', $pa_options, null);
    if (!is_array($va_match_on) && $va_match_on) {
        $va_match_on = array($va_match_on);
    } elseif (is_array($va_match_on = $pa_item['settings']["{$ps_refinery_name}_matchOn"])) {
        $pa_options['matchOn'] = $va_match_on;
    }
    $pb_dont_create = caGetOption('dontCreate', $pa_options, (bool) $pa_item['settings']["{$ps_refinery_name}_dontCreate"]);
    $va_vals = array();
    $vn_c = 0;
    if (!($t_instance = $o_dm->getInstanceByTableName($ps_table, true))) {
        return array();
    }
    if ($o_trans) {
        $t_instance->setTransaction($o_trans);
    }
    $vs_label_fld = $t_instance->getLabelDisplayField();
    if (sizeof($va_group_dest) == 1 && $vs_terminal == $ps_table || $vs_terminal != $ps_table && sizeof($va_group_dest) > 1) {
        foreach ($va_delimited_items as $vn_x => $vs_delimited_item) {
            $va_items = sizeof($va_delimiter) ? preg_split("!(" . join("|", $va_delimiter) . ")!", $vs_delimited_item) : array($vs_delimited_item);
            foreach ($va_items as $vn_i => $vs_item) {
                $va_parents = $pa_item['settings']["{$ps_refinery_name}_parents"];
                if (!($vs_item = trim($vs_item))) {
                    if (is_array($va_parents) && sizeof($va_parents) > 0) {
                        // try to ladder up the parents hierarchy since the base value is blank (see PROV-972)
                        $vs_display_field = $t_instance->getLabelDisplayField();
                        while (sizeof($va_parents) > 0) {
                            $va_p = array_pop($va_parents);
                            if ($vs_laddered_val = BaseRefinery::parsePlaceholder($va_p[$vs_display_field], $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader, 'delimiter' => $va_delimiter, 'returnDelimitedValueAt' => $vn_x))) {
                                if ($o_log) {
                                    $o_log->logDebug(_t('[{$ps_refinery_name}] Used parent value %1 because the mapped value was blank', $vs_item));
                                }
                                $vs_item = $vs_laddered_val;
                                break;
                            }
                        }
                    }
                    if (!$vs_item) {
                        continue;
                    }
                }
                if (is_array($va_skip_values = $pa_item['settings']["{$ps_refinery_name}_skipIfValue"]) && in_array($vs_item, $va_skip_values)) {
                    if ($o_log) {
                        $o_log->logDebug(_t('[{$ps_refinery_name}] Skipped %1 because it was in the skipIfValue list', $vs_item));
                    }
                    continue;
                }
                // Set label
                $va_val = array();
                // Set value as hierarchy
                if ($va_hierarchy_setting = $pa_item['settings']["{$ps_refinery_name}_hierarchy"]) {
                    $va_attr_vals = $va_val = caProcessRefineryParents($ps_refinery_name, $ps_table, $va_hierarchy_setting, $pa_source_data, $pa_item, $pn_value_index, array_merge($pa_options, array('hierarchyMode' => true)));
                    $vs_item = $va_val['_preferred_label'];
                } else {
                    // Set type
                    if ($vs_type_opt = $pa_item['settings']["{$ps_refinery_name}_{$ps_item_prefix}Type"]) {
                        $va_val['_type'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader));
                    }
                    if ((!isset($va_val['_type']) || !$va_val['_type']) && ($vs_type_opt = $pa_item['settings']["{$ps_refinery_name}_{$ps_item_prefix}TypeDefault"])) {
                        if (!($va_val['_type'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader, 'delimiter' => $va_delimiter, 'returnDelimitedValueAt' => $vn_x)))) {
                            $va_val['_type'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader));
                        }
                    }
                    // Set lot_status
                    if ($vs_type_opt = $pa_item['settings']["{$ps_refinery_name}_{$ps_item_prefix}Status"]) {
                        $va_val['_status'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader));
                    }
                    if ((!isset($va_val['_status']) || !$va_val['_status']) && ($vs_type_opt = $pa_item['settings']["{$ps_refinery_name}_{$ps_item_prefix}StatusDefault"])) {
                        $va_val['_status'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader));
                    }
                    if ((!isset($va_val['_type']) || !$va_val['_type']) && $o_log) {
                        $o_log->logWarn(_t("[{$ps_refinery_name}] No %2 type is set for %2 %1", $vs_item, $ps_item_prefix));
                    }
                    //
                    // Storage location specific options
                    //
                    if ($ps_refinery_name == 'storageLocationSplitter' && ($va_hier_delimiter = $pa_item['settings']['storageLocationSplitter_hierarchicalDelimiter'])) {
                        if (!is_array($va_hier_delimiter)) {
                            $va_hier_delimiter = array($va_hier_delimiter);
                        }
                        if (sizeof($va_hier_delimiter)) {
                            foreach ($va_hier_delimiter as $vn_index => $vs_delim) {
                                if (!trim($vs_delim, "\t ")) {
                                    unset($va_hier_delimiter[$vn_index]);
                                    continue;
                                }
                                $va_hier_delimiter[$vn_index] = preg_quote($vs_delim, "!");
                            }
                        }
                        $va_location_hier = preg_split("!(" . join("|", $va_hier_delimiter) . ")!", $vs_item);
                        if (sizeof($va_location_hier) > 1) {
                            $vn_location_id = null;
                            if (!is_array($va_types = $pa_item['settings']['storageLocationSplitter_hierarchicalStorageLocationTypes'])) {
                                $va_types = array();
                            }
                            $vs_item = array_pop($va_location_hier);
                            if (!($va_val['_type'] = array_pop($va_types))) {
                                $va_val['_type'] = $pa_item['settings']['storageLocationSplitter_storageLocationTypeDefault'];
                            }
                            foreach ($va_location_hier as $vn_i => $vs_parent) {
                                if (sizeof($va_types) > 0) {
                                    $vs_type = array_shift($va_types);
                                } else {
                                    if (!($vs_type = $pa_item['settings']['storageLocationSplitter_storageLocationType'])) {
                                        $vs_type = $pa_item['settings']['storageLocationSplitter_storageLocationTypeDefault'];
                                    }
                                }
                                if (!$vs_type) {
                                    break;
                                }
                                $vn_location_id = DataMigrationUtils::getStorageLocationID($vs_parent, $vn_location_id, $vs_type, $g_ui_locale_id, array('idno' => $vs_parent, 'parent_id' => $vn_location_id), $pa_options);
                            }
                            $va_val['parent_id'] = $va_val['_parent_id'] = $vn_location_id;
                        }
                    } else {
                        // Set parents
                        if ($va_parents) {
                            $va_val['parent_id'] = $va_val['_parent_id'] = caProcessRefineryParents($ps_refinery_name, $ps_table, $va_parents, $pa_source_data, $pa_item, $pn_value_index, $pa_options);
                        }
                        if (isset($pa_options['defaultParentID']) && (!isset($va_val['parent_id']) || !$va_val['parent_id'])) {
                            $va_val['parent_id'] = $va_val['_parent_id'] = $pa_options['defaultParentID'];
                        }
                    }
                    if (isset($pa_options['hierarchyID']) && $pa_options['hierarchyID'] && ($vs_hier_id_fld = $t_instance->getProperty('HIERARCHY_ID_FLD'))) {
                        $va_val[$vs_hier_id_fld] = $pa_options['hierarchyID'];
                    }
                    // Set attributes
                    if (is_array($va_attr_vals = caProcessRefineryAttributes($pa_item['settings']["{$ps_refinery_name}_attributes"], $pa_source_data, $pa_item, $vn_i, array('log' => $o_log, 'reader' => $o_reader)))) {
                        $va_val = array_merge($va_val, $va_attr_vals);
                    }
                    // Set interstitials
                    if (isset($pa_options['mapping']) && is_array($va_attr_vals = caProcessInterstitialAttributes($ps_refinery_name, $pa_options['mapping']->get('table_num'), $ps_table, $pa_source_data, $pa_item, $vn_i, array('log' => $o_log, 'reader' => $o_reader)))) {
                        $va_val = array_merge($va_val, $va_attr_vals);
                    }
                    // Set relationships on the related table
                    caProcessRefineryRelatedMultiple($po_refinery_instance, $pa_item, $pa_source_data, $vn_i, $o_log, $o_reader, $va_val, $va_attr_vals);
                    // Set nonpreferred labels
                    if (is_array($va_non_preferred_labels = $pa_item['settings']["{$ps_refinery_name}_nonPreferredLabels"])) {
                        $pa_options['nonPreferredLabels'] = array();
                        foreach ($va_non_preferred_labels as $va_label) {
                            foreach ($va_label as $vs_k => $vs_v) {
                                $va_label[$vs_k] = BaseRefinery::parsePlaceholder($vs_v, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
                            }
                            $pa_options['nonPreferredLabels'][] = $va_label;
                        }
                    }
                }
                if ($vs_dest_table != $ps_table && sizeof($va_group_dest) > 1) {
                    $vs_item = BaseRefinery::parsePlaceholder($vs_item, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
                    if (!is_array($va_attr_vals)) {
                        $va_attr_vals = array();
                    }
                    $va_attr_vals_with_parent = array_merge($va_attr_vals, array('parent_id' => $va_val['parent_id'] ? $va_val['parent_id'] : $va_val['_parent_id']));
                    $pa_options = array('matchOn' => array('idno', 'label')) + $pa_options;
                    switch ($ps_table) {
                        case 'ca_objects':
                            $vn_item_id = DataMigrationUtils::getObjectID($vs_item, $va_val['parent_id'], $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_object_lots':
                            if (isset($va_val['_status'])) {
                                $va_attr_vals['lot_status_id'] = $va_val['_status'];
                            }
                            unset($va_val['_status']);
                            $vn_item_id = DataMigrationUtils::getObjectLotID($vs_item, $vs_item, $va_val['_type'], $g_ui_locale_id, $va_attr_vals, $pa_options);
                            break;
                        case 'ca_entities':
                            $vn_item_id = DataMigrationUtils::getEntityID(DataMigrationUtils::splitEntityName($vs_item, $pa_options), $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_places':
                            $vn_item_id = DataMigrationUtils::getPlaceID($vs_item, $va_val['parent_id'], $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_occurrences':
                            $vn_item_id = DataMigrationUtils::getOccurrenceID($vs_item, $va_val['parent_id'], $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_collections':
                            $vn_item_id = DataMigrationUtils::getCollectionID($vs_item, $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_loans':
                            $vn_item_id = DataMigrationUtils::getLoanID($vs_item, $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_movements':
                            $vn_item_id = DataMigrationUtils::getMovementID($vs_item, $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_list_items':
                            if (!$pa_options['list_id']) {
                                if ($o_log) {
                                    $o_log->logDebug(_t('[importHelpers:caGenericImportSplitter] List was not specified'));
                                }
                                continue 2;
                            }
                            $va_attr_vals_with_parent['is_enabled'] = 1;
                            $vn_item_id = DataMigrationUtils::getListItemID($pa_options['list_id'], $vs_item, $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_storage_locations':
                            $vn_item_id = DataMigrationUtils::getStorageLocationID($vs_item, $va_val['parent_id'], $va_val['_type'], $g_ui_locale_id, $va_attr_vals_with_parent, $pa_options);
                            break;
                        case 'ca_object_representations':
                            if ($o_log) {
                                $o_log->logDebug(_t('[importHelpers:caGenericImportSplitter] Only media paths can be mapped for object representations.'));
                            }
                            continue 2;
                        default:
                            if ($o_log) {
                                $o_log->logDebug(_t('[importHelpers:caGenericImportSplitter] Invalid table %1', $ps_table));
                            }
                            continue 2;
                            break;
                    }
                    if ($vn_item_id) {
                        $va_vals[][$vs_terminal] = $vn_item_id;
                        continue;
                    } else {
                        if ($o_log && !$pb_dont_create) {
                            $o_log->logError(_t("[{$ps_refinery_name}Refinery] Could not add %2 %1", $vs_item, $ps_item_prefix));
                        }
                    }
                } elseif (sizeof($va_group_dest) == 1 && $vs_terminal == $ps_table) {
                    // Set relationship type
                    if ($vs_rel_type_opt = $pa_item['settings']["{$ps_refinery_name}_relationshipType"]) {
                        $va_val['_relationship_type'] = BaseRefinery::parsePlaceholder($vs_rel_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader));
                    }
                    if ((!isset($va_val['_relationship_type']) || !$va_val['_relationship_type']) && ($vs_rel_type_opt = $pa_item['settings']["{$ps_refinery_name}_relationshipTypeDefault"])) {
                        if (!($va_val['_relationship_type'] = BaseRefinery::parsePlaceholder($vs_rel_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader, 'delimiter' => $va_delimiter, 'returnDelimitedValueAt' => $vn_x)))) {
                            $va_val['_relationship_type'] = BaseRefinery::parsePlaceholder($vs_rel_type_opt, $pa_source_data, $pa_item, $pn_value_index, array('reader' => $o_reader));
                        }
                    }
                    if ((!isset($va_val['_relationship_type']) || !$va_val['_relationship_type']) && $o_log) {
                        $o_log->logWarn(_t("[{$ps_refinery_name}Refinery] No relationship type is set for %2 %1", $vs_item, $ps_item_prefix));
                    }
                    switch ($ps_table) {
                        case 'ca_entities':
                            $va_val['preferred_labels'] = DataMigrationUtils::splitEntityName($vs_item, $pa_options);
                            if (!isset($va_val['idno'])) {
                                $va_val['idno'] = $vs_item;
                            }
                            break;
                        case 'ca_list_items':
                            $va_val['preferred_labels'] = array('name_singular' => str_replace("_", " ", $vs_item), 'name_plural' => str_replace("_", " ", $vs_item));
                            $va_val['_list'] = $pa_options['list_id'];
                            if (!isset($va_val['idno'])) {
                                $va_val['idno'] = $vs_item;
                            }
                            break;
                        case 'ca_storage_locations':
                        case 'ca_movements':
                        case 'ca_loans':
                        case 'ca_collections':
                        case 'ca_occurrences':
                        case 'ca_places':
                        case 'ca_objects':
                            $va_val['preferred_labels'] = array('name' => $vs_item);
                            if (!isset($va_val['idno'])) {
                                $va_val['idno'] = $vs_item;
                            }
                            break;
                        case 'ca_object_lots':
                            $va_val['preferred_labels'] = array('name' => $vs_item);
                            if (!isset($va_val['idno_stub'])) {
                                $va_val['idno_stub'] = $vs_item;
                            }
                            if (isset($va_val['_status'])) {
                                $va_val['lot_status_id'] = $va_val['_status'];
                            }
                            unset($va_val['_status']);
                            break;
                        case 'ca_object_representations':
                            if (!($vs_batch_media_directory = $t_instance->getAppConfig()->get('batch_media_import_root_directory'))) {
                                break;
                            }
                            if (!isset($va_val['preferred_labels'])) {
                                $va_val['preferred_labels'] = array('name' => $vs_item);
                            }
                            if (isset($pa_item['settings']['objectRepresentationSplitter_mediaPrefix']) && $pa_item['settings']['objectRepresentationSplitter_mediaPrefix'] && isset($va_val['media']['media']) && $va_val['media']['media']) {
                                $va_val['media']['media'] = $vs_batch_media_directory . '/' . $pa_item['settings']['objectRepresentationSplitter_mediaPrefix'] . '/' . $va_val['media']['media'];
                            }
                            if (!isset($va_val['idno'])) {
                                $va_val['idno'] = $vs_item;
                            }
                            break;
                        default:
                            if ($o_log) {
                                $o_log->logDebug(_t('[importHelpers:caGenericImportSplitter] Invalid table %1', $ps_table));
                            }
                            continue 2;
                            break;
                    }
                    if (isset($pa_options['nonPreferredLabels']) && is_array($pa_options['nonPreferredLabels'])) {
                        $va_val['nonpreferred_labels'] = $pa_options['nonPreferredLabels'];
                    }
                } elseif (sizeof($va_group_dest) == 2 && $vs_terminal == 'preferred_labels') {
                    switch ($ps_table) {
                        case 'ca_entities':
                            $va_val = DataMigrationUtils::splitEntityName($vs_item, $pa_options);
                            break;
                        case 'ca_list_items':
                            $va_val = array('name_singular' => $vs_item, 'name_plural' => $vs_item);
                            break;
                        case 'ca_storage_locations':
                        case 'ca_movements':
                        case 'ca_loans':
                        case 'ca_collections':
                        case 'ca_occurrences':
                        case 'ca_places':
                        case 'ca_objects':
                            $va_val = array('name' => $vs_item);
                            break;
                        case 'ca_object_lots':
                            $va_val = array('name' => $vs_item);
                            break;
                        case 'ca_object_representations':
                            if ($o_log) {
                                $o_log->logDebug(_t('[importHelpers:caGenericImportSplitter] Cannot map preferred labels to object representations. Only media paths can be mapped.'));
                            }
                            continue 2;
                        default:
                            if ($o_log) {
                                $o_log->logDebug(_t('[importHelpers:caGenericImportSplitter] Invalid table %1', $ps_table));
                            }
                            continue 2;
                            break;
                    }
                } else {
                    if ($o_log) {
                        $o_log->logError(_t("[{$ps_refinery_name}Refinery] Could not add %2 %1: cannot map %3 using %1", $vs_item, $ps_item_prefix, join(".", $va_group_dest)));
                    }
                }
                $va_val['_matchOn'] = $va_match_on;
                if ($pb_dont_create) {
                    $va_val['_dontCreate'] = 1;
                }
                $va_vals[] = $va_val;
                $vn_c++;
            }
        }
    } else {
        if ($o_log) {
            $o_log->logError(_t("[{$ps_refinery_name}Refinery] Cannot map %1 using this refinery", $pa_group['destination']));
        }
        return array();
    }
    return $va_vals;
}
 /**
  *
  */
 public function refine(&$pa_destination_data, $pa_group, $pa_item, $pa_source_data, $pa_options = null)
 {
     $o_log = isset($pa_options['log']) && is_object($pa_options['log']) ? $pa_options['log'] : null;
     $va_group_dest = explode(".", $pa_group['destination']);
     $vs_terminal = array_pop($va_group_dest);
     $pm_value = $pa_source_data[$pa_item['source']];
     if (is_array($pm_value)) {
         $va_entities = $pm_value;
         // for input formats that support repeating values
     } else {
         $va_entities = array($pm_value);
     }
     $va_vals = array();
     $vn_c = 0;
     $t_entity = new ca_entities();
     foreach ($va_entities as $pm_value) {
         if (!($vs_entity = trim($pm_value))) {
             return array();
         }
         if (is_array($va_skip_values = $pa_item['settings']['entityJoiner_skipIfValue']) && in_array($vs_entity, $va_skip_values)) {
             return array();
         }
         $va_name = array();
         foreach ($t_entity->getLabelUIFields() as $vs_fld) {
             $va_name[$vs_fld] = BaseRefinery::parsePlaceholder($pa_item['settings']['entityJoiner_' . $vs_fld], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '));
         }
         if (isset($va_name[$vs_terminal])) {
             return $va_name[$vs_terminal];
         }
         if (in_array($vs_terminal, array('preferred_labels', 'nonpreferred_labels'))) {
             return $va_name;
         }
         // Set label
         $va_val = array('preferred_labels' => $va_name);
         // Set relationship type
         if ($vs_rel_type_opt = $pa_item['settings']['entityJoiner_relationshipType']) {
             $va_val['_relationship_type'] = BaseRefinery::parsePlaceholder($vs_rel_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '));
         }
         if ((!isset($va_val['_relationship_type']) || !$va_val['_relationship_type']) && ($vs_rel_type_opt = $pa_item['settings']['entityJoiner_relationshipTypeDefault'])) {
             $va_val['_relationship_type'] = BaseRefinery::parsePlaceholder($vs_rel_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '));
         }
         if ((!isset($va_val['_relationship_type']) || !$va_val['_relationship_type']) && $o_log) {
             $o_log->logWarn(_t('[entityJoinerRefinery] No relationship type is set for entity %1', $vs_entity));
         }
         // Set entity_type
         if ($vs_type_opt = $pa_item['settings']['entityJoiner_entityType']) {
             $va_val['_type'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '));
         }
         if ((!isset($va_val['_type']) || !$va_val['_type']) && ($vs_type_opt = $pa_item['settings']['entityJoiner_entityTypeDefault'])) {
             $va_val['_type'] = BaseRefinery::parsePlaceholder($vs_type_opt, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '));
         }
         if ((!isset($va_val['_type']) || !$va_val['_type']) && $o_log) {
             $o_log->logWarn(_t('[entityJoinerRefinery] No entity type is set for entity %1', $vs_entity));
         }
         // Set attributes
         if (is_array($va_attr_vals = caProcessRefineryAttributes($pa_item['settings']['entityJoiner_attributes'], $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'log' => $o_log)))) {
             $va_val = array_merge($va_val, $va_attr_vals);
         }
         // Set interstitials
         if (isset($pa_options['mapping']) && is_array($va_attr_vals = caProcessInterstitialAttributes('entityJoiner', $pa_options['mapping']->get('table_num'), 'ca_entities', $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'log' => $o_log)))) {
             $va_val = array_merge($va_val, $va_attr_vals);
         }
         caProcessRefineryRelatedMultiple($this, $pa_item, $pa_source_data, $vn_c, $o_log, caGetOption('reader', $pa_options, null), $va_val, $va_vals);
         // nonpreferred labels
         if (is_array($pa_item['settings']['entityJoiner_nonpreferred_labels'])) {
             $va_non_preferred_labels = array();
             foreach ($pa_item['settings']['entityJoiner_nonpreferred_labels'] as $vn_index => $va_elements) {
                 if (is_array($va_elements)) {
                     $vb_non_pref_label_was_set = false;
                     foreach ($va_elements as $vs_k => $vs_v) {
                         if (!trim($vs_v)) {
                             continue;
                         }
                         if ($vs_k == 'split') {
                             if (!is_array($va_non_preferred_labels[$vn_index])) {
                                 $va_non_preferred_labels[$vn_index] = array();
                             }
                             if ($vs_name = BaseRefinery::parsePlaceholder($vs_v, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' '))) {
                                 $va_non_preferred_labels[$vn_index] = array_merge($va_non_preferred_labels[$vn_index], DataMigrationUtils::splitEntityName($vs_name));
                                 $vb_non_pref_label_was_set = true;
                             }
                         } else {
                             if ($va_non_preferred_labels[$vn_index][$vs_k] = trim(BaseRefinery::parsePlaceholder($vs_v, $pa_source_data, $pa_item, $vn_c, array('reader' => caGetOption('reader', $pa_options, null), 'returnAsString' => true, 'delimiter' => ' ')))) {
                                 $vb_non_pref_label_was_set = true;
                             }
                         }
                     }
                 }
                 if (!$vb_non_pref_label_was_set) {
                     unset($va_non_preferred_labels[$vn_index]);
                 }
             }
             if (sizeof($va_non_preferred_labels)) {
                 $va_val['nonpreferred_labels'] = $va_non_preferred_labels;
             }
         }
         $va_vals[] = $va_val;
         $vn_c++;
     }
     return $va_vals;
 }