From 69321563f87e52b737bdbb3054ce26fc54ce41db Mon Sep 17 00:00:00 2001 From: Dorian Merz <merz@ub.uni-leipzig.de> Date: Tue, 12 Jan 2021 09:24:41 +0100 Subject: [PATCH] refs #18905 [finc] changes in getAllSubjectHeadingsExtended * preferredly use $689 * obey order given in ind2 * adds sources priority * adds fallback to $650 if empty * + corrects empty return type in getLocalSubject --- .../finc/RecordDriver/SolrMarcFincTrait.php | 81 ++++++++++++++++--- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php index 219103baabb..84838f47913 100644 --- a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php +++ b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php @@ -808,7 +808,7 @@ trait SolrMarcFincTrait $this->getLocalMarcFieldOfLibrary() ); if (!$fields) { - return null; + return []; } foreach ($fields as $key => $field) { if ($q = $field->getSubfield('q')) { @@ -1707,34 +1707,91 @@ trait SolrMarcFincTrait */ public function getAllSubjectHeadingsExtended() { - // define a false indicator - $firstindicator = 'x'; $retval = []; $fields = $this->getMarcRecord()->getFields('689'); foreach ($fields as $field) { - $subjectrow = $field->getIndicator('1'); - if ($subjectrow != $firstindicator) { - $key = (isset($key) ? $key + 1 : 0); - $firstindicator = $subjectrow; + $key = $field->getIndicator('1'); + $order = $field->getIndicator('2'); + if ("" === trim($order)) { + if ($subfield = $field->getSubfield('5')) { + $retval[$key]['source'] = $subfield->getData(); + } + foreach ($field->getSubfields() as $sf) { + $sf->getData(); + } } - // #5668 #5046 BSZ MARC may contain uppercase subfields but solrmarc set - // to lowercase them which introduces single char topics if ($subfields = $field->getSubfields('a')) { foreach ($subfields as $subfield) { if (strlen($subfield->getData()) > 1) { - $retval[$key]['subject'][] = $subfield->getData(); + $retval[$key]['subject'][$order] = $subfield->getData(); } } } if ($subfield = $field->getSubfield('t')) { - $retval[$key]['subject'][] = $subfield->getData(); + $retval[$key]['subject'][$order] = $subfield->getData(); } if ($subfield = $field->getSubfield('9')) { $retval[$key]['subsubject'] = $subfield->getData(); } } - return $retval; + if (empty($retval)) { + return $this->getTopicsField(); + } + foreach ([ + 'DE-627', //KXP + 'DE-576', //GBV + 'DE-101' //DNB + ] as $source) { + $return = []; + foreach ($retval as $entry) { + if (isset($entry['source']) && strpos($entry['source'],$source) !== false) { + $return[] = $entry; + } + } + if (!empty($return)) { + return $return; + } + } + return $retval; + } + + public function getTopicsField() + { + $retval = []; + + $fields = $this->getMarcRecord()->getFields('650'); + foreach ($fields as $field) { + $thesaurus = $field->getIndicator('2'); + if ($subfields = $field->getSubfields('a')) { + foreach ($subfields as $subfield) { + if (strlen($subfield->getData()) > 1) { + $retval[$thesaurus][]['subject'][] = $subfield->getData(); + } + } + } + } + + if (empty($retval)) { + return []; + } + + foreach ([ + '7', //'Source specified in subfield $2' + '4', //'Source not specified' + '0', //'Library of Congress Subject Headings' + '2', //'Medical Subject Headings' + ] as $thesaurus) { + if (isset($retval[$thesaurus])) { + return array_map( + 'unserialize', + array_unique( + array_map('serialize',$retval[$thesaurus]) + ) + ); + } + } + return current($retval); } /** -- GitLab