use Modern::Perl;
-use MARC::Record;
use Koha::SearchEngine;
use Koha::SearchEngine::Search;
use Koha::SearchEngine::QueryBuilder;
-use Koha::Util::Normalize qw/legacy_default remove_spaces upper_case lower_case ISBN/;
+use Koha::Util::Normalize qw(
+ ISBN
+ legacy_default
+ lower_case
+ remove_spaces
+ upper_case
+);
=head1 NAME
$sth->execute($id);
my $row = $sth->fetchrow_hashref;
$sth->finish();
- return undef unless defined $row;
+ return unless defined $row;
my $self = {};
$self->{'id'} = $row->{'matcher_id'};
foreach my $component (@{ $matchpoint->{'components'} }) {
$seqnum++;
$sth = $dbh->prepare_cached("INSERT INTO matchpoint_components
- (matchpoint_id, sequence, tag, subfields, offset, length)
+ (matchpoint_id, sequence, tag, subfields, `offset`, length)
VALUES (?, ?, ?, ?, ?, ?)");
$sth->bind_param(1, $matchpoint_id);
$sth->bind_param(2, $seqnum);
my $matches = {};
- my $QParser;
- $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser'));
foreach my $matchpoint ( @{ $self->{'matchpoints'} } ) {
my @source_keys = _get_match_keys( $source_record, $matchpoint );
next if scalar(@source_keys) == 0;
- # FIXME - because of a bug in QueryParser, an expression ofthe
- # format 'isbn:"isbn1" || isbn:"isbn2" || isbn"isbn3"...'
- # does not get parsed correctly, so we will not
- # do AggressiveMatchOnISBN if UseQueryParser is on
@source_keys = C4::Koha::GetVariationsOfISBNs(@source_keys)
if ( $matchpoint->{index} =~ /^isbn$/i
- && C4::Context->preference('AggressiveMatchOnISBN') )
- && !C4::Context->preference('UseQueryParser');
+ && C4::Context->preference('AggressiveMatchOnISBN') );
@source_keys = C4::Koha::GetVariationsOfISSNs(@source_keys)
if ( $matchpoint->{index} =~ /^issn$/i
- && C4::Context->preference('AggressiveMatchOnISSN') )
- && !C4::Context->preference('UseQueryParser');
+ && C4::Context->preference('AggressiveMatchOnISSN') );
# build query
my $query;
my $total_hits;
if ( $self->{'record_type'} eq 'biblio' ) {
- #NOTE: The QueryParser can't handle the CCL syntax of 'qualifier','qualifier', so fallback to non-QueryParser.
- #NOTE: You can see this in C4::Search::SimpleSearch() as well in a different way.
- if ($QParser && $matchpoint->{'index'} !~ m/\w,\w/) {
- $query = join( " || ",
- map { "$matchpoint->{'index'}:$_" } @source_keys );
- }
- else {
- my $phr = ( C4::Context->preference('AggressiveMatchOnISBN') || C4::Context->preference('AggressiveMatchOnISSN') ) ? ',phr' : q{};
- $query = join( " OR ",
- map { "$matchpoint->{'index'}$phr=\"$_\"" } @source_keys );
- #NOTE: double-quote the values so you don't get a "Embedded truncation not supported" error when a term has a ? in it.
- }
+ my $phr = ( C4::Context->preference('AggressiveMatchOnISBN') || C4::Context->preference('AggressiveMatchOnISSN') ) ? ',phr' : q{};
+ $query = join( " OR ",
+ map { "$matchpoint->{'index'}$phr=\"$_\"" } @source_keys );
+ #NOTE: double-quote the values so you don't get a "Embedded truncation not supported" error when a term has a ? in it.
# Use state variables to avoid recreating the objects every time.
# With Elasticsearch this also avoids creating a massive amount of
for (my $i = 0; $i <= $#{ $matchpoint->{'components'} }; $i++) {
my $component = $matchpoint->{'components'}->[$i];
my $j = -1;
- FIELD: foreach my $field ($source_record->field($component->{'tag'})) {
+
+ my @fields = ();
+ my $tag = $component->{'tag'};
+ if ($tag && $tag eq 'LDR'){
+ $fields[0] = $source_record->leader();
+ }
+ else {
+ @fields = $source_record->field($tag);
+ }
+
+ FIELD: foreach my $field (@fields) {
$j++;
last FIELD if $j > 0 and $check_only_first_repeat;
last FIELD if $i > 0 and $j > $#keys;
my $string;
- if ( $field->is_control_field() ) {
+ if ( ! ref $field ){
+ $string = "$field";
+ }
+ elsif ( $field->is_control_field() ) {
$string = $field->data();
- } else {
+ } elsif ( defined $component->{subfields} && keys %{$component->{subfields}} ){
$string = $field->as_string(
join('', keys %{ $component->{ subfields } }), ' ' # ' ' as separator
);
+ } else {
+ $string = $field->as_string();
}
if ($component->{'length'}>0) {