Bug 4173: Followup: put the lib into a variable
[koha_fer] / C4 / AuthoritiesMarc.pm
index 90c253a..79f3956 100644 (file)
@@ -26,6 +26,7 @@ use C4::AuthoritiesMarc::MARC21;
 use C4::AuthoritiesMarc::UNIMARC;
 use C4::Charset;
 use C4::Log;
+use Koha::Authority;
 
 use vars qw($VERSION @ISA @EXPORT);
 
@@ -199,7 +200,7 @@ sub SearchAuthorities {
         }
     } else {
         my $query;
-        my $attr;
+        my $attr = '';
             # the marclist may contain "mainentry". In this case, search the tag_to_report, that depends on
             # the authtypecode. Then, search on $a of this tag_to_report
             # also store main entry MARC tag, to extract it at end of search
@@ -230,9 +231,6 @@ sub SearchAuthorities {
                 elsif ( @$tags[$i] eq "mainentry" ) {
                     $attr = " \@attr 1=Heading ";
                 }
-                elsif ( @$tags[$i] eq "any" ) {
-                    $attr = " \@attr 1=Any ";
-                }
                 elsif ( @$tags[$i] eq "match" ) {
                     $attr = " \@attr 1=Match ";
                 }
@@ -245,6 +243,9 @@ sub SearchAuthorities {
                 elsif ( @$tags[$i] eq "thesaurus" ) {
                     $attr = " \@attr 1=Subject-heading-thesaurus ";
                 }
+                else { # Assume any if no index was specified
+                    $attr = " \@attr 1=Any ";
+                }
                 if ( @$operator[$i] eq 'is' ) {
                     $attr .= " \@attr 4=1  \@attr 5=100 "
                       ; ##Phrase, No truncation,all of subfield field must match
@@ -263,6 +264,9 @@ sub SearchAuthorities {
                 else {
                     $attr .= " \@attr 5=1 \@attr 4=6 "
                       ;    ## Word list, right truncated, anywhere
+                      if ($sortby eq 'Relevance') {
+                          $attr .= "\@attr 2=102 ";
+                      }
                 }
                 @$value[$i] =~ s/"/\\"/g; # Escape the double-quotes in the search value
                 $attr =$attr."\"".@$value[$i]."\"";
@@ -354,7 +358,7 @@ sub SearchAuthorities {
                 my $thisauthtype = GetAuthType(GetAuthTypeCode($authid));
                 $newline{authtype}     = defined ($thisauthtype) ?
                                             $thisauthtype->{'authtypetext'} :
-                                            GetAuthType($authtypecode)->{'authtypetext'};
+                                            (GetAuthType($authtypecode) ? $_->{'authtypetext'} : '');
                 $newline{summary}      = $summary;
                 $newline{even}         = $counter % 2;
                 $newline{reported_tag} = $reported_tag;
@@ -848,19 +852,8 @@ Returns MARC::Record of the authority passed in parameter.
 
 sub GetAuthority {
     my ($authid)=@_;
-    my $dbh=C4::Context->dbh;
-    my $sth=$dbh->prepare("select authtypecode, marcxml from auth_header where authid=?");
-    $sth->execute($authid);
-    my ($authtypecode, $marcxml) = $sth->fetchrow;
-    my $record=eval {MARC::Record->new_from_xml(StripNonXmlChars($marcxml),'UTF-8',
-        (C4::Context->preference("marcflavour") eq "UNIMARC"?"UNIMARCAUTH":C4::Context->preference("marcflavour")))};
-    return undef if ($@);
-    $record->encoding('UTF-8');
-    if (C4::Context->preference("marcflavour") eq "MARC21") {
-      my ($auth_type_tag, $auth_type_subfield) = get_auth_type_location($authtypecode);
-      C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield);
-    }
-    return ($record);
+    my $authority = Koha::Authority->get_from_authid($authid);
+    return ($authority->record);
 }
 
 =head2 GetAuthType 
@@ -952,7 +945,7 @@ sub BuildSummary {
         $summary{type} = $authref->{authtypetext};
         $summary{summary} = $authref->{summary};
     }
-    my $marc21subfields = 'abcdfghjklmnopqrstuvxyz';
+    my $marc21subfields = 'abcdfghjklmnopqrstuvxyz68';
     my %marc21controlrefs = ( 'a' => 'earlier',
         'b' => 'later',
         'd' => 'acronym',
@@ -971,7 +964,6 @@ sub BuildSummary {
     $thesaurus{'5'}="Lieux";
     $thesaurus{'6'}="Sujets";
     #thesaurus a remplir
-    my @fields = $record->fields();
     my $reported_tag;
 # if the library has a summary defined, use it. Otherwise, build a standard one
 # FIXME - it appears that the summary field in the authority frameworks
@@ -1014,7 +1006,6 @@ sub BuildSummary {
     my @seefrom;
     my @seealso;
     my @otherscript;
-    my @fields = $record->fields();
     if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
 # construct UNIMARC summary, that is quite different from MARC21 one
 # accepted form
@@ -1032,11 +1023,29 @@ sub BuildSummary {
 # see :
         foreach my $field ($record->field('5..')) {
             if (($field->subfield('5')) && ($field->subfield('a')) && ($field->subfield('5') eq 'g')) {
-                push @seealso, { $field->as_string('abcdefgjxyz'), type => 'broader', field => $field->tag() };
+                push @seealso, {
+                    heading => $field->as_string('abcdefgjxyz'),
+                    type => 'broader',
+                    field => $field->tag(),
+                    search => $field->as_string('abcdefgjxyz'),
+                    authid => $field->subfield('9')
+                };
             } elsif (($field->subfield('5')) && ($field->as_string) && ($field->subfield('5') eq 'h')){
-                push @seealso, { heading => $field->as_string('abcdefgjxyz'), type => 'narrower', field => $field->tag() };
+                push @seealso, {
+                    heading => $field->as_string('abcdefgjxyz'),
+                    type => 'narrower',
+                    field => $field->tag(),
+                    search => $field->as_string('abcdefgjxyz'),
+                    authid => $field->subfield('9')
+                };
             } elsif ($field->subfield('a')) {
-                push @seealso, { heading => $field->as_string('abcdefgxyz'), type => 'seealso', field => $field->tag() };
+                push @seealso, {
+                    heading => $field->as_string('abcdefgxyz'),
+                    type => 'seealso',
+                    field => $field->tag(),
+                    search => $field->as_string('abcdefgjxyz'),
+                    authid => $field->subfield('9')
+                };
             }
         }
 # // form
@@ -1088,28 +1097,40 @@ sub BuildSummary {
         }
         foreach my $field ($record->field('4..')) { #See From
             my $type = 'seefrom';
-            $type = $marc21controlrefs{substr $field->subfield('w'), 0, 1} if ($field->subfield('w'));
+            $type = ($marc21controlrefs{substr $field->subfield('w'), 0, 1} || '') if ($field->subfield('w'));
             if ($type eq 'notapplicable') {
                 $type = substr $field->subfield('w'), 2, 1;
                 $type = 'earlier' if $type && $type ne 'n';
             }
             if ($type eq 'subfi') {
-                push @seefrom, { heading => $field->as_string($marc21subfields), type => $field->subfield('i'), field => $field->tag() };
+                push @seefrom, { heading => $field->as_string($marc21subfields), type => ($field->subfield('i') || ''), field => $field->tag() };
             } else {
                 push @seefrom, { heading => $field->as_string($marc21subfields), type => $type, field => $field->tag() };
             }
         }
         foreach my $field ($record->field('5..')) { #See Also
             my $type = 'seealso';
-            $type = $marc21controlrefs{substr $field->subfield('w'), 0, 1} if ($field->subfield('w'));
+            $type = ($marc21controlrefs{substr $field->subfield('w'), 0, 1} || '') if ($field->subfield('w'));
             if ($type eq 'notapplicable') {
                 $type = substr $field->subfield('w'), 2, 1;
                 $type = 'earlier' if $type && $type ne 'n';
             }
             if ($type eq 'subfi') {
-                push @seealso, { heading => $field->as_string($marc21subfields), type => $field->subfield('i'), field => $field->tag() };
+                push @seealso, {
+                    heading => $field->as_string($marc21subfields),
+                    type => $field->subfield('i'),
+                    field => $field->tag(),
+                    search => $field->as_string($marc21subfields) || '',
+                    authid => $field->subfield('9') || ''
+                };
             } else {
-                push @seealso, { heading => $field->as_string($marc21subfields), type => $type, field => $field->tag() };
+                push @seealso, {
+                    heading => $field->as_string($marc21subfields),
+                    type => $type,
+                    field => $field->tag(),
+                    search => $field->as_string($marc21subfields) || '',
+                    authid => $field->subfield('9') || ''
+                };
             }
         }
         foreach my $field ($record->field('6..')) {
@@ -1342,8 +1363,8 @@ sub merge {
     } else {
         #zebra connection  
         my $oConnection=C4::Context->Zconn("biblioserver",0);
-        my $oldSyntax = $oConnection->option("preferredRecordSyntax");
-        $oConnection->option("preferredRecordSyntax"=>"XML");
+        # We used to use XML syntax here, but that no longer works.
+        # Thankfully, we don't need it.
         my $query;
         $query= "an=".$mergefrom;
         my $oResult = $oConnection->search(new ZOOM::Query::CCL2RPN( $query, $oConnection ));
@@ -1356,15 +1377,14 @@ sub merge {
             my $rec;
             $rec=$oResult->record($z);
             my $marcdata = $rec->raw();
-            my $marcrecordzebra= MARC::Record->new_from_xml($marcdata,"utf8",C4::Context->preference("marcflavour"));
+            my $marcrecordzebra= MARC::Record->new_from_usmarc($marcdata);
             my ( $biblionumbertagfield, $biblionumbertagsubfield ) = &GetMarcFromKohaField( "biblio.biblionumber", '' );
-            my $i = $marcrecordzebra->subfield($biblionumbertagfield, $biblionumbertagsubfield);
+            my $i = ($biblionumbertagfield < 10) ? $marcrecordzebra->field($biblionumbertagfield)->data : $marcrecordzebra->subfield($biblionumbertagfield, $biblionumbertagsubfield);
             my $marcrecorddb=GetMarcBiblio($i);
             push @reccache, $marcrecorddb;
             $z++;
         }
         $oResult->destroy();
-        $oConnection->option("preferredRecordSyntax"=>$oldSyntax);
     }
     #warn scalar(@reccache)." biblios to update";
     # Get All candidate Tags for the change 
@@ -1389,12 +1409,13 @@ sub merge {
         foreach my $tagfield (@tags_using_authtype){
 #             warn "tagfield : $tagfield ";
             foreach my $field ($marcrecord->field($tagfield)){
+                # biblio is linked to authority with $9 subfield containing authid
                 my $auth_number=$field->subfield("9");
                 my $tag=$field->tag();          
                 if ($auth_number==$mergefrom) {
                 my $field_to=MARC::Field->new(($tag_to?$tag_to:$tag),$field->indicator(1),$field->indicator(2),"9"=>$mergeto);
                my $exclude='9';
-                foreach my $subfield (@record_to) {
+                foreach my $subfield (grep {$_->[0] ne '9'} @record_to) {
                     $field_to->add_subfields($subfield->[0] =>$subfield->[1]);
                    $exclude.= $subfield->[0];
                 }