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;