From 9ccb33e6b6f06435d48704203ed6dced85c3c16e Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Mon, 8 Nov 2021 19:24:36 +0000 Subject: [PATCH] Bug 29437: Search reservoir for term as title, author, or variations of ISBN The code in the script and the module attempt to determine whether a term is an isbn, or not. Rather than try to do this, we can simply search it on the three fields: isbn, title, author Additionally, we should search as any of the ISBN variations to broaden our matches Note: Curently only an ISBN 10 is stored in import biblios, so for an ISBN13 that doesn't convert the value will be blank - this is another bug To test: 1 - Perform a cataloging search for a valid ISBN 13 with no ISBN10 counterpart: 9798200834976 2 - 500 error 3 - Apply patch 4 - Repeat, no results 5 - Import some records 6 - Search by title/author/isbn 7 - Confirm searching works as expected --- C4/Breeding.pm | 30 ++++++++++-------------------- cataloguing/addbooks.pl | 9 +-------- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/C4/Breeding.pm b/C4/Breeding.pm index 75f47c668a..cdd24b3c49 100644 --- a/C4/Breeding.pm +++ b/C4/Breeding.pm @@ -22,7 +22,7 @@ use strict; use warnings; use C4::Biblio; -use C4::Koha qw( GetNormalizedISBN ); +use C4::Koha qw( GetVariationsOfISBNs ); use C4::Charset qw( MarcToUTF8Record SetUTF8Flag ); use MARC::File::USMARC; use MARC::Field; @@ -56,9 +56,8 @@ cataloguing reservoir features. =head2 BreedingSearch -($count, @results) = &BreedingSearch($title,$isbn); -C<$title> contains the title, -C<$isbn> contains isbn or issn, +($count, @results) = &BreedingSearch($term); +C<$term> contains the term to search, it wil be searched as title,author, or isbn C<$count> is the number of items in C<@results>. C<@results> is an array of references-to-hash; the keys are the items from the C and @@ -67,34 +66,25 @@ C tables of the Koha database. =cut sub BreedingSearch { - my ($search,$isbn) = @_; + my ($term) = @_; my $dbh = C4::Context->dbh; my $count = 0; my ($query,@bind); my $sth; my @results; + my $authortitle = $term; + $authortitle =~ s/(\s+)/\%/g; #Replace spaces with wildcard + $authortitle = "%" . $authortitle . "%"; #Add wildcard to start and end of string # normalise ISBN like at import - $isbn = C4::Koha::GetNormalizedISBN($isbn); + my @isbns = C4::Koha::GetVariationsOfISBNs($term); $query = "SELECT import_record_id, file_name, isbn, title, author FROM import_biblios JOIN import_records USING (import_record_id) JOIN import_batches USING (import_batch_id) - WHERE "; - @bind=(); - if (defined($search) && length($search)>0) { - $search =~ s/(\s+)/\%/g; - $query .= "title like ? OR author like ?"; - push(@bind,"%$search%", "%$search%"); - } - if ($#bind!=-1 && defined($isbn) && length($isbn)>0) { - $query .= " and "; - } - if (defined($isbn) && length($isbn)>0) { - $query .= "isbn like ?"; - push(@bind,"$isbn%"); - } + WHERE title LIKE ? OR author LIKE ? OR isbn IN (" . join(',',('?') x @isbns) . ")"; + @bind=( $authortitle, $authortitle, @isbns ); $sth = $dbh->prepare($query); $sth->execute(@bind); while (my $data = $sth->fetchrow_hashref) { diff --git a/cataloguing/addbooks.pl b/cataloguing/addbooks.pl index 079d477b15..8302141431 100755 --- a/cataloguing/addbooks.pl +++ b/cataloguing/addbooks.pl @@ -106,14 +106,7 @@ if ($query) { my $countbr = 0; my @resultsbr; if ($query) { - my ( $title, $isbn ); - my $isbn_valid = Business::ISBN->new($query); - if ( $isbn_valid && $isbn_valid->is_valid() ) { - $isbn = $query; - } else { - $title = $query; - } - ( $countbr, @resultsbr ) = BreedingSearch( $title, $isbn ); + ( $countbr, @resultsbr ) = BreedingSearch( $query ); } my $breeding_loop = []; for my $resultsbr (@resultsbr) { -- 2.20.1