コード例 #1
0
 /**
  * Fetch local records for all the found dedup records
  *
  * @param EventInterface $event Event
  *
  * @return void
  */
 protected function fetchLocalRecords($event)
 {
     $config = $this->serviceLocator->get('VuFind\\Config');
     $searchConfig = $config->get($this->searchConfig);
     $dataSourceConfig = $config->get($this->dataSourceConfig);
     $recordSources = isset($searchConfig->Records->sources) ? $searchConfig->Records->sources : '';
     $sourcePriority = $this->determineSourcePriority($recordSources);
     $params = $event->getParam('params');
     $buildingPriority = $this->determineBuildingPriority($params);
     $idList = [];
     // Find out the best records and list their IDs:
     $result = $event->getTarget();
     foreach ($result->getRecords() as $record) {
         $fields = $record->getRawData();
         if (!isset($fields['merged_boolean'])) {
             continue;
         }
         $localIds = $fields['local_ids_str_mv'];
         $dedupId = $localIds[0];
         $priority = 99999;
         $undefPriority = 99999;
         // Find the document that matches the source priority best:
         $dedupData = [];
         foreach ($localIds as $localId) {
             $localPriority = null;
             list($source) = explode('.', $localId, 2);
             if (!empty($buildingPriority)) {
                 if (isset($buildingPriority[$source])) {
                     $localPriority = -$buildingPriority[$source];
                 } elseif (isset($dataSourceConfig[$source]['institution'])) {
                     $institution = $dataSourceConfig[$source]['institution'];
                     if (isset($buildingPriority[$institution])) {
                         $localPriority = -$buildingPriority[$institution];
                     }
                 }
             }
             if (!isset($localPriority)) {
                 if (isset($sourcePriority[$source])) {
                     $localPriority = $sourcePriority[$source];
                 } else {
                     $localPriority = ++$undefPriority;
                 }
             }
             if (isset($localPriority) && $localPriority < $priority) {
                 $dedupId = $localId;
                 $priority = $localPriority;
             }
             $dedupData[$source] = ['id' => $localId, 'priority' => isset($localPriority) ? $localPriority : 99999];
         }
         $fields['dedup_id'] = $dedupId;
         $idList[] = $dedupId;
         // Sort dedupData by priority:
         uasort($dedupData, function ($a, $b) {
             return $a['priority'] - $b['priority'];
         });
         $fields['dedup_data'] = $dedupData;
         $record->setRawData($fields);
     }
     if (empty($idList)) {
         return;
     }
     // Fetch records and assign them to the result:
     $localRecords = $this->backend->retrieveBatch($idList)->getRecords();
     foreach ($result->getRecords() as $record) {
         $dedupRecordData = $record->getRawData();
         if (!isset($dedupRecordData['dedup_id'])) {
             continue;
         }
         // Find the corresponding local record in the results:
         $foundLocalRecord = null;
         foreach ($localRecords as $localRecord) {
             if ($localRecord->getUniqueID() == $dedupRecordData['dedup_id']) {
                 $foundLocalRecord = $localRecord;
                 break;
             }
         }
         if (!$foundLocalRecord) {
             continue;
         }
         $localRecordData = $foundLocalRecord->getRawData();
         // Copy dedup_data for the active data sources:
         foreach ($dedupRecordData['dedup_data'] as $dedupDataKey => $dedupData) {
             if (!$recordSources || isset($sourcePriority[$dedupDataKey])) {
                 $localRecordData['dedup_data'][$dedupDataKey] = $dedupData;
             }
         }
         // Copy fields from dedup record to local record
         $localRecordData = $this->appendDedupRecordFields($localRecordData, $dedupRecordData, $recordSources, $sourcePriority);
         $foundLocalRecord->setRawData($localRecordData);
         $foundLocalRecord->setHighlightDetails($record->getHighlightDetails());
         $result->replace($record, $foundLocalRecord);
     }
 }