Bug 9239 QA follow-up: better error handling
authorJared Camins-Esakov <jcamins@cpbibliography.com>
Thu, 14 Mar 2013 12:43:13 +0000 (08:43 -0400)
committerJared Camins-Esakov <jcamins@cpbibliography.com>
Sun, 17 Mar 2013 01:32:34 +0000 (21:32 -0400)
* Fix a long-standing bug in the linker that could crash the linker when
run against odd data.
* Sanitize input to SimpleSearch.
* Correctly handle CCL indexes with QP.

Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
C4/AuthoritiesMarc.pm
C4/Search.pm

index 5d66e48..db06f3d 100644 (file)
@@ -1213,6 +1213,7 @@ sub GetAuthorizedHeading {
     unless ($record = $args->{record}) {
         return unless $args->{authid};
         $record = GetAuthority($args->{authid});
+        return unless $record;
     }
     if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
 # construct UNIMARC summary, that is quite different from MARC21 one
index 4237ea3..65ad919 100644 (file)
@@ -253,6 +253,7 @@ sub SimpleSearch {
                     $query = $QParser->target_syntax($servers[$i]);
                     $zoom_queries[$i] = new ZOOM::Query::PQF( $query, $zconns[$i]);
                 } else {
+                    $query =~ s/:/=/g;
                     $zoom_queries[$i] = new ZOOM::Query::CCL2RPN( $query, $zconns[$i]);
                 }
                 $tmpresults[$i] = $zconns[$i]->search( $zoom_queries[$i] );
@@ -1117,7 +1118,7 @@ on authority data).
 =cut
 
 sub _handle_exploding_index {
-    my ($QParser, $struct, $filter, $params, $negate, $server) = @_;
+    my ($QParser, $filter, $params, $negate, $server) = @_;
     my $index = $filter;
     my $term = join(' ', @$params);
 
@@ -1127,7 +1128,7 @@ sub _handle_exploding_index {
 
     my $codesubfield = $marcflavour eq 'UNIMARC' ? '5' : 'w';
     my $wantedcodes = '';
-    my @subqueries = ( "su:\"$term\"");
+    my @subqueries = ( "\@attr 1=Subject \@attr 4=1 \"$term\"");
     my ($error, $results, $total_hits) = SimpleSearch( "he:$term", undef, undef, [ "authorityserver" ] );
     foreach my $auth (@$results) {
         my $record = MARC::Record->new_from_usmarc($auth);
@@ -1142,12 +1143,11 @@ sub _handle_exploding_index {
             }
             foreach my $reference (@references) {
                 my $codes = $reference->subfield($codesubfield);
-                push @subqueries, 'su:"' . $reference->as_string('abcdefghijlmnopqrstuvxyz') . '"' if (($codes && $codes eq $wantedcodes) || !$wantedcodes);
+                push @subqueries, '@attr 1=Subject @attr 4=1 "' . $reference->as_string('abcdefghijlmnopqrstuvxyz') . '"' if (($codes && $codes eq $wantedcodes) || !$wantedcodes);
             }
         }
     }
-    my $query = '(' x scalar(@subqueries) . join(') || ', @subqueries) . ')';
-    warn $query;
+    my $query = ' @or ' x (scalar(@subqueries) - 1) . join(' ', @subqueries);
     return $query;
 }
 
@@ -1179,7 +1179,7 @@ sub parseQuery {
 
     my $QParser;
     $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser') || $query =~ s/^qp=//);
-    undef $QParser if ($query =~ m/^(ccl=|pqf=|cql=)/ || grep (/\w,\w|\w=\w/, @operands) );
+    undef $QParser if ($query =~ m/^(ccl=|pqf=|cql=)/ || grep (/\w,\w|\w=\w/, @operands, @indexes) );
     undef $QParser if (scalar @limits > 0);
 
     if ($QParser)
@@ -1189,13 +1189,19 @@ sub parseQuery {
             next unless $operands[$ii];
             $query .= $operators[ $ii - 1 ] eq 'or' ? ' || ' : ' && '
               if ($query);
-            $query .=
-              ( $indexes[$ii] ? "$indexes[$ii]:" : '' ) . $operands[$ii];
+            if ( $indexes[$ii] =~ m/su-/ ) {
+                $query .= $indexes[$ii] . '(' . $operands[$ii] . ')';
+            }
+            else {
+                $query .=
+                  ( $indexes[$ii] ? "$indexes[$ii]:" : '' ) . $operands[$ii];
+            }
         }
         foreach my $limit (@limits) {
         }
-        if (scalar (@sort_by) > 0) {
-            my $modifier_re = '#(' . join( '|', @{$QParser->modifiers}) . ')';
+        if ( scalar(@sort_by) > 0 ) {
+            my $modifier_re =
+              '#(' . join( '|', @{ $QParser->modifiers } ) . ')';
             $query =~ s/$modifier_re//g;
             foreach my $modifier (@sort_by) {
                 $query .= " #$modifier";
@@ -1206,12 +1212,16 @@ sub parseQuery {
         $query_desc =~ s/\s+/ /g;
         if ( C4::Context->preference("QueryWeightFields") ) {
         }
-        $QParser->add_bib1_filter_map( 'biblioserver', 'su-br', { 'callback' => \&_handle_exploding_index });
-        $QParser->add_bib1_filter_map( 'biblioserver', 'su-na', { 'callback' => \&_handle_exploding_index });
-        $QParser->add_bib1_filter_map( 'biblioserver', 'su-rl', { 'callback' => \&_handle_exploding_index });
-        $QParser->parse( $query );
+        $QParser->add_bib1_filter_map( 'su-br' => 'biblioserver' =>
+              { 'target_syntax_callback' => \&_handle_exploding_index } );
+        $QParser->add_bib1_filter_map( 'su-na' => 'biblioserver' =>
+              { 'target_syntax_callback' => \&_handle_exploding_index } );
+        $QParser->add_bib1_filter_map( 'su-rl' => 'biblioserver' =>
+              { 'target_syntax_callback' => \&_handle_exploding_index } );
+        $QParser->parse($query);
         $operands[0] = "pqf=" . $QParser->target_syntax('biblioserver');
-    } else {
+    }
+    else {
         require Koha::QueryParser::Driver::PQF;
         my $modifier_re = '#(' . join( '|', @{Koha::QueryParser::Driver::PQF->modifiers}) . ')';
         s/$modifier_re//g for @operands;