fix parsing of queries with fti prefixes
[Biblio-Z3950.git] / CROSBI.pm
index 573c566..e523d0f 100644 (file)
--- a/CROSBI.pm
+++ b/CROSBI.pm
@@ -47,6 +47,8 @@ sub usemap {{
 =cut
 
 my $dbname = 'bibliografija';
+my @and;
+my @exec;
 
 sub search {
        my ( $self, $query ) = @_;
@@ -69,26 +71,46 @@ left outer join rad_projekt using (id)
 left outer join rad_godina using (id)
 left outer join rad_podrucje using (id)
 left outer join url using (id)
-where rad_ustanova.sifra = ?
        };
 
-       my @exec = (
-               130, # FIXME ustanova
-       );
+       @and = ( qq{ rad_ustanova.sifra = ? } );
+       @exec =  ( 130 ); # FIXME ustanova
+
+               sub parse_fti {
+                       my $query = shift;
+                       warn "## parse_fti [$query]";
+                       my $fti;
+                       if ( $query =~ s/^(fti_.+):// ) {
+                               $fti = $1;
+                       } else {
+                               warn "INVALID QUERY no fti_xxx: [$query]";
+                       }
+
+                       my $tsquery = join(' & ', split(/\s+/,$query) );
+
+                       my @or;
+                       foreach my $f ( split(/,/,$fti) ) {
+                               push @or, "$f @@ to_tsquery(?)";
+                               push @exec, $tsquery;
+                       };
+                       push @and, "( " . join(" or ", @or) . ")";
+               }
 
-       if ( $query =~ s/^(fti_.+):// ) {
+       if ( $query =~ / AND / ) {
+               foreach my $and ( split(/ AND /, $query) ) {
+                       parse_fti $and;
+               }
+       } elsif ( $query =~ m/fti_.+:/ ) {
+               parse_fti $query;
+       } else { # no " AND " in query
                my $tsquery = join(' & ', split(/\s+/,$query) );
-
-               my @or;
-               foreach my $f ( split(/,/,$1) ) {
-                       push @or, "$f @@ to_tsquery(?)";
-                       push @exec, $tsquery;
-               };
-               $sql .= "and ( " . join(" or ", @or) . ")";
-       } else {
-               warn "INVALID QUERY [$query]";
+               push @and, "( fti_au @@ to_tsquery(?) or fti_pr @@ to_tsquery(?) )";
+               push @exec, $tsquery,  $tsquery;
        }
 
+
+       $sql .= "where " . join(" and ", @and);
+
 warn "XXX SQL = ",$sql, dump( @exec );
 
        my $dbh = DBI->connect_cached("dbi:Pg:dbname=$dbname", '', '', {AutoCommit => 0});
@@ -407,7 +429,7 @@ sub next_marc {
 =cut
 
 #      diag "# hash ",dump($hash);
-       diag "# marc\n", $marc->as_formatted;
+       diag "# marc\n", $marc->as_formatted if $ENV{DEBUG};
 
        $self->save_marc( "$id.marc", $marc->as_usmarc );