$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'};
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
# get rid of any that don't meet the required checks
$matches = {
map {
- _passes_required_checks( $source_record, $_, $self->{'required_checks'} )
+ _passes_required_checks( $source_record, $matches->{$_}->{'record'}, $self->{'required_checks'} )
? ( $_ => $matches->{$_} )
: ()
} keys %$matches
}
sub _passes_required_checks {
- my ($source_record, $target_blob, $matchchecks) = @_;
- my $target_record = MARC::Record->new_from_usmarc($target_blob); # FIXME -- need to avoid parsing record twice
+ my ($source_record, $target_record, $matchchecks) = @_;
# no checks supplied == automatic pass
return 1 if $#{ $matchchecks } == -1;