LP#1164189: Remove $0 subfield in auth/bib MARC when deleting auth user/sreyseng/lp1164189-remove-linked-subfield-on-auth-delete-fix
authorSrey Seng <sreyseng@gmail.com>
Fri, 6 Jun 2014 20:55:06 +0000 (13:55 -0700)
committerSrey Seng <sreyseng@gmail.com>
Fri, 6 Jun 2014 21:00:37 +0000 (14:00 -0700)
When deleting an authority record that has already been linked to
other authority records and bib records, the linking $0 information
is still retained on the MARC of other authority records and bib
records.

The updated function will remove the linking information from
any linked authority records and bib records when an authority
record is deleted.

Signed-off-by: Srey Seng <sreyseng@gmail.com>
Open-ILS/src/sql/Pg/upgrade/XXXX.function.authority.indexing_ingest_or_delete.sql [new file with mode: 0644]

diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.function.authority.indexing_ingest_or_delete.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.function.authority.indexing_ingest_or_delete.sql
new file mode 100644 (file)
index 0000000..23abc91
--- /dev/null
@@ -0,0 +1,106 @@
+-- Function: authority.indexing_ingest_or_delete()
+
+-- DROP FUNCTION authority.indexing_ingest_or_delete();
+
+CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete()
+  RETURNS trigger AS
+$BODY$
+DECLARE
+    ashs    authority.simple_heading%ROWTYPE;
+    mbe_row metabib.browse_entry%ROWTYPE;
+    mbe_id  BIGINT;
+    ash_id  BIGINT;
+    are_row authority.record_entry%ROWTYPE;
+    bre_row biblio.record_entry%ROWTYPE;
+BEGIN
+
+    IF NEW.deleted IS TRUE THEN -- If this authority is deleted
+        
+        -- Remove the actual linking subfields present in
+        -- marc bib records that is controlled by this one
+        FOR bre_row IN SELECT * FROM biblio.record_entry
+            WHERE id IN (SELECT bib FROM authority.bib_linking WHERE authority = NEW.id) LOOP
+            UPDATE biblio.record_entry
+            SET marc = (SELECT regexp_replace(bre_row.marc,E'<subfield[^>]*?code="0">\\([A-Z]+\\)' || NEW.id || '</subfield>','','g'))
+            WHERE id = bre_row.id;
+        END LOOP;
+        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;
+
+        -- Remove the actual linking subfields present in
+        -- authority records that target this one
+        FOR are_row IN SELECT * FROM authority.record_entry
+            WHERE id IN (SELECT source FROM authority.authority_linking WHERE target = NEW.id) LOOP
+
+            UPDATE authority.record_entry
+            SET marc = (SELECT regexp_replace(are_row.marc,E'<subfield[^>]*?code="0">\\([A-Z]+\\)' || NEW.id || '</subfield>','','g'))
+            WHERE id = are_row.id;
+        END LOOP;
+        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;
+
+        -- Propagate these updates to any linked bib records
+        PERFORM authority.propagate_changes(NEW.id) FROM authority.record_entry WHERE id = NEW.id;
+
+        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)
+            VALUES (ashs.record, ashs.atag, ashs.value, ashs.sort_value);
+            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;
+$BODY$
+  LANGUAGE plpgsql VOLATILE
+  COST 100;
+ALTER FUNCTION authority.indexing_ingest_or_delete()
+  OWNER TO evergreen;
+