expandtab, retab, tabstop=4

Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
Joshua Ferraro 2007-12-23 15:55:17 -05:00
parent 1647ab1874
commit d17f7e8ab0
1 changed files with 220 additions and 221 deletions

View File

@ -27,8 +27,8 @@ use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
# set the version for version checking
BEGIN {
$VERSION = 3.01;
$DEBUG = ($ENV{DEBUG}) ? 1 : 0;
$VERSION = 3.01;
$DEBUG = ($ENV{DEBUG}) ? 1 : 0;
}
=head1 NAME
@ -302,8 +302,8 @@ sub getRecords {
$query_to_use = $simple_query;
}
#$query_to_use = $simple_query if $scan;
#warn $simple_query if ($scan && $DEBUG);
#$query_to_use = $simple_query if $scan;
#warn $simple_query if ($scan && $DEBUG);
# check if we've got a query_type defined
eval {
if ($query_type)
@ -403,7 +403,7 @@ sub getRecords {
while ( ( my $i = ZOOM::event( \@zconns ) ) != 0 ) {
my $ev = $zconns[ $i - 1 ]->last_event();
if ( $ev == ZOOM::Event::ZEND ) {
next unless $results[ $i - 1 ];
next unless $results[ $i - 1 ];
my $size = $results[ $i - 1 ]->size();
if ( $size > 0 ) {
my $results_hash;
@ -431,8 +431,8 @@ sub getRecords {
my $tmprecord = MARC::Record->new();
$tmprecord->encoding('UTF-8');
my $tmptitle;
my $tmpauthor;
# the minimal record in author/title (depending on MARC flavour)
my $tmpauthor;
# the minimal record in author/title (depending on MARC flavour)
if ( C4::Context->preference("marcflavour") eq
"UNIMARC" )
{
@ -444,10 +444,10 @@ sub getRecords {
}
else {
$tmptitle = MARC::Field->new('245', ' ', ' ',a => $term,);
$tmpauthor = MARC::Field->new('100', ' ', ' ',a => $occ,);
$tmpauthor = MARC::Field->new('100', ' ', ' ',a => $occ,);
}
$tmprecord->append_fields($tmptitle);
$tmprecord->append_fields($tmpauthor);
$tmprecord->append_fields($tmpauthor);
$results_hash->{'RECORDS'}[$j] = $tmprecord->as_usmarc();
}
else {
@ -571,7 +571,7 @@ sub getRecords {
# STOPWORDS
sub _remove_stopwords {
my ($operand,$index) = @_;
my @stopwords_removed;
my @stopwords_removed;
# phrase and exact-qualified indexes shouldn't have stopwords removed
if ($index!~m/phr|ext/){
# remove stopwords from operand : parse all stopwords & remove them (case insensitive)
@ -580,12 +580,12 @@ sub _remove_stopwords {
# is an empty word, we'd get "çon" and wouldn't find anything...
foreach (keys %{C4::Context->stopwords}) {
next if ($_ =~/(and|or|not)/); # don't remove operators
if ($operand =~ /(\P{IsAlpha}$_\P{IsAlpha}|^$_\P{IsAlpha}|\P{IsAlpha}$_$)/) {
$operand=~ s/\P{IsAlpha}$_\P{IsAlpha}/ /gi;
$operand=~ s/^$_\P{IsAlpha}/ /gi;
$operand=~ s/\P{IsAlpha}$_$/ /gi;
push @stopwords_removed, $_;
}
if ($operand =~ /(\P{IsAlpha}$_\P{IsAlpha}|^$_\P{IsAlpha}|\P{IsAlpha}$_$)/) {
$operand=~ s/\P{IsAlpha}$_\P{IsAlpha}/ /gi;
$operand=~ s/^$_\P{IsAlpha}/ /gi;
$operand=~ s/\P{IsAlpha}$_$/ /gi;
push @stopwords_removed, $_;
}
}
}
return ($operand, \@stopwords_removed);
@ -661,13 +661,13 @@ sub _build_weighted_query {
#$weighted_query .=" or kw,wrdl,r5=\"$operand\""; # word list any
$weighted_query .= " or wrdl,fuzzy,r8=\"$operand\"" if $fuzzy_enabled; # add fuzzy, word list
$weighted_query .= " or wrdl,right-Truncation,r9=\"$stemmed_operand\"" if ($stemming and $stemmed_operand); # add stemming, right truncation
$weighted_query .= " or wrdl,r9=\"$operand\"";
$weighted_query .= " or wrdl,r9=\"$operand\"";
# embedded sorting: 0 a-z; 1 z-a
# $weighted_query .= ") or (sort1,aut=1";
}
elsif ( $index eq 'bc' ) {
$weighted_query .= "bc=\"$operand\"";
}
elsif ( $index eq 'bc' ) {
$weighted_query .= "bc=\"$operand\"";
}
# if the index already has more than one qualifier, just wrap the operand
# in quotes and pass it back
elsif ($index =~ ',') {
@ -698,32 +698,32 @@ sub buildQuery {
my @limits = @$limits if $limits;
my @sort_by = @$sort_by if $sort_by;
my $stemming = C4::Context->preference("QueryStemming") || 0;
my $auto_truncation = C4::Context->preference("QueryAutoTruncate") || 0;
my $weight_fields = C4::Context->preference("QueryWeightFields") || 0;
my $fuzzy_enabled = C4::Context->preference("QueryFuzzy") || 0;
my $stemming = C4::Context->preference("QueryStemming") || 0;
my $auto_truncation = C4::Context->preference("QueryAutoTruncate") || 0;
my $weight_fields = C4::Context->preference("QueryWeightFields") || 0;
my $fuzzy_enabled = C4::Context->preference("QueryFuzzy") || 0;
# no stemming/weight/fuzzy in NoZebra
if (C4::Context->preference("NoZebra")) {
$stemming =0;
$weight_fields=0;
$fuzzy_enabled=0;
}
my $remove_stopwords = C4::Context->preference("QueryRemoveStopwords") || 0;
my $remove_stopwords = C4::Context->preference("QueryRemoveStopwords") || 0;
my $query = $operands[0];
my $simple_query = $operands[0];
my $query_cgi;
my $query_desc;
my $query_type;
my $simple_query = $operands[0];
my $query_cgi;
my $query_desc;
my $query_type;
my $limit;
my $limit_cgi;
my $limit_desc;
my $limit;
my $limit_cgi;
my $limit_desc;
my $stopwords_removed;
my $stopwords_removed;
# for handling ccl, cql, pqf queries in diagnostic mode, skip the rest of the steps
# DIAGNOSTIC ONLY!!
# for handling ccl, cql, pqf queries in diagnostic mode, skip the rest of the steps
# DIAGNOSTIC ONLY!!
if ( $query =~ /^ccl=/ ) {
return ( undef, $', $', $', $', '', '', '', '', 'ccl' );
}
@ -734,7 +734,7 @@ sub buildQuery {
return ( undef, $', $', $', $', '', '', '', '', 'pqf' );
}
# pass nested queries directly
# pass nested queries directly
if ( $query =~ /(\(|\))/ ) {
return ( undef, $query, $simple_query, $query_cgi, $query, $limit, $limit_cgi, $limit_desc, $stopwords_removed, 'ccl' );
}
@ -753,48 +753,48 @@ sub buildQuery {
# COMBINE OPERANDS, INDEXES AND OPERATORS
if ( $operands[$i] ) {
# a flag to determine whether or not to add the index to the query
my $indexes_set;
# a flag to determine whether or not to add the index to the query
my $indexes_set;
# if the user is sophisticated enough to specify an index, turn off field weighting, stemming, and stopword handling
if ($operands[$i] =~ /(:|=)/ || $scan) {
$weight_fields = 0;
$stemming = 0;
$remove_stopwords = 0;
}
# if the user is sophisticated enough to specify an index, turn off field weighting, stemming, and stopword handling
if ($operands[$i] =~ /(:|=)/ || $scan) {
$weight_fields = 0;
$stemming = 0;
$remove_stopwords = 0;
}
my $operand = $operands[$i];
my $index = $indexes[$i];
# add some attributes for certain index types
# Date of Publication
if ($index eq 'yr') {
$index .=",st-numeric";
$indexes_set++;
($stemming,$auto_truncation,$weight_fields, $fuzzy_enabled, $remove_stopwords) = (0,0,0,0,0);
}
# Date of Acquisition
elsif ($index eq 'acqdate') {
$index.=",st-date-normalized";
$indexes_set++;
($stemming,$auto_truncation,$weight_fields, $fuzzy_enabled, $remove_stopwords) = (0,0,0,0,0);
# add some attributes for certain index types
# Date of Publication
if ($index eq 'yr') {
$index .=",st-numeric";
$indexes_set++;
($stemming,$auto_truncation,$weight_fields, $fuzzy_enabled, $remove_stopwords) = (0,0,0,0,0);
}
# Date of Acquisition
elsif ($index eq 'acqdate') {
$index.=",st-date-normalized";
$indexes_set++;
($stemming,$auto_truncation,$weight_fields, $fuzzy_enabled, $remove_stopwords) = (0,0,0,0,0);
}
}
# set default structure attribute (word list)
my $struct_attr;
unless (!$index || $index =~ /(st-|phr|ext|wrdl)/) {
$struct_attr = ",wrdl";
}
# some helpful index modifs
# set default structure attribute (word list)
my $struct_attr;
unless (!$index || $index =~ /(st-|phr|ext|wrdl)/) {
$struct_attr = ",wrdl";
}
# some helpful index modifs
my $index_plus = $index.$struct_attr.":" if $index;
my $index_plus_comma=$index.$struct_attr."," if $index;
# Remove Stopwords
if ($remove_stopwords) {
if ($remove_stopwords) {
($operand, $stopwords_removed) = _remove_stopwords($operand,$index);
warn "OPERAND w/out STOPWORDS: >$operand<" if $DEBUG;
warn "REMOVED STOPWORDS: @$stopwords_removed" if ($stopwords_removed && $DEBUG);
}
warn "OPERAND w/out STOPWORDS: >$operand<" if $DEBUG;
warn "REMOVED STOPWORDS: @$stopwords_removed" if ($stopwords_removed && $DEBUG);
}
# Detect Truncation
my ($nontruncated,$righttruncated,$lefttruncated,$rightlefttruncated,$regexpr);
@ -804,7 +804,7 @@ sub buildQuery {
# Apply Truncation
if (scalar(@$righttruncated)+scalar(@$lefttruncated)+scalar(@$rightlefttruncated)>0){
# don't field weight or add the index to the query, we do it here
# don't field weight or add the index to the query, we do it here
$indexes_set = 1;
undef $weight_fields;
my $previous_truncation_operand;
@ -851,10 +851,10 @@ sub buildQuery {
$query .= " $operators[$i-1] ";
$query .= " $index_plus " unless $indexes_set;
$query .= " $operand";
$query_cgi .="&op=$operators[$i-1]";
$query_cgi .="&idx=$index" if $index;
$query_cgi .="&q=$operands[$i]" if $operands[$i];
$query_desc .=" $operators[$i-1] $index_plus $operands[$i]";
$query_cgi .="&op=$operators[$i-1]";
$query_cgi .="&idx=$index" if $index;
$query_cgi .="&q=$operands[$i]" if $operands[$i];
$query_desc .=" $operators[$i-1] $index_plus $operands[$i]";
}
# the default operator is and
@ -862,20 +862,20 @@ sub buildQuery {
$query .= " and ";
$query .= "$index_plus " unless $indexes_set;
$query .= "$operand";
$query_cgi .="&op=and&idx=$index" if $index;
$query_cgi .="&q=$operands[$i]" if $operands[$i];
$query_cgi .="&op=and&idx=$index" if $index;
$query_cgi .="&q=$operands[$i]" if $operands[$i];
$query_desc .= " and $index_plus $operands[$i]";
}
}
# there isn't a pervious operand, don't need an operator
# there isn't a pervious operand, don't need an operator
else {
# field-weighted queries already have indexes set
$query .=" $index_plus " unless $indexes_set;
$query .= $operand;
$query_desc .= " $index_plus $operands[$i]";
$query_cgi.="&idx=$index" if $index;
$query_cgi.="&q=$operands[$i]" if $operands[$i];
# field-weighted queries already have indexes set
$query .=" $index_plus " unless $indexes_set;
$query .= $operand;
$query_desc .= " $index_plus $operands[$i]";
$query_cgi.="&idx=$index" if $index;
$query_cgi.="&q=$operands[$i]" if $operands[$i];
$previous_operand = 1;
}
@ -885,61 +885,61 @@ sub buildQuery {
warn "QUERY BEFORE LIMITS: >$query<" if $DEBUG;
# add limits
$DEBUG=1;
my $group_OR_limits;
my $availability_limit;
$DEBUG=1;
my $group_OR_limits;
my $availability_limit;
foreach my $this_limit (@limits) {
if ( $this_limit =~ /available/ ) {
# available is defined as (items.notloan is NULL) and (items.itemlost > 0 or NULL) (last clause handles NULL values for lost in zebra)
# all records not indexed in the onloan register and allrecords not indexed in the lost register, or where the value of lost is equal to or less than 0
$availability_limit .="( ( allrecords,AlwaysMatches='' not onloan,AlwaysMatches='') and ((lost,st-numeric <= 0) or ( allrecords,AlwaysMatches='' not lost,AlwaysMatches='')) )";
$limit_cgi .= "&limit=available";
$limit_desc .="";
# available is defined as (items.notloan is NULL) and (items.itemlost > 0 or NULL) (last clause handles NULL values for lost in zebra)
# all records not indexed in the onloan register and allrecords not indexed in the lost register, or where the value of lost is equal to or less than 0
$availability_limit .="( ( allrecords,AlwaysMatches='' not onloan,AlwaysMatches='') and ((lost,st-numeric <= 0) or ( allrecords,AlwaysMatches='' not lost,AlwaysMatches='')) )";
$limit_cgi .= "&limit=available";
$limit_desc .="";
}
# these are treated as OR
# these are treated as OR
elsif ( $this_limit =~ /mc/ ) {
$group_OR_limits .= " or " if $group_OR_limits;
$limit_desc .=" or " if $group_OR_limits;
$group_OR_limits .= "$this_limit";
$limit_cgi .="&limit=$this_limit";
$limit_desc .= " $this_limit";
$limit_desc .=" or " if $group_OR_limits;
$group_OR_limits .= "$this_limit";
$limit_cgi .="&limit=$this_limit";
$limit_desc .= " $this_limit";
}
# regular old limits
else {
$limit .= " and " if $limit || $query;
$limit .= "$this_limit";
$limit_cgi .="&limit=$this_limit";
$limit_desc .=" $this_limit";
}
# regular old limits
else {
$limit .= " and " if $limit || $query;
$limit .= "$this_limit";
$limit_cgi .="&limit=$this_limit";
$limit_desc .=" $this_limit";
}
}
if ($group_OR_limits) {
$limit.=" and " if ($query || $limit );
$limit.="($group_OR_limits)";
}
if ($availability_limit) {
$limit.=" and " if ($query || $limit );
$limit.="($availability_limit)";
}
# normalize the strings
$query =~ s/:/=/g;
$limit =~ s/:/=/g;
for ($query, $query_desc, $limit, $limit_desc) {
$_ =~ s/ / /g; # remove extra spaces
$_ =~ s/^ //g; # remove any beginning spaces
$_ =~ s/ $//g; # remove any ending spaces
$_ =~ s/==/=/g; # remove double == from query
if ($group_OR_limits) {
$limit.=" and " if ($query || $limit );
$limit.="($group_OR_limits)";
}
if ($availability_limit) {
$limit.=" and " if ($query || $limit );
$limit.="($availability_limit)";
}
# normalize the strings
$query =~ s/:/=/g;
$limit =~ s/:/=/g;
for ($query, $query_desc, $limit, $limit_desc) {
$_ =~ s/ / /g; # remove extra spaces
$_ =~ s/^ //g; # remove any beginning spaces
$_ =~ s/ $//g; # remove any ending spaces
$_ =~ s/==/=/g; # remove double == from query
}
$query_cgi =~ s/^&//;
}
$query_cgi =~ s/^&//;
# append the limit to the query
$query .=" ".$limit;
# append the limit to the query
$query .=" ".$limit;
warn "query=$query and limit=$limit" if $DEBUG;
warn "QUERY:".$query if $DEBUG;
warn "QUERY CGI:".$query_cgi if $DEBUG;
warn "QUERY CGI:".$query_cgi if $DEBUG;
warn "QUERY DESC:".$query_desc if $DEBUG;
warn "LIMIT:".$limit if $DEBUG;
warn "LIMIT CGI:".$limit_cgi if $DEBUG;
@ -947,7 +947,7 @@ sub buildQuery {
warn "---------" if $DEBUG;
warn "Leave buildQuery" if $DEBUG;
warn "---------" if $DEBUG;
return ( undef, $query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_desc,$stopwords_removed,$query_type );
return ( undef, $query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_desc,$stopwords_removed,$query_type );
}
# IMO this subroutine is pretty messy still -- it's responsible for
@ -975,12 +975,12 @@ sub searchResults {
while ( my $bdata = $bsth->fetchrow_hashref ) {
$branches{ $bdata->{'branchcode'} } = $bdata->{'branchname'};
}
my %locations;
my $lsch = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category = 'SHELF_LOC'");
$lsch->execute();
while (my $ldata = $lsch->fetchrow_hashref ) {
$locations{ $ldata->{'authorised_value'} } = $ldata->{'lib'};
}
my %locations;
my $lsch = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category = 'SHELF_LOC'");
$lsch->execute();
while (my $ldata = $lsch->fetchrow_hashref ) {
$locations{ $ldata->{'authorised_value'} } = $ldata->{'lib'};
}
#Build itemtype hash
#find itemtype & itemtype image
@ -1023,7 +1023,7 @@ sub searchResults {
my $marcrecord;
$marcrecord = MARC::File::USMARC::decode( $marcresults[$i] );
my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, '' );
$oldbiblio->{result_number} = $i+1;
$oldbiblio->{result_number} = $i+1;
# add image url if there is one
if ( $itemtypes{ $oldbiblio->{itemtype} }->{imageurl} =~ /^http:/ ) {
$oldbiblio->{imageurl} =
@ -1064,22 +1064,21 @@ sub searchResults {
$oldbiblio->{summary} = $summary;
}
# add spans to search term in results for search term highlighting
# save a native author, for the <a href=search.lq=<!--tmpl_var name="author"-->> link
my $searchhighlightblob;
for my $highlight_field ($marcrecord->fields) {
next if $highlight_field->tag() =~ /(^00)/; # skip fixed fields
my $match;
my $field = $highlight_field->as_string();
for my $term ( keys %$span_terms_hashref ) {
if (($field =~ /$term/i) && (length($term) > 3)) {
$field =~ s/$term/<span class=\"term\">$&<\/span>/gi;
$match++;
}
}
$searchhighlightblob .= $field." ... " if $match;
}
$oldbiblio->{'searchhighlightblob'} = $searchhighlightblob;
my $searchhighlightblob;
for my $highlight_field ($marcrecord->fields) {
next if $highlight_field->tag() =~ /(^00)/; # skip fixed fields
my $match;
my $field = $highlight_field->as_string();
for my $term ( keys %$span_terms_hashref ) {
if (($field =~ /$term/i) && (length($term) > 3)) {
$field =~ s/$term/<span class=\"term\">$&<\/span>/gi;
$match++;
}
}
$searchhighlightblob .= $field." ... " if $match;
}
$oldbiblio->{'searchhighlightblob'} = $searchhighlightblob;
# save an author with no <span> tag, for the <a href=search.pl?q=<!--tmpl_var name="author"-->> link
$oldbiblio->{'author_nospan'} = $oldbiblio->{'author'};
for my $term ( keys %$span_terms_hashref ) {
my $old_term = $term;
@ -1107,102 +1106,102 @@ sub searchResults {
# Setting item statuses for display
my @available_items_loop;
my @onloan_items_loop;
my @other_items_loop;
my @onloan_items_loop;
my @other_items_loop;
my $available_items;
my $onloan_items;
my $other_items;
my $onloan_items;
my $other_items;
my $ordered_count = 0;
my $available_count = 0;
my $available_count = 0;
my $onloan_count = 0;
my $longoverdue_count = 0;
my $other_count = 0;
my $longoverdue_count = 0;
my $other_count = 0;
my $wthdrawn_count = 0;
my $itemlost_count = 0;
my $itembinding_count = 0;
my $itemdamaged_count = 0;
my $itembinding_count = 0;
my $itemdamaged_count = 0;
my $can_place_holds = 0;
my $items_count=scalar(@fields);
my $items_counter;
my $maxitems = (C4::Context->preference('maxItemsinSearchResults')) ? C4::Context->preference('maxItemsinSearchResults')- 1 : 1;
my $items_counter;
my $maxitems = (C4::Context->preference('maxItemsinSearchResults')) ? C4::Context->preference('maxItemsinSearchResults')- 1 : 1;
foreach my $field (@fields) {
my $item;
$items_counter++;
$items_counter++;
# populate the items hash
# populate the items hash
foreach my $code ( keys %subfieldstosearch ) {
$item->{$code} = $field->subfield( $subfieldstosearch{$code} );
}
# set item's branch name, use homebranch first, fall back to holdingbranch
# set item's branch name, use homebranch first, fall back to holdingbranch
if ($item->{'homebranch'}) {
$item->{'branchname'} = $branches{$item->{homebranch}};
}
# Last resort
elsif ($item->{'holdingbranch'}) {
$item->{'branchname'} = $branches{$item->{holdingbranch}};
$item->{'branchname'} = $branches{$item->{holdingbranch}};
}
# key for items results is built from branchcode . coded location qualifier . itemcallnumber
if ($item->{onloan}) {
$onloan_count++;
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{due_date} = format_date($item->{onloan});
# key for items results is built from branchcode . coded location qualifier . itemcallnumber
if ($item->{onloan}) {
$onloan_count++;
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{due_date} = format_date($item->{onloan});
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{count}++ if $item->{'homebranch'};
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{branchname} = $item->{'branchname'};
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{location} = $locations{$item->{location}};
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{itemcallnumber} = $item->{itemcallnumber};
# if something's checked out and lost, mark it as 'long overdue'
if ( $item->{itemlost} ) {
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{longoverdue}++;
$longoverdue_count++;
}
# can place holds as long as this item isn't lost
else {
$can_place_holds = 1;
}
}
# if something's checked out and lost, mark it as 'long overdue'
if ( $item->{itemlost} ) {
$onloan_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{due_date} }->{longoverdue}++;
$longoverdue_count++;
}
# can place holds as long as this item isn't lost
else {
$can_place_holds = 1;
}
}
# items not on loan, but still unavailable ( lost, withdrawn, damaged )
else {
# item is on order
if ( $item->{notforloan} == -1) {
$ordered_count++;
}
# items not on loan, but still unavailable ( lost, withdrawn, damaged )
else {
# item is on order
if ( $item->{notforloan} == -1) {
$ordered_count++;
}
# item is withdrawn, lost or damaged
if ( $item->{wthdrawn} || $item->{itemlost} || $item->{damaged} ) {
$wthdrawn_count++ if $item->{wthdrawn};
$itemlost_count++ if $item->{itemlost};
$itemdamaged_count++ if $item->{damaged};
$item->{status} = $item->{wthdrawn}."-".$item->{itemlost}."-".$item->{damaged};
$other_count++;
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{wthdrawn} = $item->{wthdrawn};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{itemlost} = $item->{itemlost};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{damaged} = $item->{damaged};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{count}++ if $item->{'homebranch'};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{branchname} = $item->{'branchname'};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{location} = $locations{$item->{location}};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{itemcallnumber} = $item->{itemcallnumber};
}
# item is withdrawn, lost or damaged
if ( $item->{wthdrawn} || $item->{itemlost} || $item->{damaged} ) {
$wthdrawn_count++ if $item->{wthdrawn};
$itemlost_count++ if $item->{itemlost};
$itemdamaged_count++ if $item->{damaged};
$item->{status} = $item->{wthdrawn}."-".$item->{itemlost}."-".$item->{damaged};
$other_count++;
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{wthdrawn} = $item->{wthdrawn};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{itemlost} = $item->{itemlost};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{damaged} = $item->{damaged};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{count}++ if $item->{'homebranch'};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{branchname} = $item->{'branchname'};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{location} = $locations{$item->{location}};
$other_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'}.$item->{status} }->{itemcallnumber} = $item->{itemcallnumber};
}
# item is available
else {
$can_place_holds = 1;
$available_count++;
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{count}++ if $item->{'homebranch'};
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{branchname} = $item->{'branchname'};
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{location} = $locations{$item->{location}};
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{itemcallnumber} = $item->{itemcallnumber};
}
}
# item is available
else {
$can_place_holds = 1;
$available_count++;
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{count}++ if $item->{'homebranch'};
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{branchname} = $item->{'branchname'};
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{location} = $locations{$item->{location}};
$available_items->{ $item->{'homebranch'}.'--'.$item->{location}.$item->{'itemcallnumber'} }->{itemcallnumber} = $item->{itemcallnumber};
}
}
} # notforloan, item level and biblioitem level
my ($availableitemscount, $onloanitemscount, $otheritemscount);
my $maxitems = (C4::Context->preference('maxItemsinSearchResults')) ? C4::Context->preference('maxItemsinSearchResults')- 1 : 1;
my ($availableitemscount, $onloanitemscount, $otheritemscount);
my $maxitems = (C4::Context->preference('maxItemsinSearchResults')) ? C4::Context->preference('maxItemsinSearchResults')- 1 : 1;
for my $key ( sort keys %$onloan_items ) {
$onloanitemscount++;
push @onloan_items_loop, $onloan_items->{$key} unless $onloanitemscount > $maxitems;
push @onloan_items_loop, $onloan_items->{$key} unless $onloanitemscount > $maxitems;
}
for my $key ( sort keys %$other_items ) {
$otheritemscount++;
@ -1212,23 +1211,23 @@ sub searchResults {
$availableitemscount++;
push @available_items_loop, $available_items->{$key} unless $availableitemscount > $maxitems;
}
# last check for norequest : if itemtype is notforloan, it can't be reserved either, whatever the items
# last check for norequest : if itemtype is notforloan, it can't be reserved either, whatever the items
$can_place_holds = 0 if $itemtypes{$oldbiblio->{itemtype}}->{notforloan};
$oldbiblio->{norequests} = 1 unless $can_place_holds;
$oldbiblio->{itemsplural} = 1 if $items_count>1;
$oldbiblio->{itemsplural} = 1 if $items_count>1;
$oldbiblio->{items_count} = $items_count;
$oldbiblio->{available_items_loop} = \@available_items_loop;
$oldbiblio->{onloan_items_loop} = \@onloan_items_loop;
$oldbiblio->{other_items_loop} = \@other_items_loop;
$oldbiblio->{availablecount} = $available_count;
$oldbiblio->{availableplural} = 1 if $available_count>1;
$oldbiblio->{onloan_items_loop} = \@onloan_items_loop;
$oldbiblio->{other_items_loop} = \@other_items_loop;
$oldbiblio->{availablecount} = $available_count;
$oldbiblio->{availableplural} = 1 if $available_count>1;
$oldbiblio->{onloancount} = $onloan_count;
$oldbiblio->{onloanplural} = 1 if $onloan_count>1;
$oldbiblio->{othercount} = $other_count;
$oldbiblio->{otherplural} = 1 if $other_count>1;
$oldbiblio->{onloanplural} = 1 if $onloan_count>1;
$oldbiblio->{othercount} = $other_count;
$oldbiblio->{otherplural} = 1 if $other_count>1;
$oldbiblio->{wthdrawncount} = $wthdrawn_count;
$oldbiblio->{itemlostcount} = $itemlost_count;
$oldbiblio->{damagedcount} = $itemdamaged_count;
$oldbiblio->{damagedcount} = $itemdamaged_count;
$oldbiblio->{orderedcount} = $ordered_count;
$oldbiblio->{isbn} =~ s/-//g; # deleting - in isbn to enable amazon content
push( @newresults, $oldbiblio );
@ -1280,7 +1279,7 @@ sub NZanalyse {
if ($string =~/"/) {
$string =~ s/"(.*?)"/__X__/;
$commacontent = $1;
warn "commacontent : $commacontent" if $DEBUG;
warn "commacontent : $commacontent" if $DEBUG;
}
# split the query string in 3 parts : X AND Y means : $left="X", $operand="AND" and $right="Y"
# then, call again NZanalyse with $left and $right
@ -1408,7 +1407,7 @@ sub NZanalyse {
warn "handling unless (operator)... left:$left operator:$operator right:$right" if $DEBUG;
}
my $results;
# strip adv, zebra keywords, currently not handled in nozebra: wrdl, ext, phr...
# strip adv, zebra keywords, currently not handled in nozebra: wrdl, ext, phr...
$left =~ s/[ ,].*$//;
# automatic replace for short operators
$left='title' if $left =~ '^ti$';