LP#1386347 auto clear hold copy maps user/berick/lp1386347-delete-hold-copy-maps-tgr
authorBill Erickson <berickxx@gmail.com>
Mon, 27 Oct 2014 22:05:12 +0000 (18:05 -0400)
committerBill Erickson <berickxx@gmail.com>
Wed, 29 Oct 2014 14:27:46 +0000 (10:27 -0400)
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 <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.hold_copy_map_delete.sql [new file with mode: 0644]

index f37c0fb..7aa7d12 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..4baa380 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,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);
         }
 
index ad78f50..8da1848 100644 (file)
@@ -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 (file)
index 0000000..dbae4e8
--- /dev/null
@@ -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;
+*/