X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=CROSBI.pm;h=e523d0fbd622cd1ec70f132fe900f9ee6e87ecf0;hb=e63437d32b35d7c83a0ece8e2f0422045e5b6ac7;hp=573c56631ac0fbb343db060d7197bb15e53fb3da;hpb=18a4315db8c49fd64ca248a402e471915de12e24;p=Biblio-Z3950.git diff --git a/CROSBI.pm b/CROSBI.pm index 573c566..e523d0f 100644 --- 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 );