From: Bill Erickson Date: Mon, 27 Oct 2014 22:05:12 +0000 (-0400) Subject: LP#1386347 auto clear hold copy maps X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=117d64bf352da24a4f481b34b682e03aad468328;p=working%2FEvergreen.git LP#1386347 auto clear hold copy maps Delete hold copy map entries via database trigger when a hold is captured, canceled, or set as frozen. The application layer no longer has to perform this step manually. Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm index f37c0fbf44..7aa7d12735 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm @@ -1768,7 +1768,6 @@ sub handle_checkout_holds { return $self->bail_on_events($e->event) unless $e->update_action_hold_request($hold); - $holdcode->delete_hold_copy_maps($e, $hold->id); return $self->fulfilled_holds([$hold->id]); } diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm index b308086c21..4baa380598 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm @@ -826,8 +826,6 @@ sub cancel_hold { $e->update_action_hold_request($hold) or return $e->die_event; - delete_hold_copy_maps($self, $e, $hold->id); - $e->commit; # re-fetch the hold to pick up the real cancel_time (not "now") for A/T @@ -844,19 +842,6 @@ sub cancel_hold { return 1; } -sub delete_hold_copy_maps { - my $class = shift; - my $editor = shift; - my $holdid = shift; - - my $maps = $editor->search_action_hold_copy_map({hold=>$holdid}); - for(@$maps) { - $editor->delete_action_hold_copy_map($_) - or return $editor->event; - } - return undef; -} - my $update_hold_desc = 'The login session is the requestor. ' . 'If the requestor is different from the usr field on the hold, ' . @@ -3639,7 +3624,6 @@ sub clear_shelf_process { $hold->cancel_time('now'); $hold->cancel_cause(2); # Hold Shelf expiration $e->update_action_hold_request($hold) or return $e->die_event; - delete_hold_copy_maps($self, $e, $hold->id) and return $e->die_event; push(@canceled_holds, $hold_id); } diff --git a/Open-ILS/src/sql/Pg/090.schema.action.sql b/Open-ILS/src/sql/Pg/090.schema.action.sql index ad78f50e86..8da1848e5c 100644 --- a/Open-ILS/src/sql/Pg/090.schema.action.sql +++ b/Open-ILS/src/sql/Pg/090.schema.action.sql @@ -454,6 +454,22 @@ CREATE TABLE action.hold_copy_map ( -- CREATE INDEX acm_hold_idx ON action.hold_copy_map (hold); CREATE INDEX acm_copy_idx ON action.hold_copy_map (target_copy); +-- delete hold copy maps when not needed. +CREATE OR REPLACE FUNCTION action.clear_hold_copy_maps() RETURNS TRIGGER AS $f$ +BEGIN + IF NEW.capture_time IS NOT NULL + OR NEW.cancel_time IS NOT NULL + OR NEW.frozen THEN + DELETE FROM action.hold_copy_map WHERE hold = NEW.id; + END IF; + RETURN NEW; +END; +$f$ LANGUAGE PLPGSQL; + +CREATE TRIGGER clear_hold_copy_maps_tgr + AFTER UPDATE ON action.hold_request + FOR EACH ROW EXECUTE PROCEDURE action.clear_hold_copy_maps(); + CREATE TABLE action.transit_copy ( id SERIAL PRIMARY KEY, source_send_time TIMESTAMP WITH TIME ZONE, diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.hold_copy_map_delete.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.hold_copy_map_delete.sql new file mode 100644 index 0000000000..dbae4e83c3 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.hold_copy_map_delete.sql @@ -0,0 +1,40 @@ +BEGIN; + +--SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); + +CREATE OR REPLACE FUNCTION action.clear_hold_copy_maps() RETURNS TRIGGER AS $f$ +BEGIN + IF NEW.capture_time IS NOT NULL + OR NEW.cancel_time IS NOT NULL + OR NEW.frozen THEN + DELETE FROM action.hold_copy_map WHERE hold = NEW.id; + END IF; + RETURN NEW; +END; +$f$ LANGUAGE PLPGSQL; + +CREATE TRIGGER clear_hold_copy_maps_tgr + AFTER UPDATE ON action.hold_request + FOR EACH ROW EXECUTE PROCEDURE action.clear_hold_copy_maps(); + +COMMIT; + +/* +-- simple test of the above. note: this assumes the presence of sample +-- data where the hold targeter has run. +BEGIN; + SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2; + UPDATE action.hold_request SET frozen = TRUE WHERE ID = 2; + SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2; +ROLLBACK; +BEGIN; + SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2; + UPDATE action.hold_request SET capture_time = NOW() WHERE ID = 2; + SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2; +ROLLBACK; +BEGIN; + SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2; + UPDATE action.hold_request SET prev_check_time = NOW() WHERE ID = 2; + SELECT COUNT(*) FROM action.hold_copy_map WHERE hold = 2; +ROLLBACK; +*/