LP#1386347: Clear hold-copy-map efficiently
authorMike Rylander <mrylander@gmail.com>
Wed, 29 Oct 2014 14:37:29 +0000 (10:37 -0400)
committerBill Erickson <berickxx@gmail.com>
Mon, 12 Jan 2015 16:56:28 +0000 (11:56 -0500)
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 <mrylander@gmail.com>
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
Open-ILS/src/sql/Pg/090.schema.action.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.clear_hold_copy_map.sql [new file with mode: 0644]

index 307d962..549e27e 100644 (file)
@@ -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]);
 }
 
index b308086..1ec6066 100644 (file)
@@ -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);
         }
 
index ad78f50..d56c340 100644 (file)
@@ -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 (file)
index 0000000..ee0191d
--- /dev/null
@@ -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;
+