8c7230b802
This patch allows subject headings from different thesaurus to co-exist in Koha. Test plan: 1. Enable Elasticsearch as the search engine (SearchEngine system preference = Elasticsearch) and reindex (koha-elasticsearch --rebuild -d -b -a kohadev). 2. Load sample authority records attached to the bug (in this case the authorities.mrc file was saved in the koha directory - adjust file location as appropriate): misc/migration_tools/bulkmarcimport.pl -v -a -file authorities.mrc -insert -c=MARC21 3. Load the sample bibliographic record attached to the bug: misc/migration_tools/bulkmarcimport.pl -v -b -file biblios.mrc -insert -c=MARC21 4. Search for ISBN 0704328623 and verify that the subject terms are not linked to any authority records (if you hover over the link terms, all links should look like ../cgi-bin/koha/catalogue/search.pl?q=su:"subjectterm" - none should have any ?q=an:XXX (where XXX = authority record ids) in the link). 5. Apply the patches. 6. Reset the Elasticsearch mappings (Administration > Catalog > Search engine configuration (Elasticsearch)). 7. Reindex: koha-elasticsearch --rebuild -d -b -a kohadev 8. Link bibliographic records to authority records: misc/link_bibs_to_authorities.pl -v -l 9. Repeat the search in step 4 (or refresh the record details page) and verify that the first three Feminism headings[1] are linked to an authority record (should have ?q=an:XXX (where XXX = different authority record IDs for the various feminism authority records linked to a specific thesaurus)). 10. Reindex: koha-elasticsearch --rebuild -d -b -a kohadev [1] Links for subject terms for step 9 in order are (the authority ids may be different depending on how ou are testing): Subject(s:) Feminism | feminism | Feminism | Feminism | Idéhistoria | Litteratur http://127.0.0.1:8081/cgi-bin/koha/catalogue/search.pl?q=an:1709 http://127.0.0.1:8081/cgi-bin/koha/catalogue/search.pl?q=an:1710 http://127.0.0.1:8081/cgi-bin/koha/catalogue/search.pl?q=an:1708 http://127.0.0.1:8081/cgi-bin/koha/catalogue/search.pl?q=su:"Feminism" http://127.0.0.1:8081/cgi-bin/koha/catalogue/search.pl?q=su:"Idéhistoria" http://127.0.0.1:8081/cgi-bin/koha/catalogue/search.pl?q=su:"Litteratur" MARC info: 650 #7 - SUBJECT ADDED ENTRY--TOPICAL TERM a Topical term or geographic name entry element Feminism 0 Authority record control number or standard number https://id.kb.se/term/sao/Feminism 2 Source of heading or term sao 650 #7 - SUBJECT ADDED ENTRY--TOPICAL TERM a Topical term or geographic name entry element feminism 2 Source of heading or term bnb 650 #0 - SUBJECT ADDED ENTRY--TOPICAL TERM a Topical term or geographic name entry element Feminism 650 #4 - SUBJECT ADDED ENTRY--TOPICAL TERM a Topical term or geographic name entry element Feminism 650 #4 - SUBJECT ADDED ENTRY--TOPICAL TERM a Topical term or geographic name entry element Idéhistoria 650 #4 - SUBJECT ADDED ENTRY--TOPICAL TERM a Topical term or geographic name entry element Litteratur Note: The fourth Feminism term has second indicator 4 which means "Source not specified". So this term is only a local term and does not belong to any specific thesaurus and thus not linked. To specify a source of a term, the second indicator must be set as 7. The source of heading is then specified in subfield 2. Sponsored-by: Lund University Library, Sweden Signed-off-by: David Nind <david@davidnind.com> Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
115 lines
3.9 KiB
Perl
115 lines
3.9 KiB
Perl
package C4::Linker::Default;
|
|
|
|
# Copyright 2011 C & P Bibliography Services
|
|
#
|
|
# This file is part of Koha.
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Koha is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
|
|
use strict;
|
|
use warnings;
|
|
use MARC::Field;
|
|
use C4::Heading;
|
|
|
|
use base qw(C4::Linker);
|
|
|
|
sub get_link {
|
|
my $self = shift;
|
|
my $heading = shift;
|
|
my $behavior = shift || 'default';
|
|
my $search_form = $heading->search_form();
|
|
my $auth_type = $heading->auth_type();
|
|
my $thesaurus = $heading->{thesaurus} || 'notdefined';
|
|
my $authid;
|
|
my $fuzzy = 0;
|
|
my $match_count;
|
|
|
|
if ( $self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'cached'} ) {
|
|
$authid = $self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'authid'};
|
|
$fuzzy = $self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'fuzzy'};
|
|
$match_count = $self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'match_count'};
|
|
}
|
|
else {
|
|
|
|
# look for matching authorities
|
|
my $authorities = $heading->authorities(1); # $skipmetadata = true
|
|
$match_count = scalar @$authorities;
|
|
|
|
if ( $behavior eq 'default' && $#{$authorities} == 0 ) {
|
|
$authid = $authorities->[0]->{'authid'};
|
|
}
|
|
elsif ( $behavior eq 'first' && $#{$authorities} >= 0 ) {
|
|
$authid = $authorities->[0]->{'authid'};
|
|
$fuzzy = $#{$authorities} > 0;
|
|
}
|
|
elsif ( $behavior eq 'last' && $#{$authorities} >= 0 ) {
|
|
$authid = $authorities->[ $#{$authorities} ]->{'authid'};
|
|
$fuzzy = $#{$authorities} > 0;
|
|
}
|
|
|
|
if ( !defined $authid && $self->{'broader_headings'} ) {
|
|
my $field = $heading->field();
|
|
my @subfields = grep { $_->[0] ne '9' } $field->subfields();
|
|
if ( scalar @subfields > 1 ) {
|
|
pop @subfields;
|
|
$field =
|
|
MARC::Field->new(
|
|
$field->tag,
|
|
$field->indicator(1),
|
|
$field->indicator(2),
|
|
map { $_->[0] => $_->[1] } @subfields
|
|
);
|
|
( $authid, $fuzzy ) =
|
|
$self->get_link( C4::Heading->new_from_field($field),
|
|
$behavior );
|
|
}
|
|
}
|
|
|
|
$self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'cached'} = 1;
|
|
$self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'authid'} = $authid;
|
|
$self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'fuzzy'} = $fuzzy;
|
|
$self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'match_count'} = $match_count;
|
|
}
|
|
return $self->SUPER::_handle_auth_limit($authid), $fuzzy, $match_count;
|
|
}
|
|
|
|
sub update_cache {
|
|
my $self = shift;
|
|
my $heading = shift;
|
|
my $authid = shift;
|
|
my $search_form = $heading->search_form();
|
|
my $auth_type = $heading->auth_type();
|
|
my $thesaurus = $heading->{thesaurus} || 'notdefined';
|
|
my $fuzzy = 0;
|
|
|
|
$self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'cached'} = 1;
|
|
$self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'authid'} = $authid;
|
|
$self->{'cache'}->{$search_form.$auth_type.$thesaurus}->{'fuzzy'} = $fuzzy;
|
|
}
|
|
|
|
sub flip_heading {
|
|
my $self = shift;
|
|
my $heading = shift;
|
|
|
|
# TODO: implement
|
|
}
|
|
|
|
1;
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
C4::Linker::Default - match only if there is a single matching auth
|
|
|
|
=cut
|