use Business::ISBN;
use MARC::Record;
use MARC::Field;
-use utf8;
+use Encode qw( decode is_utf8 );
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
# set the version for version checking
my $rs = shift;
my $sep = shift;
- my $internal_sep = '<*>';
+ my $internal_sep = '<*>';
+ my $facetMaxCount = C4::Context->preference('FacetMaxCount') // 20;
return if ( ! defined $facet_idx || ! defined $rs );
# zebra's facet element, untokenized index
- my $facet_element = 'zebra::facet::' . $facet_idx . ':0:100';
+ my $facet_element = 'zebra::facet::' . $facet_idx . ':0:' . $facetMaxCount;
# configure zebra results for retrieving the desired facet
$rs->option( elementSetName => $facet_element );
# get the facet record from result set
if ( @limits ) {
$q .= ' and '.join(' and ', @limits);
}
- return ( undef, $q, $q, "q=ccl=".uri_escape($q), $q, '', '', '', '', 'ccl' );
+ return ( undef, $q, $q, "q=ccl=".uri_escape_utf8($q), $q, '', '', '', '', 'ccl' );
}
if ( $query =~ /^cql=/ ) {
- return ( undef, $', $', "q=cql=".uri_escape($'), $', '', '', '', '', 'cql' );
+ return ( undef, $', $', "q=cql=".uri_escape_utf8($'), $', '', '', '', '', 'cql' );
}
if ( $query =~ /^pqf=/ ) {
if ($query_desc) {
- $query_cgi = "q=".uri_escape($query_desc);
+ $query_cgi = "q=".uri_escape_utf8($query_desc);
} else {
$query_desc = $';
- $query_cgi = "q=pqf=".uri_escape($');
+ $query_cgi = "q=pqf=".uri_escape_utf8($');
}
return ( undef, $', $', $query_cgi, $query_desc, '', '', '', '', 'pqf' );
}
my $index = $indexes[$i];
# Add index-specific attributes
+
+ #Afaik, this 'yr' condition will only ever be met in the staff client advanced search
+ #for "Publication date", since typing 'yr:YYYY' into the search box produces a CCL query,
+ #which is processed higher up in this sub. Other than that, year searches are typically
+ #handled as limits which are not processed her either.
+
# Date of Publication
- if ( $index eq 'yr' ) {
- $index .= ",st-numeric";
- $indexes_set++;
+ if ( $index =~ /yr/ ) {
+ #weight_fields/relevance search causes errors with date ranges
+ #In the case of YYYY-, it will only return records with a 'yr' of YYYY (not the range)
+ #In the case of YYYY-YYYY, it will return no results
$stemming = $auto_truncation = $weight_fields = $fuzzy_enabled = $remove_stopwords = 0;
}
# Date of Acquisition
- elsif ( $index eq 'acqdate' ) {
- $index .= ",st-date-normalized";
- $indexes_set++;
+ elsif ( $index =~ /acqdate/ ) {
+ #stemming and auto_truncation would have zero impact since it already is YYYY-MM-DD format
+ #Weight_fields probably SHOULD be turned OFF, otherwise you'll get records floating to the
+ #top of the results just because they have lots of item records matching that date.
+ #Fuzzy actually only applies during _build_weighted_query, and is reset there anyway, so
+ #irrelevant here
+ #remove_stopwords doesn't function anymore so is irrelevant
$stemming = $auto_truncation = $weight_fields = $fuzzy_enabled = $remove_stopwords = 0;
}
# ISBN,ISSN,Standard Number, don't need special treatment
$group_OR_limits{$k} .= " or " if $group_OR_limits{$k};
$limit_desc .= " or " if $group_OR_limits{$k};
$group_OR_limits{$k} .= "$this_limit";
- $limit_cgi .= "&limit=" . uri_escape($this_limit);
+ $limit_cgi .= "&limit=" . uri_escape_utf8($this_limit);
$limit_desc .= " $this_limit";
}
else {
$limit .= " and " if $limit || $query;
$limit .= "$this_limit";
- $limit_cgi .= "&limit=" . uri_escape($this_limit);
+ $limit_cgi .= "&limit=" . uri_escape_utf8($this_limit);
if ($this_limit =~ /^branch:(.+)/) {
my $branchcode = $1;
my $branchname = GetBranchName($branchcode);
# 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;
+ #NOTE: We use several several different regexps here as you can't have variable length lookback assertions
$query =~ s/(?<=(ti|au|pb|su|an|kw|mc|nb|ns)):/=/g;
$query =~ s/(?<=(wrdl)):/=/g;
$query =~ s/(?<=(trn|phr)):/=/g;
+ $query =~ s/(?<=(st-numeric)):/=/g;
+ $query =~ s/(?<=(st-year)):/=/g;
+ $query =~ s/(?<=(st-date-normalized)):/=/g;
$limit =~ s/:/=/g;
for ( $query, $query_desc, $limit, $limit_desc ) {
s/ +/ /g; # remove extra spaces
#e.g. " and kw,wrdl:test"
$params->{query} .= $operator . $operand;
- $params->{query_cgi} .= "&op=".uri_escape($operator) if $operator;
- $params->{query_cgi} .= "&idx=".uri_escape($params->{index}) if $params->{index};
- $params->{query_cgi} .= "&q=".uri_escape($params->{original_operand}) if $params->{original_operand};
+ $params->{query_cgi} .= "&op=".uri_escape_utf8($operator) if $operator;
+ $params->{query_cgi} .= "&idx=".uri_escape_utf8($params->{index}) if $params->{index};
+ $params->{query_cgi} .= "&q=".uri_escape_utf8($params->{original_operand}) if $params->{original_operand};
#e.g. " and kw,wrdl: test"
$params->{query_desc} .= $operator . $params->{index_plus} . " " . $params->{original_operand};
my @repl = $marcrecord->field($1)->subfield($2);
my $subfieldvalue = $repl[$i];
- if (! utf8::is_utf8($subfieldvalue)) {
- utf8::decode($subfieldvalue);
+ if (! Encode::is_utf8($subfieldvalue)) {
+ $subfieldvalue = Encode::decode('UTF-8', $subfieldvalue);
}
$newline =~ s/\[$tag\]/$subfieldvalue/g;
my $raw_data = shift;
# Set the default indexing modes
my $index_mode = ( $server eq 'biblioserver' )
- ? C4::Context->config('zebra_bib_index_mode') // 'grs1'
+ ? C4::Context->config('zebra_bib_index_mode') // 'dom'
: C4::Context->config('zebra_auth_index_mode') // 'dom';
my $marc_record = eval {