From d330c3d39974421bb2dfc9c728bbb8b5adef848d Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Thu, 22 Jan 2026 14:06:12 +0100 Subject: [PATCH] Bug 41685: Sort seefrom/seealso in BuildSummary Content-Type: text/plain; charset=utf-8 Test plan (MARC21): [1] Create an authority record, say a term. Include two 450s, the first one starting with Z and second with A. Include five 550s, where two are narrower ($w==h), two broader ($w==g) and one without $w. Make sure that the terms will sort differently than the field order (go back in alphabet when filling subsequent $a's or so). [2] Perform an authority search that includes the new authority. [3] Verify that the terms in the Summary column for this authority are sorted first on hierarchy, second alphabetically. The one without hierarchy should be in the middle. Signed-off-by: Marcel de Rooy --- C4/AuthoritiesMarc.pm | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm index c2070f4560..ebb33b978f 100644 --- a/C4/AuthoritiesMarc.pm +++ b/C4/AuthoritiesMarc.pm @@ -1076,7 +1076,8 @@ sub BuildSummary { }; } } - foreach my $field ( $record->field('4..') ) { #See From + my @fields = _marc21_sort_hierarchy_alpha( $record->field('4..') ); + foreach my $field (@fields) { #See From my $type = 'seefrom'; $type = ( $marc21controlrefs{ substr $field->subfield('w'), 0, 1 } || '' ) if ( $field->subfield('w') ); if ( $type eq 'notapplicable' ) { @@ -1099,7 +1100,8 @@ sub BuildSummary { }; } } - foreach my $field ( $record->field('5..') ) { #See Also + @fields = _marc21_sort_hierarchy_alpha( $record->field('5..') ); + foreach my $field (@fields) { #See Also my $type = 'seealso'; $type = ( $marc21controlrefs{ substr $field->subfield('w'), 0, 1 } || '' ) if ( $field->subfield('w') ); if ( $type eq 'notapplicable' ) { @@ -1231,6 +1233,18 @@ sub BuildSummary { return \%summary; } +sub _marc21_sort_hierarchy_alpha { + my @fields = @_; + return sort { + # Sort broader (g) - no hierarchy (tric:gh) - narrower (h) + my $a_hier = $a->subfield('w') // q{}; $a_hier = 'gh' if $a_hier !~ /^[gh]$/; + my $b_hier = $b->subfield('w') // q{}; $b_hier = 'gh' if $b_hier !~ /^[gh]$/; + + # When hierarchy does not resolve, sort on $a + $a_hier cmp $b_hier || $a->subfield('a') cmp $b->subfield('a'); + } @fields; +} + =head2 GetAuthorizedHeading $heading = &GetAuthorizedHeading({ record => $record, authid => $authid }) -- 2.39.5