Stop targeter crash on empty metarecord with holds
authorThomas Berezansky <tsbere@mvlc.org>
Mon, 30 Jan 2012 18:34:53 +0000 (13:34 -0500)
committerMike Rylander <mrylander@gmail.com>
Tue, 21 Feb 2012 15:46:23 +0000 (10:46 -0500)
By checking for 1 or more records before looking them up.

Signed-off-by: Thomas Berezansky <tsbere@mvlc.org>
Signed-off-by: Ben Shum <bshum@biblio.org>
Signed-off-by: Mike Rylander <mrylander@gmail.com>

Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm

index 2beaae5..f6a4515 100644 (file)
@@ -1151,30 +1151,33 @@ sub new_hold_copy_targeter {
 
                        # find all the potential copies
                        if ($hold->hold_type eq 'M') {
-                               for my $r ( map
-                                               {$_->record}
-                                               metabib::record_descriptor
-                                                       ->search(
-                                                               record => [
-                                                                       map {
-                                                                               isTrue($_->deleted) ?  () : ($_->id)
-                                                                       } metabib::metarecord->retrieve($hold->target)->source_records
-                                                               ],
-                                                               ( $types   ? (item_type => [split '', $types])   : () ),
-                                                               ( $formats ? (item_form => [split '', $formats]) : () ),
-                                                               ( $lang    ? (item_lang => $lang)                                : () ),
-                                                       )
-                               ) {
-                                       my ($rtree) = $self
-                                               ->method_lookup( 'open-ils.storage.biblio.record_entry.ranged_tree')
-                                               ->run( $r->id, $hold->selection_ou, $hold->selection_depth );
-
-                                       for my $cn ( @{ $rtree->call_numbers } ) {
-                                               push @$all_copies,
-                                                       asset::copy->search_where(
-                                                               { id => [map {$_->id} @{ $cn->copies }],
-                                                                 deleted => 'f' }
-                                                       ) if ($cn && @{ $cn->copies });
+                               my $records = [
+                                       map {
+                                               isTrue($_->deleted) ?  () : ($_->id)
+                                       } metabib::metarecord->retrieve($hold->target)->source_records
+                               ];
+                if(@$records > 0) {
+                                       for my $r ( map
+                                                       {$_->record}
+                                                       metabib::record_descriptor
+                                                               ->search(
+                                                                       record => $records,
+                                                                       ( $types   ? (item_type => [split '', $types])   : () ),
+                                                                       ( $formats ? (item_form => [split '', $formats]) : () ),
+                                                                       ( $lang    ? (item_lang => $lang)                                : () ),
+                                                               )
+                                       ) {
+                                               my ($rtree) = $self
+                                                       ->method_lookup( 'open-ils.storage.biblio.record_entry.ranged_tree')
+                                                       ->run( $r->id, $hold->selection_ou, $hold->selection_depth );
+
+                                               for my $cn ( @{ $rtree->call_numbers } ) {
+                                                       push @$all_copies,
+                                                               asset::copy->search_where(
+                                                                       { id => [map {$_->id} @{ $cn->copies }],
+                                                                         deleted => 'f' }
+                                                               ) if ($cn && @{ $cn->copies });
+                                               }
                                        }
                                }
                        } elsif ($hold->hold_type eq 'T') {