From: Mike Rylander Date: Fri, 25 Mar 2011 18:01:53 +0000 (-0400) Subject: Include foreign copies in the OPAC copy visiblity mat-view X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=1dced5672a3d2390c65d2c6107afb08ee4c10e93;p=evergreen%2Fequinox.git Include foreign copies in the OPAC copy visiblity mat-view --- diff --git a/Open-ILS/src/sql/Pg/040.schema.asset.sql b/Open-ILS/src/sql/Pg/040.schema.asset.sql index 6509bca19f..15397969d2 100644 --- a/Open-ILS/src/sql/Pg/040.schema.asset.sql +++ b/Open-ILS/src/sql/Pg/040.schema.asset.sql @@ -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 $$ diff --git a/Open-ILS/src/sql/Pg/300.schema.staged_search.sql b/Open-ILS/src/sql/Pg/300.schema.staged_search.sql index 10cc2e1676..3b22752a1b 100644 --- a/Open-ILS/src/sql/Pg/300.schema.staged_search.sql +++ b/Open-ILS/src/sql/Pg/300.schema.staged_search.sql @@ -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; diff --git a/Open-ILS/src/sql/Pg/999.functions.global.sql b/Open-ILS/src/sql/Pg/999.functions.global.sql index d621300cf2..f3944f7646 100644 --- a/Open-ILS/src/sql/Pg/999.functions.global.sql +++ b/Open-ILS/src/sql/Pg/999.functions.global.sql @@ -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();