X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FAuthoritiesMarc.pm;h=10c67fc9ff614d3f3b9a63f8fcc988255dcea992;hb=refs%2Fheads%2Fkoha_ffzg;hp=9f1f284353d9927e847384a8715a3c29527443ee;hpb=9f47bd88252e201f9f06fd734dae154d9bc41543;p=koha.git diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm index 9f1f284353..10c67fc9ff 100644 --- a/C4/AuthoritiesMarc.pm +++ b/C4/AuthoritiesMarc.pm @@ -32,6 +32,7 @@ use Koha::Authorities; use Koha::Authority::MergeRequest; use Koha::Authority::Types; use Koha::Authority; +use Koha::Libraries; use Koha::SearchEngine; use Koha::SearchEngine::Search; @@ -51,8 +52,6 @@ BEGIN { &GetAuthority &GetAuthorityXML - &CountUsage - &CountUsageChildren &SearchAuthorities &BuildSummary @@ -164,9 +163,12 @@ sub SearchAuthorities { elsif ( @$tags[$i] eq "thesaurus" ) { $attr = " \@attr 1=Subject-heading-thesaurus "; } - else { # Assume any if no index was specified + elsif ( @$tags[$i] eq "all" ) { $attr = " \@attr 1=Any "; } + else { # Use the index passed in params + $attr = " \@attr 1=" . @$tags[$i] . " "; + } } #if @$tags[$i] else { # Assume any if no index was specified $attr = " \@attr 1=Any "; @@ -327,7 +329,7 @@ sub SearchAuthorities { ### if (! $skipmetadata) { for (my $z=0; $z<@finalresult; $z++){ - my $count=CountUsage($finalresult[$z]{authid}); + my $count = Koha::Authorities->get_usage_count({ authid => $finalresult[$z]{authid} }); $finalresult[$z]{used}=$count; }# all $z's } @@ -340,43 +342,6 @@ sub SearchAuthorities { return (\@finalresult, $nbresults); } -=head2 CountUsage - - $count= &CountUsage($authid) - -counts Usage of Authid in bibliorecords. - -=cut - -sub CountUsage { - my ($authid) = @_; - ### ZOOM search here - my $query; - $query= "an:".$authid; - # Should really be replaced with a real count call, this is a - # bad way. - my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX}); - my ($err,$res,$result) = $searcher->simple_search_compat($query,0,1); - if ($err) { - warn "Error: $err from search $query"; - $result = 0; - } - - return $result; -} - -=head2 CountUsageChildren - - $count= &CountUsageChildren($authid) - -counts Usage of narrower terms of Authid in bibliorecords. - -=cut - -sub CountUsageChildren { - my ($authid) = @_; -} - =head2 GuessAuthTypeCode my $authtypecode = GuessAuthTypeCode($record); @@ -605,12 +570,19 @@ sub AddAuthority { SetUTF8Flag($record); if ($format eq "MARC21") { + my $userenv = C4::Context->userenv; + my $library; + my $marcorgcode = C4::Context->preference('MARCOrgCode'); + if ( $userenv && $userenv->{'branch'} ) { + $library = Koha::Libraries->find( $userenv->{'branch'} ); + $marcorgcode = $library->get_effective_marcorgcode; + } if (!$record->leader) { $record->leader($leader); } if (!$record->field('003')) { $record->insert_fields_ordered( - MARC::Field->new('003',C4::Context->preference('MARCOrgCode')) + MARC::Field->new('003', $marcorgcode), ); } my $date=POSIX::strftime("%y%m%d",localtime); @@ -629,8 +601,8 @@ sub AddAuthority { if (!$record->field('040')) { $record->insert_fields_ordered( MARC::Field->new('040','','', - 'a' => C4::Context->preference('MARCOrgCode'), - 'c' => C4::Context->preference('MARCOrgCode') + 'a' => $marcorgcode, + 'c' => $marcorgcode, ) ); } @@ -791,7 +763,7 @@ sub FindDuplicateAuthority { if ($QParser) { $op = '&&'; } else { - $op = 'and'; + $op = 'AND'; } my $query='at:'.$authtypecode.' '; my $filtervalues=qr([\001-\040\Q!'"`#$%&*+,-./:;<=>?@(){[}_|~\E\]]); @@ -801,7 +773,7 @@ sub FindDuplicateAuthority { } } my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::AUTHORITIES_INDEX}); - my ($error, $results, $total_hits) = $searcher->simple_search_compat( $query, 0, 1 ); + my ($error, $results, $total_hits) = $searcher->simple_search_compat( $query, 0, 1, [ 'authorityserver' ] ); # there is at least 1 result => return the 1st one if (!defined $error && @{$results} ) { my $marcrecord = C4::Search::new_record_from_zebra( @@ -1443,6 +1415,14 @@ sub merge { my @record_to; @record_to = $MARCto->field($auth_tag_to_report_to)->subfields() if $auth_tag_to_report_to && $MARCto && $MARCto->field($auth_tag_to_report_to); + # Exceptional: If MARCto and authtypeto exist but $auth_tag_to_report_to + # is empty, make sure that $9 and $a remain (instead of clearing the + # reference) in order to allow for data recovery. + # Note: We need $a too, since a single $9 does not pass ModBiblio. + if( $MARCto && $authtypeto && !@record_to ) { + push @record_to, [ 'a', ' ' ]; # do not remove the space + } + my @record_from; if( !$authfrom && $MARCfrom && $MARCfrom->field('1..','2..') ) { # postponed merge, authfrom was deleted and MARCfrom only contains the old reporting tag (and possibly a 100 for UNIMARC) @@ -1457,7 +1437,7 @@ sub merge { # For a deleted authority record, we scan all auth controlled fields my $dbh = C4::Context->dbh; my $sql = "SELECT DISTINCT tagfield FROM marc_subfield_structure WHERE authtypecode=?"; - my $tags_using_authtype = $authtypefrom ? $dbh->selectcol_arrayref( $sql, undef, ( $authtypefrom->authtypecode )) : $dbh->selectcol_arrayref( "SELECT DISTINCT tagfield FROM marc_subfield_structure WHERE authtypecode IS NOT NULL AND authtypecode<>''" ); + my $tags_using_authtype = $authtypefrom && $authtypefrom->authtypecode ? $dbh->selectcol_arrayref( $sql, undef, ( $authtypefrom->authtypecode )) : $dbh->selectcol_arrayref( "SELECT DISTINCT tagfield FROM marc_subfield_structure WHERE authtypecode IS NOT NULL AND authtypecode<>''" ); my $tags_new; if( $authtypeto && ( !$authtypefrom || $authtypeto->authtypecode ne $authtypefrom->authtypecode )) { $tags_new = $dbh->selectcol_arrayref( $sql, undef, ( $authtypeto->authtypecode )); @@ -1470,12 +1450,10 @@ sub merge { # We only need it in loose merge mode; replaces the former $exclude ? {} : { map { ( $_->[0], 1 ); } ( @record_from, @record_to ) }; - # And we need to add $9 in order not to duplicate - $skip_subfields->{9} = 1 if !$overwrite; my $counteditedbiblio = 0; foreach my $biblionumber ( @biblionumbers ) { - my $marcrecord = GetMarcBiblio( $biblionumber ); + my $marcrecord = GetMarcBiblio({ biblionumber => $biblionumber }); next if !$marcrecord; my $update = 0; foreach my $tagfield (@$tags_using_authtype) { @@ -1493,26 +1471,53 @@ sub merge { $update = 1; next; } - my $newtag = $tags_new + my $newtag = $tags_new && @$tags_new ? _merge_newtag( $tag, $tags_new ) : $tag; + my $controlled_ind = $authto->controlled_indicators({ record => $MARCto, biblio_tag => $newtag }); my $field_to = MARC::Field->new( $newtag, - $field->indicator(1), - $field->indicator(2), - "9" => $mergeto, + $controlled_ind->{ind1} // $field->indicator(1), + $controlled_ind->{ind2} // $field->indicator(2), + 9 => $mergeto, # Needed to create field, will be moved ); - foreach my $subfield ( grep { $_->[0] ne '9' } @record_to ) { - $field_to->add_subfields( $subfield->[0] => $subfield->[1] ); - } + my ( @prefix, @postfix ); if ( !$overwrite ) { # add subfields back in loose mode, check skip_subfields + # The first extra subfields will be in front of the + # controlled block, the rest at the end. + my $prefix_flag = 1; foreach my $subfield ( $field->subfields ) { - next if $skip_subfields->{ $subfield->[0] }; - $field_to->add_subfields( $subfield->[0], $subfield->[1] ); + next if $subfield->[0] eq '9'; # skip but leave flag + if ( $skip_subfields->{ $subfield->[0] } ) { + # This marks the beginning of the controlled block + $prefix_flag = 0; + next; + } + if ($prefix_flag) { + push @prefix, [ $subfield->[0], $subfield->[1] ]; + } else { + push @postfix, [ $subfield->[0], $subfield->[1] ]; + } + } + } + foreach my $subfield ( @prefix, @record_to, @postfix ) { + $field_to->add_subfields($subfield->[0] => $subfield->[1]); + } + if( exists $controlled_ind->{sub2} ) { # thesaurus info + if( defined $controlled_ind->{sub2} ) { + # Add or replace + $field_to->update( 2 => $controlled_ind->{sub2} ); + } else { + # Key alerts us here to remove $2 + $field_to->delete_subfield( code => '2' ); } } - if ($tags_new) { + # Move $9 to the end + $field_to->delete_subfield( code => '9' ); + $field_to->add_subfields( 9 => $mergeto ); + + if ($tags_new && @$tags_new) { $marcrecord->delete_field($field); append_fields_ordered( $marcrecord, $field_to ); } else {