/**
 * Process relationships on the refinery
 *
 * @param $ps_related_table
 * @param $pa_related_option_list
 * @param array $pa_source_data
 * @param array $pa_item
 * @param int $pn_c
 * @param null $pa_options
 *
 * @return array
 */
function caProcessRefineryRelated($ps_related_table, $pa_related_option_list, $pa_source_data, $pa_item, $pn_c, $pa_options = null)
{
    $o_reader = caGetOption('reader', $pa_options, null);
    $o_log = caGetOption('log', $pa_options, null);
    $o_trans = caGetOption('transaction', $pa_options, null);
    global $g_ui_locale_id;
    $va_attr_vals = array();
    if (!$pa_related_option_list || !is_array($pa_related_option_list)) {
        return $va_attr_vals;
    }
    foreach ($pa_related_option_list as $vn_i => $pa_related_options) {
        $vn_id = null;
        $va_name = null;
        $vs_name = caGetOption('name', $pa_related_options, null);
        $vs_name = BaseRefinery::parsePlaceholder($pa_related_options['name'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
        $vs_idno = BaseRefinery::parsePlaceholder($pa_related_options['idno'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
        $vs_type = BaseRefinery::parsePlaceholder($pa_related_options['type'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
        $vn_parent_id = BaseRefinery::parsePlaceholder($pa_related_options['parent_id'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
        if (!$vs_name) {
            $vs_name = $vs_idno;
        }
        if ($ps_related_table == 'ca_entities') {
            $t_entity = new ca_entities();
            if ($o_trans) {
                $t_entity->setTransaction($o_trans);
            }
            if (!$vs_name) {
                $va_name = array();
                foreach ($t_entity->getLabelUIFields() as $vs_label_fld) {
                    if (!isset($pa_related_options[$vs_label_fld])) {
                        $pa_related_options[$vs_label_fld] = '';
                    }
                    $va_name[$vs_label_fld] = BaseRefinery::parsePlaceholder($pa_related_options[$vs_label_fld], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader));
                }
            } else {
                $va_name = DataMigrationUtils::splitEntityName($vs_name, $pa_options);
            }
            if (!is_array($va_name) || !$va_name) {
                if ($o_log) {
                    $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] No name specified for table %1', $ps_related_table));
                }
                return null;
            }
        }
        if (!$vs_name) {
            if ($o_log) {
                $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] No name specified for table %1', $ps_related_table));
            }
            return null;
        }
        $vs_name = BaseRefinery::parsePlaceholder($vs_name, $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader));
        $va_attributes = isset($pa_related_options['attributes']) && is_array($pa_related_options['attributes']) ? $pa_related_options['attributes'] : array();
        foreach ($va_attributes as $vs_element_code => $va_attrs) {
            if (is_array($va_attrs)) {
                foreach ($va_attrs as $vs_k => $vs_v) {
                    // BaseRefinery::parsePlaceholder may return an array if the input format supports repeated values (as XML does)
                    // DataMigrationUtils::getCollectionID(), which ca_data_importers::importDataFromSource() uses to create related collections
                    // only supports non-repeating attribute values, so we join any values here and call it a day.
                    $va_attributes[$vs_element_code][$vs_k] = BaseRefinery::parsePlaceholder($vs_v, $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
                }
            } else {
                $va_attributes[$vs_element_code] = array($vs_element_code => BaseRefinery::parsePlaceholder($va_attrs, $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' ')));
            }
        }
        if ($ps_related_table != 'ca_object_lots') {
            $va_attributes['idno'] = $vs_idno;
            $va_attributes['parent_id'] = $vn_parent_id;
        } else {
            $vs_idno_stub = BaseRefinery::parsePlaceholder($pa_related_options['idno_stub'], $pa_source_data, $pa_item, $pn_c, array('reader' => $o_reader, 'returnAsString' => true, 'delimiter' => ' '));
        }
        $pa_options = array_merge(array('matchOn' => array('idno', 'label'), $pa_options));
        switch ($ps_related_table) {
            case 'ca_objects':
                $vn_id = DataMigrationUtils::getObjectID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_object_lots':
                $vn_id = DataMigrationUtils::getObjectLotID($vs_idno_stub, $vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_entities':
                $vn_id = DataMigrationUtils::getEntityID($va_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_places':
                $vn_id = DataMigrationUtils::getPlaceID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_occurrences':
                $vn_id = DataMigrationUtils::getOccurrenceID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_collections':
                $vn_id = DataMigrationUtils::getCollectionID($vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_loans':
                $vn_id = DataMigrationUtils::getLoanID($vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_movements':
                $vn_id = DataMigrationUtils::getMovementID($vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_list_items':
                if (!($vn_list_id = caGetOption('list_id', $pa_options, null))) {
                    if ($o_log) {
                        $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] List was not specified'));
                    }
                    return null;
                }
                $vn_id = DataMigrationUtils::getListItemID($vn_list_id, $vs_name, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            case 'ca_storage_locations':
                $vn_id = DataMigrationUtils::getStorageLocationID($vs_name, $vn_parent_id, $vs_type, $g_ui_locale_id, $va_attributes, $pa_options);
                break;
            default:
                if ($o_log) {
                    $o_log->logDebug(_t('[importHelpers:caProcessRefineryRelated] Invalid table %1', $ps_related_table));
                }
                return null;
                break;
        }
        if ($vn_id) {
            $va_attr_vals['_related_related'][$ps_related_table][] = array('id' => $vn_id, '_relationship_type' => $pa_related_options['relationshipType']);
        }
    }
    return $va_attr_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;
 }