From 24a70a505a546c1b4fe71d6e0abde6b7e5eecdce Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Tue, 14 Jun 2016 18:13:49 -0400 Subject: [PATCH] hold targeter reify experiment Signed-off-by: Bill Erickson --- .../src/perlmods/lib/OpenILS/Utils/HoldTargeter.pm | 58 ++++++++-------------- .../support-scripts/test-scripts/hold_targeter.pl | 2 +- 2 files changed, 23 insertions(+), 37 deletions(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Utils/HoldTargeter.pm b/Open-ILS/src/perlmods/lib/OpenILS/Utils/HoldTargeter.pm index b67dce0a88..ca1b6fed07 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Utils/HoldTargeter.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Utils/HoldTargeter.pm @@ -12,6 +12,7 @@ use OpenILS::Utils::CStoreEditor qw/:funcs/; our $U = "OpenILS::Application::AppUtils"; our $dt_parser = DateTime::Format::ISO8601->new; +# See target() for runtime arguments. sub new { my ($class, %args) = @_; my $self = { @@ -285,13 +286,15 @@ sub copy_prox_map { return $self->{copy_prox_map}; } +# Captures the exit message, rolls back the cstore transaction/connection, +# and returns false. sub exit_targeter { my ($self, $msg, $is_error) = @_; $self->message($msg); - # Force a rollback when exiting. + # Force a rollback when exiting on error. # This is a no-op if a commit or rollback have already occurred. - $self->editor->rollback; + $self->editor->rollback if $is_error; my $log = "targeter: exiting hold targeter on ".$self->hold_id." : $msg"; @@ -323,11 +326,8 @@ sub handle_expired_hold { $hold->cancel_time('now'); $hold->cancel_cause(1); # == un-targeted expiration - if (!$self->editor->update_action_hold_request($hold)) { - my $evt = $self->editor->die_event; - return $self->exit_targeter( - "Error canceling hold: ".$evt->{textcode}, 1); - } + $self->editor->update_action_hold_request($hold) + or return $self->exit_targeter("Error canceling hold", 1); $self->editor->commit; @@ -341,6 +341,7 @@ sub handle_expired_hold { return $self->exit_targeter("Hold is expired"); } +# Find potential copies for hold mapping and targeting. sub get_hold_copies { my $self = shift; my $e = $self->editor; @@ -467,7 +468,7 @@ sub get_hold_copies { } }; - } else { + } else { # Metarecord hold $query->{from}->{acp}->{acn} = { field => 'id', @@ -518,7 +519,7 @@ sub update_copy_maps { # copy maps for this hold at the same time. return 1 if $resp && @$resp; - return $self->exit_targeter("Error creating hold copy maps"); + return $self->exit_targeter("Error creating hold copy maps", 1); } # Returns a map of proximity values to arrays of copy hashes. @@ -667,11 +668,8 @@ sub handle_no_copies { $hold->clear_current_copy; $hold->prev_check_time('now'); - if (!$self->editor->update_action_hold_request($hold)) { - my $evt = $self->editor->die_event; - return $self->exit_targeter( - "Error updating hold request: ".$evt->{textcode}, 1); - } + $self->editor->update_action_hold_request($hold) + or return $self->exit_targeter("Error updating hold request", 1); $self->editor->commit; return $self->exit_targeter("Hold has no targetable copies"); @@ -801,11 +799,8 @@ sub handle_exceeds_target_loops { $hold->cancel_time('now'); $hold->cancel_cause(1); # = un-targeted expiration - if (!$e->update_action_hold_request($hold)) { - my $evt = $e->die_event; - return $self->exit_targeter( - "Error updating hold request: ".$evt->{textcode}, 1); - } + $e->update_action_hold_request($hold) + or return $self->exit_targeter("Error updating hold request", 1); $e->commit; @@ -906,11 +901,8 @@ sub apply_copy_target { $hold->current_copy($copy->{id}); $hold->prev_check_time('now'); - if (!$e->update_action_hold_request($hold)) { - my $evt = $e->die_event; - return $self->exit_targeter( - "Error updating hold request: ".$evt->{textcode}, 1); - } + $e->update_action_hold_request($hold) + or return $self->exit_targeter("Error updating hold request", 1); $e->commit; $self->{success} = 1; @@ -941,11 +933,8 @@ sub log_unfulfilled_hold { $unful->circ_lib($circ_lib); $unful->current_copy($prev_id); - if (!$e->create_action_unfulfilled_hold_list($unful)) { - my $evt = $e->die_event; - return $self->exit_targeter( - "Error creating unfulfilled_hold_list: " . $e->{textcode}, 1); - } + $e->create_action_unfulfilled_hold_list($unful) or + return $self->exit_targeter("Error creating unfulfilled_hold_list", 1); return 1; } @@ -1022,12 +1011,9 @@ sub process_recalls { # Copy updated fields into circ object. $circ->$_($update_fields{$_}) for keys %update_fields; - if (!$e->update_action_circulation($circ)) { - my $evt = $e->die_event; - return $self->exit_targeter( - "Error updating circulation object in process_recalls: ". - $evt->{textcode}); - } + $e->update_action_circulation($circ) + or return $self->exit_targeter( + "Error updating circulation object in process_recalls", 1); # Create trigger event for notifying current user my $ses = OpenSRF::AppSession->create('open-ils.trigger'); @@ -1051,7 +1037,7 @@ sub target { my $hold = $e->retrieve_action_hold_request($hold_id) or return $self->exit_targeter("No hold found", 1); - return $self->exit_targeter("Hold is not eligible for targeting") + return $self->exit_targeter("Hold is not eligible for targeting", 1) if $hold->capture_time || $hold->cancel_time || $hold->fulfillment_time || diff --git a/Open-ILS/src/support-scripts/test-scripts/hold_targeter.pl b/Open-ILS/src/support-scripts/test-scripts/hold_targeter.pl index e4b8dab81b..2d249a1bd4 100755 --- a/Open-ILS/src/support-scripts/test-scripts/hold_targeter.pl +++ b/Open-ILS/src/support-scripts/test-scripts/hold_targeter.pl @@ -19,7 +19,7 @@ my $responses = $targeter->target( #hold => 80, #retarget_interval => '12h', #newest_first => 1, - target_all => 1 + #target_all => 1 ); print Dumper($responses); -- 2.11.0