Include foreign copies in the OPAC copy visiblity mat-view
authorMike Rylander <mrylander@gmail.com>
Fri, 25 Mar 2011 18:01:53 +0000 (14:01 -0400)
committerMike Rylander <mrylander@gmail.com>
Fri, 25 Mar 2011 18:01:53 +0000 (14:01 -0400)
Open-ILS/src/sql/Pg/040.schema.asset.sql
Open-ILS/src/sql/Pg/300.schema.staged_search.sql
Open-ILS/src/sql/Pg/999.functions.global.sql

index 6509bca..1539796 100644 (file)
@@ -92,7 +92,8 @@ CREATE INDEX cp_create_date  ON asset.copy (create_date);
 CREATE RULE protect_copy_delete AS ON DELETE TO asset.copy DO INSTEAD UPDATE asset.copy SET deleted = TRUE WHERE OLD.id = asset.copy.id;
 
 CREATE TABLE asset.opac_visible_copies (
-  id        BIGINT primary key, -- copy id
+  id        BIGSERIAL primary key,
+  copy_id   BIGINT, -- copy id
   record    BIGINT,
   circ_lib  INTEGER
 );
@@ -102,6 +103,8 @@ search.query_parser_fts() to speed up OPAC visibility checks on large
 databases.  Contents are maintained by a set of triggers.
 $$;
 CREATE INDEX opac_visible_copies_idx1 on asset.opac_visible_copies (record, circ_lib);
+CREATE INDEX opac_visible_copies_copy_id_idx on asset.opac_visible_copies (copy_id);
+CREATE UNIQUE INDEX opac_visible_copies_once_per_record_idx on asset.opac_visible_copies (copy_id, record);
 
 CREATE OR REPLACE FUNCTION asset.acp_status_changed()
 RETURNS TRIGGER AS $$
index 10cc2e1..3b22752 100644 (file)
@@ -250,7 +250,7 @@ BEGIN
             IF NOT FOUND THEN
                 PERFORM 1
                   FROM  biblio.peer_bib_copy_map pr
-                        JOIN asset.opac_visible_copies cp ON (cp.id = pr.target_copy)
+                        JOIN asset.opac_visible_copies cp ON (cp.copy_id = pr.target_copy)
                   WHERE cp.circ_lib IN ( SELECT * FROM search.explode_array( search_org_list ) )
                         AND pr.peer_record IN ( SELECT * FROM search.explode_array( core_result.records ) )
                   LIMIT 1;
index d621300..f3944f7 100644 (file)
@@ -1128,7 +1128,7 @@ CREATE OR REPLACE FUNCTION asset.refresh_opac_visible_copies_mat_view () RETURNS
 
     TRUNCATE TABLE asset.opac_visible_copies;
 
-    INSERT INTO asset.opac_visible_copies (id, circ_lib, record)
+    INSERT INTO asset.opac_visible_copies (copy_id, circ_lib, record)
     SELECT  cp.id, cp.circ_lib, cn.record
     FROM  asset.copy cp
         JOIN asset.call_number cn ON (cn.id = cp.call_number)
@@ -1143,6 +1143,20 @@ CREATE OR REPLACE FUNCTION asset.refresh_opac_visible_copies_mat_view () RETURNS
         AND cl.opac_visible
         AND cp.opac_visible
         AND a.opac_visible;
+            UNION
+    SELECT  cp.id, cp.circ_lib, pbcm.peer_record AS record
+    FROM  asset.copy cp
+        JOIN biblio.peer_bib_copy_map pbcm ON (pbcm.target_copy = cp.id)
+        JOIN actor.org_unit a ON (cp.circ_lib = a.id)
+        JOIN asset.copy_location cl ON (cp.location = cl.id)
+        JOIN config.copy_status cs ON (cp.status = cs.id)
+    WHERE NOT cp.deleted
+        AND NOT cn.deleted
+        AND NOT b.deleted
+        AND cs.opac_visible
+        AND cl.opac_visible
+        AND cp.opac_visible
+        AND a.opac_visible;
 
 $$ LANGUAGE SQL;
 COMMENT ON FUNCTION asset.refresh_opac_visible_copies_mat_view() IS $$
@@ -1157,8 +1171,9 @@ DECLARE
     do_remove       BOOLEAN := false;
 BEGIN
     add_query := $$
-            INSERT INTO asset.opac_visible_copies (id, circ_lib, record)
-                SELECT  cp.id, cp.circ_lib, cn.record
+            INSERT INTO asset.opac_visible_copies (copy_id, circ_lib, record)
+              SELECT id, circ_lib, record FROM (
+                SELECT  cp.id, cp.circ_lib, cn.record, cn.id AS call_number
                   FROM  asset.copy cp
                         JOIN asset.call_number cn ON (cn.id = cp.call_number)
                         JOIN actor.org_unit a ON (cp.circ_lib = a.id)
@@ -1172,14 +1187,42 @@ BEGIN
                         AND cl.opac_visible
                         AND cp.opac_visible
                         AND a.opac_visible
+                            UNION
+                SELECT  cp.id, cp.circ_lib, pbcm.peer_record AS record, NULL AS call_number
+                  FROM  asset.copy cp
+                        JOIN biblio.peer_bib_copy_map pbcm ON (pbcm.target_copy = cp.id)
+                        JOIN actor.org_unit a ON (cp.circ_lib = a.id)
+                        JOIN asset.copy_location cl ON (cp.location = cl.id)
+                        JOIN config.copy_status cs ON (cp.status = cs.id)
+                  WHERE NOT cp.deleted
+                        AND NOT cn.deleted
+                        AND NOT b.deleted
+                        AND cs.opac_visible
+                        AND cl.opac_visible
+                        AND cp.opac_visible
+                        AND a.opac_visible
+                    ) AS x 
+
     $$;
  
-    remove_query := $$ DELETE FROM asset.opac_visible_copies WHERE id IN ( SELECT id FROM asset.copy WHERE $$;
+    remove_query := $$ DELETE FROM asset.opac_visible_copies WHERE copy_id IN ( SELECT id FROM asset.copy WHERE $$;
+
+    IF TG_TABLE_NAME = 'peer_bib_copy_map' THEN
+        IF TG_OP = 'INSERT' THEN
+            add_query := add_query || 'WHERE x.copy_id = ' || NEW.target_copy || ' AND x.record = ' || NEW.peer_record || ';';
+            EXECUTE add_query;
+            RETURN NEW;
+        ELSE
+            remove_query := 'DELETE FROM asset.opac_visible_copies WHERE copy_id ' || OLD.target_copy || ' AND record = ' || OLD.peer_record || ';';
+            EXECUTE remove_query;
+            RETURN OLD;
+        END IF;
+    END IF;
 
     IF TG_OP = 'INSERT' THEN
 
         IF TG_TABLE_NAME IN ('copy', 'unit') THEN
-            add_query := add_query || 'AND cp.id = ' || NEW.id || ';';
+            add_query := add_query || 'WHERE x.copy_id = ' || NEW.id || ';';
             EXECUTE add_query;
         END IF;
 
@@ -1225,7 +1268,7 @@ BEGIN
             DELETE FROM asset.opac_visible_copies WHERE id = NEW.id;
         END IF;
         IF do_add THEN
-            add_query := add_query || 'AND cp.id = ' || NEW.id || ';';
+            add_query := add_query || 'WHERE x.copy_id = ' || NEW.id || ';';
             EXECUTE add_query;
         END IF;
 
@@ -1252,11 +1295,11 @@ BEGIN
         ELSIF OLD.deleted THEN -- add rows
  
             IF TG_TABLE_NAME IN ('copy','unit') THEN
-                add_query := add_query || 'AND cp.id = ' || NEW.id || ';';
+                add_query := add_query || 'WHERE x.copy_id = ' || NEW.id || ';';
             ELSIF TG_TABLE_NAME = 'call_number' THEN
-                add_query := add_query || 'AND cp.call_number = ' || NEW.id || ';';
+                add_query := add_query || 'WHERE x.call_number = ' || NEW.id || ';';
             ELSIF TG_TABLE_NAME = 'record_entry' THEN
-                add_query := add_query || 'AND cn.record = ' || NEW.id || ';';
+                add_query := add_query || 'WHERE x.record = ' || NEW.id || ';';
             END IF;
  
             EXECUTE add_query;
@@ -1272,7 +1315,7 @@ BEGIN
             -- call number is linked to different bib
             remove_query := remove_query || 'call_number = ' || NEW.id || ');';
             EXECUTE remove_query;
-            add_query := add_query || 'AND cp.call_number = ' || NEW.id || ';';
+            add_query := add_query || 'WHERE x.call_number = ' || NEW.id || ';';
             EXECUTE add_query;
         END IF;
 
@@ -1321,6 +1364,7 @@ $func$ LANGUAGE PLPGSQL;
 COMMENT ON FUNCTION asset.cache_copy_visibility() IS $$
 Trigger function to update the copy OPAC visiblity cache.
 $$;
+CREATE TRIGGER a_opac_vis_mat_view_tgr AFTER INSERT OR DELETE ON biblio.peer_bib_copy_map FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
 CREATE TRIGGER a_opac_vis_mat_view_tgr AFTER INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
 CREATE TRIGGER a_opac_vis_mat_view_tgr AFTER INSERT OR UPDATE ON asset.copy FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();
 CREATE TRIGGER a_opac_vis_mat_view_tgr AFTER INSERT OR UPDATE ON asset.call_number FOR EACH ROW EXECUTE PROCEDURE asset.cache_copy_visibility();