From: Mike Rylander Date: Wed, 24 Aug 2016 16:56:28 +0000 (-0400) Subject: Stamping upgrade script for authority edit changes and propagation improvement X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=12159383d46bf76db3e710a689ad8b5140436007;p=evergreen%2Ftadl.git Stamping upgrade script for authority edit changes and propagation improvement Signed-off-by: Mike Rylander --- diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index d7438fb656..1e1dac8165 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -91,7 +91,7 @@ CREATE TRIGGER no_overlapping_deps BEFORE INSERT OR UPDATE ON config.db_patch_dependencies FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates'); -INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0993', :eg_version); -- berick/miker +INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0994', :eg_version); -- berick/miker CREATE TABLE config.bib_source ( id SERIAL PRIMARY KEY, diff --git a/Open-ILS/src/sql/Pg/upgrade/0994.schema.authority-propage-edit-date.sql b/Open-ILS/src/sql/Pg/upgrade/0994.schema.authority-propage-edit-date.sql new file mode 100644 index 0000000000..5d003429c3 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/0994.schema.authority-propage-edit-date.sql @@ -0,0 +1,144 @@ + +BEGIN; + +SELECT evergreen.upgrade_deps_block_check('0994', :eg_version); + +CREATE OR REPLACE FUNCTION authority.propagate_changes + (aid BIGINT, bid BIGINT) RETURNS BIGINT AS $func$ +DECLARE + bib_rec biblio.record_entry%ROWTYPE; + new_marc TEXT; +BEGIN + + SELECT INTO bib_rec * FROM biblio.record_entry WHERE id = bid; + + new_marc := vandelay.merge_record_xml( + bib_rec.marc, authority.generate_overlay_template(aid)); + + IF new_marc = bib_rec.marc THEN + -- Authority record change had no impact on this bib record. + -- Nothing left to do. + RETURN aid; + END IF; + + PERFORM 1 FROM config.global_flag + WHERE name = 'ingest.disable_authority_auto_update_bib_meta' + AND enabled; + + IF NOT FOUND THEN + -- update the bib record editor and edit_date + bib_rec.editor := ( + SELECT editor FROM authority.record_entry WHERE id = aid); + bib_rec.edit_date = NOW(); + END IF; + + UPDATE biblio.record_entry SET + marc = new_marc, + editor = bib_rec.editor, + edit_date = bib_rec.edit_date + WHERE id = bid; + + RETURN aid; + +END; +$func$ LANGUAGE PLPGSQL; + + +-- DATA +-- Disabled by default +INSERT INTO config.global_flag (name, enabled, label) VALUES ( + 'ingest.disable_authority_auto_update_bib_meta', FALSE, + oils_i18n_gettext( + 'ingest.disable_authority_auto_update_bib_meta', + 'Authority Automation: Disable automatic authority updates ' || + 'from modifying bib record editor and edit_date', + 'cgf', + 'label' + ) +); + + +CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$ +DECLARE + ashs authority.simple_heading%ROWTYPE; + mbe_row metabib.browse_entry%ROWTYPE; + mbe_id BIGINT; + ash_id BIGINT; +BEGIN + + IF NEW.deleted IS TRUE THEN -- If this authority is deleted + DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible + DELETE FROM authority.full_rec WHERE record = NEW.id; -- Avoid validating fields against deleted authority records + DELETE FROM authority.simple_heading WHERE record = NEW.id; + -- Should remove matching $0 from controlled fields at the same time? + + -- XXX What do we about the actual linking subfields present in + -- authority records that target this one when this happens? + DELETE FROM authority.authority_linking + WHERE source = NEW.id OR target = NEW.id; + + RETURN NEW; -- and we're done + END IF; + + IF TG_OP = 'UPDATE' THEN -- re-ingest? + PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled; + + IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change + RETURN NEW; + END IF; + + -- Unless there's a setting stopping us, propagate these updates to any linked bib records when the heading changes + PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_auto_update' AND enabled; + + IF NOT FOUND AND NEW.heading <> OLD.heading THEN + PERFORM authority.propagate_changes(NEW.id); + END IF; + + DELETE FROM authority.simple_heading WHERE record = NEW.id; + DELETE FROM authority.authority_linking WHERE source = NEW.id; + END IF; + + INSERT INTO authority.authority_linking (source, target, field) + SELECT source, target, field FROM authority.calculate_authority_linking( + NEW.id, NEW.control_set, NEW.marc::XML + ); + + FOR ashs IN SELECT * FROM authority.simple_heading_set(NEW.marc) LOOP + + INSERT INTO authority.simple_heading (record,atag,value,sort_value,thesaurus) + VALUES (ashs.record, ashs.atag, ashs.value, ashs.sort_value, ashs.thesaurus); + ash_id := CURRVAL('authority.simple_heading_id_seq'::REGCLASS); + + SELECT INTO mbe_row * FROM metabib.browse_entry + WHERE value = ashs.value AND sort_value = ashs.sort_value; + + IF FOUND THEN + mbe_id := mbe_row.id; + ELSE + INSERT INTO metabib.browse_entry + ( value, sort_value ) VALUES + ( ashs.value, ashs.sort_value ); + + mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS); + END IF; + + INSERT INTO metabib.browse_entry_simple_heading_map (entry,simple_heading) VALUES (mbe_id,ash_id); + + END LOOP; + + -- Flatten and insert the afr data + PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled; + IF NOT FOUND THEN + PERFORM authority.reingest_authority_full_rec(NEW.id); + PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled; + IF NOT FOUND THEN + PERFORM authority.reingest_authority_rec_descriptor(NEW.id); + END IF; + END IF; + + RETURN NEW; +END; +$func$ LANGUAGE PLPGSQL; + +COMMIT; + diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql deleted file mode 100644 index 3d53c033b9..0000000000 --- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql +++ /dev/null @@ -1,142 +0,0 @@ - -BEGIN; - -CREATE OR REPLACE FUNCTION authority.propagate_changes - (aid BIGINT, bid BIGINT) RETURNS BIGINT AS $func$ -DECLARE - bib_rec biblio.record_entry%ROWTYPE; - new_marc TEXT; -BEGIN - - SELECT INTO bib_rec * FROM biblio.record_entry WHERE id = bid; - - new_marc := vandelay.merge_record_xml( - bib_rec.marc, authority.generate_overlay_template(aid)); - - IF new_marc = bib_rec.marc THEN - -- Authority record change had no impact on this bib record. - -- Nothing left to do. - RETURN aid; - END IF; - - PERFORM 1 FROM config.global_flag - WHERE name = 'ingest.disable_authority_auto_update_bib_meta' - AND enabled; - - IF NOT FOUND THEN - -- update the bib record editor and edit_date - bib_rec.editor := ( - SELECT editor FROM authority.record_entry WHERE id = aid); - bib_rec.edit_date = NOW(); - END IF; - - UPDATE biblio.record_entry SET - marc = new_marc, - editor = bib_rec.editor, - edit_date = bib_rec.edit_date - WHERE id = bid; - - RETURN aid; - -END; -$func$ LANGUAGE PLPGSQL; - - --- DATA --- Disabled by default -INSERT INTO config.global_flag (name, enabled, label) VALUES ( - 'ingest.disable_authority_auto_update_bib_meta', FALSE, - oils_i18n_gettext( - 'ingest.disable_authority_auto_update_bib_meta', - 'Authority Automation: Disable automatic authority updates ' || - 'from modifying bib record editor and edit_date', - 'cgf', - 'label' - ) -); - - -CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$ -DECLARE - ashs authority.simple_heading%ROWTYPE; - mbe_row metabib.browse_entry%ROWTYPE; - mbe_id BIGINT; - ash_id BIGINT; -BEGIN - - IF NEW.deleted IS TRUE THEN -- If this authority is deleted - DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible - DELETE FROM authority.full_rec WHERE record = NEW.id; -- Avoid validating fields against deleted authority records - DELETE FROM authority.simple_heading WHERE record = NEW.id; - -- Should remove matching $0 from controlled fields at the same time? - - -- XXX What do we about the actual linking subfields present in - -- authority records that target this one when this happens? - DELETE FROM authority.authority_linking - WHERE source = NEW.id OR target = NEW.id; - - RETURN NEW; -- and we're done - END IF; - - IF TG_OP = 'UPDATE' THEN -- re-ingest? - PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled; - - IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change - RETURN NEW; - END IF; - - -- Unless there's a setting stopping us, propagate these updates to any linked bib records when the heading changes - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_auto_update' AND enabled; - - IF NOT FOUND AND NEW.heading <> OLD.heading THEN - PERFORM authority.propagate_changes(NEW.id); - END IF; - - DELETE FROM authority.simple_heading WHERE record = NEW.id; - DELETE FROM authority.authority_linking WHERE source = NEW.id; - END IF; - - INSERT INTO authority.authority_linking (source, target, field) - SELECT source, target, field FROM authority.calculate_authority_linking( - NEW.id, NEW.control_set, NEW.marc::XML - ); - - FOR ashs IN SELECT * FROM authority.simple_heading_set(NEW.marc) LOOP - - INSERT INTO authority.simple_heading (record,atag,value,sort_value,thesaurus) - VALUES (ashs.record, ashs.atag, ashs.value, ashs.sort_value, ashs.thesaurus); - ash_id := CURRVAL('authority.simple_heading_id_seq'::REGCLASS); - - SELECT INTO mbe_row * FROM metabib.browse_entry - WHERE value = ashs.value AND sort_value = ashs.sort_value; - - IF FOUND THEN - mbe_id := mbe_row.id; - ELSE - INSERT INTO metabib.browse_entry - ( value, sort_value ) VALUES - ( ashs.value, ashs.sort_value ); - - mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS); - END IF; - - INSERT INTO metabib.browse_entry_simple_heading_map (entry,simple_heading) VALUES (mbe_id,ash_id); - - END LOOP; - - -- Flatten and insert the afr data - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled; - IF NOT FOUND THEN - PERFORM authority.reingest_authority_full_rec(NEW.id); - PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled; - IF NOT FOUND THEN - PERFORM authority.reingest_authority_rec_descriptor(NEW.id); - END IF; - END IF; - - RETURN NEW; -END; -$func$ LANGUAGE PLPGSQL; - -COMMIT; -