From 13ca7ffe3b65da038031b9d68015fd78d90db31c Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Wed, 29 Oct 2014 10:37:29 -0400 Subject: [PATCH] LP#1386347: Clear hold-copy-map efficiently When capturing or canceling a hold, we can clear the hold-copy-map with a trigger, saving the time of the user, and making the business logic simpler. LP#1386347 copy map trigger wants a RETURN Signed-off-by: Mike Rylander Signed-off-by: Bill Erickson --- .../lib/OpenILS/Application/Circ/Circulate.pm | 1 - .../lib/OpenILS/Application/Circ/Holds.pm | 17 ---------------- Open-ILS/src/sql/Pg/090.schema.action.sql | 16 +++++++++++++++ .../XXXX.schema.clear_hold_copy_map.sql | 20 +++++++++++++++++++ 4 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.clear_hold_copy_map.sql 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 307d962dbf..549e27e719 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..1ec6066471 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,20 +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, ' . 'the requestor must have UPDATE_HOLDS permissions. ' . @@ -3639,7 +3623,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..d56c34064d 100644 --- a/Open-ILS/src/sql/Pg/090.schema.action.sql +++ b/Open-ILS/src/sql/Pg/090.schema.action.sql @@ -404,6 +404,22 @@ ALTER TABLE action.hold_request ADD CONSTRAINT sms_check CHECK ( ); +CREATE OR REPLACE FUNCTION action.hold_request_clear_map () RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM action.hold_copy_map WHERE hold = NEW.id; + RETURN NEW; +END; +$$ LANGUAGE PLPGSQL; + +CREATE TRIGGER hold_request_clear_map_tgr + AFTER UPDATE ON action.hold_request + FOR EACH ROW + WHEN ( + (NEW.cancel_time IS NOT NULL AND OLD.cancel_time IS NULL) + OR (NEW.capture_time IS NOT NULL AND OLD.capture_time IS NULL) + ) + EXECUTE PROCEDURE action.hold_request_clear_map(); + CREATE INDEX hold_request_target_idx ON action.hold_request (target); CREATE INDEX hold_request_usr_idx ON action.hold_request (usr); CREATE INDEX hold_request_pickup_lib_idx ON action.hold_request (pickup_lib); diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.clear_hold_copy_map.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.clear_hold_copy_map.sql new file mode 100644 index 0000000000..ee0191df66 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.clear_hold_copy_map.sql @@ -0,0 +1,20 @@ +BEGIN; + +CREATE OR REPLACE FUNCTION action.hold_request_clear_map () RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM action.hold_copy_map WHERE hold = NEW.id; + RETURN NEW; +END; +$$ LANGUAGE PLPGSQL; + +CREATE TRIGGER hold_request_clear_map_tgr + AFTER UPDATE ON action.hold_request + FOR EACH ROW + WHEN ( + (NEW.cancel_time IS NOT NULL AND OLD.cancel_time IS NULL) + OR (NEW.capture_time IS NOT NULL AND OLD.capture_time IS NULL) + ) + EXECUTE PROCEDURE action.hold_request_clear_map(); + +COMMIT; + -- 2.43.2