# Suite 330, Boston, MA 02111-1307 USA
use strict;
-# use warnings; # FIXME
+#use warnings; FIXME - Bug 2505
require Exporter;
use C4::Context;
use C4::Biblio; # GetMarcFromKohaField, GetBiblioData
use C4::Dates qw(format_date);
use C4::XSLT;
use C4::Branch;
+use C4::Reserves; # CheckReserves
use C4::Debug;
-use YAML;
use URI::Escape;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
sub SimpleSearch {
my ( $query, $offset, $max_results, $servers ) = @_;
-
+
if ( C4::Context->preference('NoZebra') ) {
my $result = NZorder( NZanalyse($query) )->{'biblioserver'};
my $search_result =
);
The all singing, all dancing, multi-server, asynchronous, scanning,
-searching, record nabbing, facet-building
+searching, record nabbing, facet-building
See verbse embedded documentation.
# if it's a branch, label by the name, not the code,
if ( $link_value =~ /branch/ ) {
- if (defined $branches
- && ref($branches) eq "HASH"
- && defined $branches->{$one_facet}
+ if (defined $branches
+ && ref($branches) eq "HASH"
+ && defined $branches->{$one_facet}
&& ref ($branches->{$one_facet}) eq "HASH")
{
$facet_label_value =
push @facets_loop, {
type_link_value => $link_value,
type_id => $link_value . "_id",
- "type_label_" . $facets_info->{$link_value}->{'label_value'} => 1,
+ "type_label_" . $facets_info->{$link_value}->{'label_value'} => 1,
facets => \@this_facets_array,
expandable => $expandable,
expand => $link_value,
my $results_hashref = {};
my $stats = XMLin($paz->stat);
my $results = XMLin($paz->show($offset, $results_per_page, 'work-title:1'), forcearray => 1);
-
+
# for a grouped search result, the number of hits
# is the number of groups returned; 'bib_hits' will have
- # the total number of bibs.
+ # the total number of bibs.
$results_hashref->{'biblioserver'}->{'hits'} = $results->{'merged'}->[0];
$results_hashref->{'biblioserver'}->{'bib_hits'} = $stats->{'hits'};
push @{ $results_hashref->{'biblioserver'}->{'GROUPS'} }, $result_group;
}
-
+
# pass through facets
my $termlist_xml = $paz->termlist('author,subject');
my $terms = XMLin($termlist_xml, forcearray => 1);
# we use IsAlpha unicode definition, to deal correctly with diacritics.
# otherwise, a French word like "leçon" woudl be split into "le" "çon", "le"
# is a stopword, we'd get "çon" and wouldn't find anything...
-#
+#
foreach ( keys %{ C4::Context->stopwords } ) {
next if ( $_ =~ /(and|or|not)/ ); # don't remove operators
- $debug && warn "$_ Dump($operand)";
if ( my ($matched) = ($operand =~
/([^\X\p{isAlnum}]\Q$_\E[^\X\p{isAlnum}]|[^\X\p{isAlnum}]\Q$_\E$|^\Q$_\E[^\X\p{isAlnum}])/gi))
{
# If operand contains a digit, it is almost certainly an identifier, and should
# not be stemmed. This is particularly relevant for ISBNs and ISSNs, which
- # can contain the letter "X" - for example, _build_stemmend_operand would reduce
+ # can contain the letter "X" - for example, _build_stemmend_operand would reduce
# "014100018X" to "x ", which for a MARC21 database would bring up irrelevant
# results (e.g., "23 x 29 cm." from the 300$c). Bug 2098.
return $operand if $operand =~ /\d/;
# FIXME: the locale should be set based on the user's language and/or search choice
- warn "$lang";
+ #warn "$lang";
my $stemmer = Lingua::Stem::Snowball->new( lang => $lang,
encoding => "UTF-8" );
return $weighted_query;
}
+=head2 getIndexes
+
+Return an array with available indexes.
+
+=cut
+
+sub getIndexes{
+ my @indexes = (
+ # biblio indexes
+ 'ab',
+ 'Abstract',
+ 'acqdate',
+ 'allrecords',
+ 'an',
+ 'Any',
+ 'at',
+ 'au',
+ 'aub',
+ 'aud',
+ 'audience',
+ 'auo',
+ 'aut',
+ 'Author',
+ 'Author-in-order ',
+ 'Author-personal-bibliography',
+ 'Authority-Number',
+ 'authtype',
+ 'bc',
+ 'biblionumber',
+ 'bio',
+ 'biography',
+ 'callnum',
+ 'cfn',
+ 'Chronological-subdivision',
+ 'cn-bib-source',
+ 'cn-bib-sort',
+ 'cn-class',
+ 'cn-item',
+ 'cn-prefix',
+ 'cn-suffix',
+ 'cpn',
+ 'Code-institution',
+ 'Conference-name',
+ 'Conference-name-heading',
+ 'Conference-name-see',
+ 'Conference-name-seealso',
+ 'Content-type',
+ 'Control-number',
+ 'copydate',
+ 'Corporate-name',
+ 'Corporate-name-heading',
+ 'Corporate-name-see',
+ 'Corporate-name-seealso',
+ 'ctype',
+ 'date-entered-on-file',
+ 'Date-of-acquisition',
+ 'Date-of-publication',
+ 'Dewey-classification',
+ 'extent',
+ 'fic',
+ 'fiction',
+ 'Form-subdivision',
+ 'format',
+ 'Geographic-subdivision',
+ 'he',
+ 'Heading',
+ 'Heading-use-main-or-added-entry',
+ 'Heading-use-series-added-entry ',
+ 'Heading-use-subject-added-entry',
+ 'Host-item',
+ 'id-other',
+ 'Illustration-code',
+ 'ISBN',
+ 'ISSN',
+ 'itemtype',
+ 'kw',
+ 'Koha-Auth-Number',
+ 'l-format',
+ 'language',
+ 'lc-card',
+ 'LC-card-number',
+ 'lcn',
+ 'llength',
+ 'ln',
+ 'Local-classification',
+ 'Local-number',
+ 'Match-heading',
+ 'Match-heading-see-from',
+ 'Material-type',
+ 'mc-itemtype',
+ 'mc-rtype',
+ 'mus',
+ 'Name-geographic',
+ 'Name-geographic-heading',
+ 'Name-geographic-see',
+ 'Name-geographic-seealso',
+ 'nb',
+ 'Note',
+ 'ns',
+ 'nt',
+ 'pb',
+ 'Personal-name',
+ 'Personal-name-heading',
+ 'Personal-name-see',
+ 'Personal-name-seealso',
+ 'pl',
+ 'Place-publication',
+ 'pn',
+ 'popularity',
+ 'pubdate',
+ 'Publisher',
+ 'Record-control-number',
+ 'rcn',
+ 'Record-type',
+ 'rtype',
+ 'se',
+ 'See',
+ 'See-also',
+ 'sn',
+ 'Stock-number',
+ 'su',
+ 'Subject',
+ 'Subject-heading-thesaurus',
+ 'Subject-name-personal',
+ 'Subject-subdivision',
+ 'Summary',
+ 'Suppress',
+ 'su-geo',
+ 'su-na',
+ 'su-to',
+ 'su-ut',
+ 'ut',
+ 'Term-genre-form',
+ 'Term-genre-form-heading',
+ 'Term-genre-form-see',
+ 'Term-genre-form-seealso',
+ 'ti',
+ 'Title',
+ 'Title-cover',
+ 'Title-series',
+ 'Title-uniform',
+ 'Title-uniform-heading',
+ 'Title-uniform-see',
+ 'Title-uniform-seealso',
+ 'totalissues',
+ 'yr',
+
+ # items indexes
+ 'acqsource',
+ 'barcode',
+ 'bc',
+ 'branch',
+ 'ccode',
+ 'classification-source',
+ 'cn-sort',
+ 'coded-location-qualifier',
+ 'copynumber',
+ 'damaged',
+ 'datelastborrowed',
+ 'datelastseen',
+ 'holdingbranch',
+ 'homebranch',
+ 'issues',
+ 'item',
+ 'itemnumber',
+ 'itype',
+ 'Local-classification',
+ 'location',
+ 'lost',
+ 'materials-specified',
+ 'mc-ccode',
+ 'mc-itype',
+ 'mc-loc',
+ 'notforloan',
+ 'onloan',
+ 'price',
+ 'renewals',
+ 'replacementprice',
+ 'replacementpricedate',
+ 'reserves',
+ 'restricted',
+ 'stack',
+ 'uri',
+ 'withdrawn',
+
+ # subject related
+ );
+
+ return \@indexes;
+}
+
=head2 buildQuery
( $error, $query,
# no stemming/weight/fuzzy in NoZebra
if ( C4::Context->preference("NoZebra") ) {
- $stemming = 0;
- $weight_fields = 0;
- $fuzzy_enabled = 0;
+ $stemming = 0;
+ $weight_fields = 0;
+ $fuzzy_enabled = 0;
+ $auto_truncation = 0;
}
my $query = $operands[0];
my $stopwords_removed; # flag to determine if stopwords have been removed
+ my $cclq;
+ my $cclindexes = getIndexes();
+ if( $query !~ /\s*ccl=/ ){
+ for my $index (@$cclindexes){
+ if($query =~ /($index)(,?\w)*[:=]/){
+ $cclq = 1;
+ }
+ }
+ $query = "ccl=$query" if($cclq);
+ }
+
# for handling ccl, cql, pqf queries in diagnostic mode, skip the rest of the steps
# DIAGNOSTIC ONLY!!
if ( $query =~ /^ccl=/ ) {
- return ( undef, $', $', "q=ccl=$'", $', '', '', '', '', 'ccl' );
+ my $q=$';
+ # This is needed otherwise ccl= and &limit won't work together, and
+ # this happens when selecting a subject on the opac-detail page
+ if (@limits) {
+ $q .= ' and '.join(' and ', @limits);
+ }
+ return ( undef, $q, $q, "q=ccl=$q", $q, '', '', '', '', 'ccl' );
}
if ( $query =~ /^cql=/ ) {
return ( undef, $', $', "q=cql=$'", $', '', '', '', '', 'cql' );
# pass nested queries directly
# FIXME: need better handling of some of these variables in this case
- if ( $query =~ /(\(|\))/ ) {
- return (
- undef, $query, $simple_query, $query_cgi,
- $query, $limit, $limit_cgi, $limit_desc,
- $stopwords_removed, 'ccl'
- );
- }
+ # Nested queries aren't handled well and this implementation is flawed and causes users to be
+ # unable to search for anything containing () commenting out, will be rewritten for 3.4.0
+# if ( $query =~ /(\(|\))/ ) {
+# return (
+# undef, $query, $simple_query, $query_cgi,
+# $query, $limit, $limit_cgi, $limit_desc,
+# $stopwords_removed, 'ccl'
+# );
+# }
# Form-based queries are non-nested and fixed depth, so we can easily modify the incoming
# query operands and indexes and add stemming, truncation, field weighting, etc.
# COMBINE OPERANDS, INDEXES AND OPERATORS
if ( $operands[$i] ) {
+ $operands[$i]=~s/^\s+//;
# A flag to determine whether or not to add the index to the query
my $indexes_set;
# ISBN,ISSN,Standard Number, don't need special treatment
elsif ( $index eq 'nb' || $index eq 'ns' ) {
$indexes_set++;
- (
+ (
$stemming, $auto_truncation,
$weight_fields, $fuzzy_enabled,
$remove_stopwords
) = ( 0, 0, 0, 0, 0 );
}
+
+ if(not $index){
+ $index = 'kw';
+ }
+
# Set default structure attribute (word list)
- my $struct_attr;
+ my $struct_attr = q{};
unless ( $indexes_set || !$index || $index =~ /(st-|phr|ext|wrdl)/ ) {
$struct_attr = ",wrdl";
}
# Some helpful index variants
- my $index_plus = $index . $struct_attr . ":" if $index;
- my $index_plus_comma = $index . $struct_attr . "," if $index;
+ my $index_plus = $index . $struct_attr . ':';
+ my $index_plus_comma = $index . $struct_attr . ',';
# Remove Stopwords
if ($remove_stopwords) {
}
if ($auto_truncation){
- # join throws an error if there is a leading space
- $operand =~ s/^\s+//;
- $operand=~join(" ",map{ "$_*" }split (/\s+/,$operand));
- }
+ unless ( $index =~ /(st-|phr|ext)/ ) {
+ #FIXME only valid with LTR scripts
+ $operand=join(" ",map{
+ (index($_,"*")>0?"$_":"$_*")
+ }split (/\s+/,$operand));
+ warn $operand if $DEBUG;
+ }
+ }
# Detect Truncation
my $truncated_operand;
my $group_OR_limits;
my $availability_limit;
foreach my $this_limit (@limits) {
-# if ( $this_limit =~ /available/ ) {
+ if ( $this_limit =~ /available/ ) {
#
## 'available' is defined as (items.onloan is NULL) and (items.itemlost = 0)
## In English:
## all records not indexed in the onloan register (zebra) and all records with a value of lost equal to 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 .= "";
-# }
-#
+ $availability_limit .=
+"( ( allrecords,AlwaysMatches='' not onloan,AlwaysMatches='') and (lost,st-numeric=0) )"; #or ( allrecords,AlwaysMatches='' not lost,AlwaysMatches='')) )";
+ $limit_cgi .= "&limit=available";
+ $limit_desc .= "";
+ }
+
# group_OR_limits, prefixed by mc-
# OR every member of the group
-# elsif ( $this_limit =~ /mc/ ) {
- if ( $this_limit =~ /mc/ ) {
+ elsif ( $this_limit =~ /mc/ ) {
+
+ if ( $this_limit =~ /mc-ccode:/ ) {
+ # in case the mc-ccode value has complicating chars like ()'s inside it we wrap in quotes
+ $this_limit =~ tr/"//d;
+ my ($k,$v) = split(/:/, $this_limit,2);
+ $this_limit = $k.":\"".$v."\"";
+ }
+
$group_OR_limits .= " or " if $group_OR_limits;
$limit_desc .= " or " if $group_OR_limits;
$group_OR_limits .= "$this_limit";
}
# Normalize the query and limit strings
- $query =~ s/:/=/g;
+ # This is flawed , means we can't search anything with : in it
+ # if user wants to do ccl or cql, start the query with that
+# $query =~ s/:/=/g;
+ $query =~ s/(?<=(ti|au|pb|su|an|kw|mc)):/=/g;
+ $query =~ s/(?<=(wrdl)):/=/g;
+ $query =~ s/(?<=(trn|phr)):/=/g;
$limit =~ s/:/=/g;
for ( $query, $query_desc, $limit, $limit_desc ) {
- s/ / /g; # remove extra spaces
+ s/ +/ /g; # remove extra spaces
s/^ //g; # remove any beginning spaces
s/ $//g; # remove any ending spaces
s/==/=/g; # remove double == from query
=head2 searchResults
+ my @search_results = searchResults($search_context, $searchdesc, $hits,
+ $results_per_page, $offset, $scan,
+ @marcresults, $hidelostitems);
+
Format results in a form suitable for passing to the template
=cut
# IMO this subroutine is pretty messy still -- it's responsible for
# building the HTML output for the template
sub searchResults {
- my ( $searchdesc, $hits, $results_per_page, $offset, $scan, @marcresults, $hidelostitems ) = @_;
+ my ( $search_context, $searchdesc, $hits, $results_per_page, $offset, $scan, @marcresults, $hidelostitems ) = @_;
my $dbh = C4::Context->dbh;
my @newresults;
+ $search_context = 'opac' unless $search_context eq 'opac' or $search_context eq 'intranet';
+
#Build branchnames hash
#find branchname
#get branch information.....
}
my $marcflavour = C4::Context->preference("marcflavour");
- # We get the biblionumber position in MARC
+ # We get the biblionumber position in MARC
my ($bibliotag,$bibliosubf)=GetMarcFromKohaField('biblio.biblionumber','');
my $fw;
-
+
# loop through all of the records we've retrieved
for ( my $i = $offset ; $i <= $times - 1 ; $i++ ) {
my $marcrecord = MARC::File::USMARC::decode( $marcresults[$i] );
-
- if ($bibliotag<10){
- $fw = GetFrameworkCode($marcrecord->field($bibliotag)->data);
- }else{
- $fw = GetFrameworkCode($marcrecord->subfield($bibliotag,$bibliosubf));
- }
-
+ $fw = $scan
+ ? undef
+ : $bibliotag < 10
+ ? GetFrameworkCode($marcrecord->field($bibliotag)->data)
+ : GetFrameworkCode($marcrecord->subfield($bibliotag,$bibliosubf));
my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, $fw );
$oldbiblio->{subtitle} = GetRecordValue('subtitle', $marcrecord, $fw);
$oldbiblio->{result_number} = $i + 1;
if ( $itemtypes{ $oldbiblio->{itemtype} }->{summary} ) {
my $summary = $itemtypes{ $oldbiblio->{itemtype} }->{summary};
my @fields = $marcrecord->fields();
-
+
my $newsummary;
foreach my $line ( "$summary\n" =~ /(.*)\n/g ){
my $tags = {};
$tags->{$tag} = $#abc + 1 ;
}
}
-
+
# We catch how many times to repeat this line
my $max = 0;
foreach my $tag (keys(%$tags)){
$max = $tags->{$tag} if($tags->{$tag} > $max);
}
-
+
# we replace, and repeat each line
for (my $i = 0 ; $i < $max ; $i++){
my $newline = $line;
foreach my $tag ( $newline =~ /\[(\d{3}[\w|\d])\]/g ) {
$tag =~ /(.{3})(.)/;
-
+
if($marcrecord->field($1)){
my @repl = $marcrecord->field($1)->subfield($2);
my $subfieldvalue = $repl[$i];
-
+
if (! utf8::is_utf8($subfieldvalue)) {
utf8::decode($subfieldvalue);
}
-
+
$newline =~ s/\[$tag\]/$subfieldvalue/g;
}
}
my $itemdamaged_count = 0;
my $item_in_transit_count = 0;
my $can_place_holds = 0;
+ my $item_onhold_count = 0;
my $items_count = scalar(@fields);
my $maxitems =
( C4::Context->preference('maxItemsinSearchResults') )
foreach my $code ( keys %subfieldstosearch ) {
$item->{$code} = $field->subfield( $subfieldstosearch{$code} );
}
-
+
my $hbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'homebranch' : 'holdingbranch';
my $otherbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'holdingbranch' : 'homebranch';
# set item's branch name, use HomeOrHoldingBranch syspref first, fall back to the other one
$item->{'branchname'} = $branches{$item->{$hbranch}};
}
elsif ($item->{$otherbranch}) { # Last resort
- $item->{'branchname'} = $branches{$item->{$otherbranch}};
+ $item->{'branchname'} = $branches{$item->{$otherbranch}};
}
my $prefix = $item->{$hbranch} . '--' . $item->{location} . $item->{itype} . $item->{itemcallnumber};
# is item in transit?
my $transfertwhen = '';
my ($transfertfrom, $transfertto);
-
+
+ # is item on the reserve shelf?
+ my $reservestatus = 0;
+ my $reserveitem;
+
unless ($item->{wthdrawn}
|| $item->{itemlost}
|| $item->{damaged}
# should map transit status to record indexed in Zebra.
#
($transfertwhen, $transfertfrom, $transfertto) = C4::Circulation::GetTransfers($item->{itemnumber});
+ ($reservestatus, $reserveitem) = C4::Reserves::CheckReserves($item->{itemnumber});
}
# item is withdrawn, lost or damaged
if ( $item->{wthdrawn}
|| $item->{itemlost}
|| $item->{damaged}
- || $item->{notforloan}
+ || $item->{notforloan} > 0
+ || $reservestatus eq 'Waiting'
|| ($transfertwhen ne ''))
{
$wthdrawn_count++ if $item->{wthdrawn};
$itemlost_count++ if $item->{itemlost};
$itemdamaged_count++ if $item->{damaged};
$item_in_transit_count++ if $transfertwhen ne '';
+ $item_onhold_count++ if $reservestatus eq 'Waiting';
$item->{status} = $item->{wthdrawn} . "-" . $item->{itemlost} . "-" . $item->{damaged} . "-" . $item->{notforloan};
$other_count++;
$other_items->{$key}->{$_} = $item->{$_};
}
$other_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
+ $other_items->{$key}->{onhold} = ($reservestatus) ? 1 : 0;
$other_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
$other_items->{$key}->{count}++ if $item->{$hbranch};
$other_items->{$key}->{location} = $shelflocations->{ $item->{location} };
}
# XSLT processing of some stuff
- if (C4::Context->preference("XSLTResultsDisplay") && !$scan) {
- $oldbiblio->{XSLTResultsRecord} = XSLTParse4Display(
- $oldbiblio->{biblionumber}, $marcrecord, 'Results' );
+ use C4::Charset;
+ SetUTF8Flag($marcrecord);
+ $debug && warn $marcrecord->as_formatted;
+ if (!$scan && $search_context eq 'opac' && C4::Context->preference("OPACXSLTResultsDisplay")) {
+ # FIXME note that XSLTResultsDisplay (use of XSLT to format staff interface bib search results)
+ # is not implemented yet
+ $oldbiblio->{XSLTResultsRecord} = XSLTParse4Display($oldbiblio->{biblionumber}, $marcrecord, 'Results',
+ $search_context, 1);
+ # the last parameter tells Koha to clean up the problematic ampersand entities that Zebra outputs
+
}
# last check for norequest : if itemtype is notforloan, it can't be reserved either, whatever the items
$oldbiblio->{itemlostcount} = $itemlost_count;
$oldbiblio->{damagedcount} = $itemdamaged_count;
$oldbiblio->{intransitcount} = $item_in_transit_count;
+ $oldbiblio->{onholdcount} = $item_onhold_count;
$oldbiblio->{orderedcount} = $ordered_count;
$oldbiblio->{isbn} =~
s/-//g; # deleting - in isbn to enable amazon content
- push( @newresults, $oldbiblio )
+ push( @newresults, $oldbiblio )
if(not $hidelostitems
- or (($items_count > $itemlost_count )
+ or (($items_count > $itemlost_count )
&& $hidelostitems));
}
-
+
return @newresults;
}
=head2 SearchAcquisitions
- Search for acquisitions
+ Search for acquisitions
=cut
sub SearchAcquisitions{
my ($datebegin, $dateend, $itemtypes,$criteria, $orderby) = @_;
-
+
my $dbh=C4::Context->dbh;
# Variable initialization
my $str=qq|
- SELECT marcxml
- FROM biblio
+ SELECT marcxml
+ FROM biblio
LEFT JOIN biblioitems ON biblioitems.biblionumber=biblio.biblionumber
LEFT JOIN items ON items.biblionumber=biblio.biblionumber
- WHERE dateaccessioned BETWEEN ? AND ?
+ WHERE dateaccessioned BETWEEN ? AND ?
|;
-
+
my (@params,@loopcriteria);
-
+
push @params, $datebegin->output("iso");
push @params, $dateend->output("iso");
$str .= "AND items.itype IN (?".( ',?' x scalar @$itemtypes - 1 ).") ";
}else{
$str .= "AND biblioitems.itemtype IN (?".( ',?' x scalar @$itemtypes - 1 ).") ";
- }
+ }
push @params, @$itemtypes;
}
-
+
if ($criteria =~/itemtype/){
if(C4::Context->preference("item-level_itypes")){
$str .= "AND items.itype=? ";
}else{
$str .= "AND biblioitems.itemtype=? ";
}
-
+
if(scalar(@$itemtypes) == 0){
my $itypes = GetItemTypes();
for my $key (keys %$itypes){
push @$itemtypes, $key;
}
}
-
+
@loopcriteria= @$itemtypes;
}elsif ($criteria=~/itemcallnumber/){
- $str .= "AND (items.itemcallnumber LIKE CONCAT(?,'%')
+ $str .= "AND (items.itemcallnumber LIKE CONCAT(?,'%')
OR items.itemcallnumber is NULL
OR items.itemcallnumber = '')";
- @loopcriteria = ("AA".."ZZ", "") unless (scalar(@loopcriteria)>0);
+ @loopcriteria = ("AA".."ZZ", "") unless (scalar(@loopcriteria)>0);
}else {
$str .= "AND biblio.title LIKE CONCAT(?,'%') ";
- @loopcriteria = ("A".."z") unless (scalar(@loopcriteria)>0);
+ @loopcriteria = ("A".."z") unless (scalar(@loopcriteria)>0);
}
-
+
if ($orderby =~ /date_desc/){
$str.=" ORDER BY dateaccessioned DESC";
} else {
$str.=" ORDER BY title";
}
-
+
my $qdataacquisitions=$dbh->prepare($str);
-
+
my @loopacquisitions;
foreach my $value(@loopcriteria){
push @params,$value;
my %cell;
$cell{"title"}=$value;
$cell{"titlecode"}=$value;
-
+
eval{$qdataacquisitions->execute(@params);};
-
+
if ($@){ warn "recentacquisitions Error :$@";}
else {
my @loopdata;
# depending of operand, intersect, union or exclude both lists
# to get a result list
if ( $operator eq ' and ' ) {
- return NZoperatorAND($leftresult,$rightresult);
+ return NZoperatorAND($leftresult,$rightresult);
}
elsif ( $operator eq ' or ' ) {
return $leftresult . $rightresult;
}
elsif ( $operator eq ' not ' ) {
- return NZoperatorNOT($leftresult,$rightresult);
+ return NZoperatorNOT($leftresult,$rightresult);
}
- }
+ }
else {
# this error is impossible, because of the regexp that isolate the operand, but just in case...
return $leftresult;
- }
+ }
}
warn "string :" . $string if $DEBUG;
my $left = "";
# depending of operand, intersect, union or exclude both lists
# to get a result list
if ( $operator eq ' and ' ) {
- warn "NZAND";
return NZoperatorAND($leftresult,$rightresult);
}
elsif ( $operator eq ' or ' ) {
$left = 'subject' if $left =~ '^su$';
$left = 'koha-Auth-Number' if $left =~ '^an$';
$left = 'keyword' if $left =~ '^kw$';
- $left = 'itemtype' if $left =~ '^mc$'; # Fix for Bug 2599 - Search limits not working for NoZebra
+ $left = 'itemtype' if $left =~ '^mc$'; # Fix for Bug 2599 - Search limits not working for NoZebra
warn "handling leaf... left:$left operator:$operator right:$right" if $DEBUG;
my $dbh = C4::Context->dbh;
if ( $operator && $left ne 'keyword' ) {
sub NZoperatorAND{
my ($rightresult, $leftresult)=@_;
-
+
my @leftresult = split /;/, $leftresult;
warn " @leftresult / $rightresult \n" if $DEBUG;
-
+
# my @rightresult = split /;/,$leftresult;
my $finalresult;
warn "NZAND DONE : $finalresult \n" if $DEBUG;
return $finalresult;
}
-
+
sub NZoperatorOR{
my ($rightresult, $leftresult)=@_;
return $rightresult.$leftresult;
sub NZoperatorNOT{
my ($leftresult, $rightresult)=@_;
-
+
my @leftresult = split /;/, $leftresult;
# my @rightresult = split /;/,$leftresult;
=head2 NZorder
$finalresult = NZorder($biblionumbers, $ordering,$results_per_page,$offset);
-
+
TODO :: Description
=cut
=item C<BUGS>
* I had to add this to Search.pm (instead of the logical Biblio.pm) because of a circular dependency (this sub uses SimpleSearch, and Search.pm uses Biblio.pm)
+
=back
=cut
my $dbh=C4::Context->dbh;
my $query=$dbh->prepare(qq|
SELECT authtypecode,tagfield
-FROM marc_subfield_structure
-WHERE frameworkcode=?
+FROM marc_subfield_structure
+WHERE frameworkcode=?
AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
# SELECT authtypecode,tagfield
-# FROM marc_subfield_structure
-# WHERE frameworkcode=?
+# FROM marc_subfield_structure
+# WHERE frameworkcode=?
# AND (authtypecode IS NOT NULL OR authtypecode<>\"\")|);
$query->execute($frameworkcode);
my ($countcreated,$countlinked);
my $query='at='.$data->{authtypecode}.' ';
map {$query.= ' and he,ext="'.$_->[1].'"' if ($_->[0]=~/[A-z]/)} $field->subfields();
my ($error, $results, $total_hits)=SimpleSearch( $query, undef, undef, [ "authorityserver" ] );
- # there is only 1 result
+ # there is only 1 result
if ( $error ) {
warn "BIBLIOADDSAUTHORITIES: $error";
return (0,0) ;
$field->add_subfields('9'=>$marcrecord->field('001')->data);
$countlinked++;
} elsif (scalar(@$results)>1) {
- #More than One result
+ #More than One result
#This can comes out of a lack of a subfield.
# my $marcrecord = MARC::File::USMARC::decode($results->[0]);
# $record->field($data->{tagfield})->add_subfields('9'=>$marcrecord->field('001')->data);
$countlinked++;
} else {
#There are no results, build authority record, add it to Authorities, get authid and add it to 9
- ###NOTICE : This is only valid if a subfield is linked to one and only one authtypecode
+ ###NOTICE : This is only valid if a subfield is linked to one and only one authtypecode
###NOTICE : This can be a problem. We should also look into other types and rejected forms.
- my $authtypedata=C4::AuthoritiesMarc->GetAuthType($data->{authtypecode});
+ my $authtypedata=C4::AuthoritiesMarc::GetAuthType($data->{authtypecode});
next unless $authtypedata;
my $marcrecordauth=MARC::Record->new();
my $authfield=MARC::Field->new($authtypedata->{auth_tag_to_report},'','',"a"=>"".$field->subfield('a'));
if ($fieldname=~/\./){
my ($table,$column)=split /\./, $fieldname;
my $dbh = C4::Context->dbh;
- warn "select DISTINCT($column) as value, count(*) as cnt from $table group by lib order by $column ";
+ warn "select DISTINCT($column) as value, count(*) as cnt from $table group by lib order by $column " if $DEBUG;
my $sth = $dbh->prepare("select DISTINCT($column) as value, count(*) as cnt from $table ".($string?" where $column like \"$string%\"":"")."group by value order by $column ");
$sth->execute;
my $elements=$sth->fetchall_arrayref({});
=head1 AUTHOR
-Koha Developement team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
=cut