Koha/serials/subscription-bib-search.pl
Jared Camins-Esakov 144c7f4e4e Bug 9239: Allow the use of QueryParser for all queries
With the inclusion of this patch, all searches will (try) to use
QueryParser for handling queries for both the bibliographic and authority
databases if UseQueryParser is enabled. If QueryParser is unavailable,
UseQueryParser is disabled, or the search uses CCL indexes, the old
search code will be used.

To test:
1) Apply patch.
2) Run the unit test with `prove t/QueryParser.t`
3) Enable the UseQueryParser syspref.
4) Try searches that should return results in the following places:
   * OPAC (simple search)
   * OPAC (advanced search)
   * OPAC (authorities)
   * Staff client (header search)
   * Staff client (advanced search)
   * Staff client (cataloging search)
   * Staff client (authorities)
   * Staff client (importing a batch using a match point)
   * Staff client (searching for an item for adding to a label)
   * Staff client (acquisitions)
   * Staff client (searching for a record to create a serial)
   * ANYWHERE ELSE I HAVE FORGOTTEN
5) Disable the UseQueryParser syspref. Repeat at least some of the
   searches you did above.
6) If all searches worked, sign off.

Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz>
Signed-off-by: Elliott Davis <elliott@bywatersolions.com>
Searching still works as expected for variuos places.
QueryParser syspref seemed to be enabled by default

Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
2013-03-16 21:32:32 -04:00

253 lines
7.5 KiB
Perl
Executable file

#!/usr/bin/perl
# WARNING: 4-character tab stops here
# Copyright 2000-2002 Katipo Communications
# Parts Copyright 2010 Biblibre
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
=head1 NAME
subscription-bib-search.pl
=head1 DESCRIPTION
this script search among all existing subscriptions.
=head1 PARAMETERS
=over 4
=item op
op use to know the operation to do on this template.
* do_search : to search the subscription.
Note that if op = do_search there are some others params specific to the search :
marclist,and_or,excluding,operator,value
=item startfrom
to multipage gestion.
=back
=cut
use strict;
use warnings;
use CGI;
use C4::Koha;
use C4::Auth;
use C4::Context;
use C4::Output;
use C4::Search;
use C4::Biblio;
use C4::Debug;
my $input=new CGI;
# my $type=$query->param('type');
my $op = $input->param('op') || q{};
my $dbh = C4::Context->dbh;
my $startfrom=$input->param('startfrom');
$startfrom=0 unless $startfrom;
my ($template, $loggedinuser, $cookie);
my $resultsperpage;
my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes");
my $itype_or_itemtype = (C4::Context->preference("item-level_itypes"))?'itype':'itemtype';
my $query = $input->param('q');
# don't run the search if no search term !
if ($op eq "do_search" && $query) {
( $template, $loggedinuser, $cookie ) = get_template_and_user(
{ template_name => "serials/result.tmpl",
query => $input,
type => "intranet",
authnotrequired => 0,
flagsrequired => {catalogue => 1, serials => '*'},
debug => 1,
}
);
# add the itemtype limit if applicable
my $itemtypelimit = $input->param('itemtypelimit');
if ( $itemtypelimit ) {
my $QParser;
$QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser'));
my $op;
if ($QParser) {
$op = '&&';
} else {
$op = 'and';
}
if (!$advanced_search_types or $advanced_search_types eq 'itemtypes') {
$query .= " $op $itype_or_itemtype:$itemtypelimit";
} else {
$query .= " $op $advanced_search_types:$itemtypelimit";
}
}
$debug && warn $query;
$resultsperpage= $input->param('resultsperpage');
$resultsperpage = 20 if(!defined $resultsperpage);
my ($error, $marcrecords, $total_hits) = SimpleSearch($query, $startfrom*$resultsperpage, $resultsperpage);
my $total = 0;
if (defined $marcrecords ) {
$total = scalar @{$marcrecords};
}
if (defined $error) {
$template->param(query_error => $error);
warn "error: ".$error;
output_html_with_http_headers $input, $cookie, $template->output;
exit;
}
my @results;
for(my $i=0;$i<$total;$i++) {
my %resultsloop;
my $marcrecord = MARC::File::USMARC::decode($marcrecords->[$i]);
my $biblio = TransformMarcToKoha(C4::Context->dbh,$marcrecord,'');
#build the hash for the template.
$resultsloop{highlight} = ($i % 2)?(1):(0);
$resultsloop{title} = $biblio->{'title'};
$resultsloop{subtitle} = $biblio->{'subtitle'};
$resultsloop{biblionumber} = $biblio->{'biblionumber'};
$resultsloop{author} = $biblio->{'author'};
$resultsloop{publishercode} = $biblio->{'publishercode'};
$resultsloop{publicationyear} = $biblio->{'publicationyear'};
$resultsloop{issn} = $biblio->{'issn'};
push @results, \%resultsloop;
}
# multi page display gestion
my $displaynext=0;
my $displayprev=$startfrom;
if(($total_hits - (($startfrom+1)*($resultsperpage))) > 0 ){
$displaynext = 1;
}
my @numbers = ();
if ($total_hits>$resultsperpage)
{
for (my $i=1; $i<$total/$resultsperpage+1; $i++)
{
if ($i<16)
{
my $highlight=0;
($startfrom==($i-1)) && ($highlight=1);
push @numbers, { number => $i,
highlight => $highlight ,
searchdata=> \@results,
startfrom => ($i-1)};
}
}
}
my $from = 0;
$from = $startfrom*$resultsperpage+1 if($total_hits > 0);
my $to;
if($total_hits < (($startfrom+1)*$resultsperpage))
{
$to = $total;
} else {
$to = (($startfrom+1)*$resultsperpage);
}
$template->param(
query => $query,
resultsloop => \@results,
startfrom=> $startfrom,
displaynext=> $displaynext,
displayprev=> $displayprev,
resultsperpage => $resultsperpage,
startfromnext => $startfrom+1,
startfromprev => $startfrom-1,
total=>$total_hits,
from=>$from,
to=>$to,
numbers=>\@numbers,
);
} # end of if ($op eq "do_search" & $query)
else {
($template, $loggedinuser, $cookie)
= get_template_and_user({template_name => "serials/subscription-bib-search.tmpl",
query => $input,
type => "intranet",
authnotrequired => 0,
flagsrequired => {catalogue => 1, serials => '*'},
debug => 1,
});
# load the itemtypes
my $itemtypes = GetItemTypes;
my @itemtypesloop;
if (!$advanced_search_types or $advanced_search_types eq 'itemtypes') {
# load the itemtypes
my $itemtypes = GetItemTypes;
my $selected=1;
my $cnt;
foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) {
my %row =(
code => $thisitemtype,
selected => $selected,
description => $itemtypes->{$thisitemtype}->{'description'},
);
$selected = 0 if ($selected) ;
push @itemtypesloop, \%row;
}
} else {
my $advsearchtypes = GetAuthorisedValues($advanced_search_types);
my $cnt;
my $selected=1;
for my $thisitemtype (sort {$a->{'lib'} cmp $b->{'lib'}} @$advsearchtypes) {
my %row =(
number=>$cnt++,
ccl => $advanced_search_types,
code => $thisitemtype->{authorised_value},
selected => $selected,
description => $thisitemtype->{'lib'},
count5 => $cnt % 4,
imageurl=> getitemtypeimagelocation( 'intranet', $thisitemtype->{'imageurl'} ),
);
push @itemtypesloop, \%row;
}
}
if ($op eq "do_search") {
$template->param("no_query" => 1);
} else {
$template->param("no_query" => 0);
}
$template->param(itemtypeloop => \@itemtypesloop);
}
# Print the page
output_html_with_http_headers $input, $cookie, $template->output;
# Local Variables:
# tab-width: 4
# End: