Bug 29437: Search reservoir for term as title, author, or variations of ISBN
authorNick Clemens <nick@bywatersolutions.com>
Mon, 8 Nov 2021 19:24:36 +0000 (19:24 +0000)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Fri, 19 Nov 2021 14:23:27 +0000 (15:23 +0100)
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

WNC amended to fix spelling

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
AMENDED: Useless call of ISBNs (plural) when you only pass one parameter.

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
C4/Breeding.pm
cataloguing/addbooks.pl

index 75f47c6..2550ec2 100644 (file)
@@ -22,7 +22,7 @@ use strict;
 use warnings;
 
 use C4::Biblio;
-use C4::Koha qw( GetNormalizedISBN );
+use C4::Koha qw( GetVariationsOfISBN );
 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 will 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<import_records> and
@@ -67,34 +66,25 @@ C<import_biblios> 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::GetVariationsOfISBN($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) {
index 079d477..8302141 100755 (executable)
@@ -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) {