KMAIN 1765 Fix authority reingest causing invalid entries
authorMichael Glass <mglass@catalystitservices.com>
Tue, 9 Jun 2015 23:20:59 +0000 (16:20 -0700)
committerBill Erickson <berickxx@gmail.com>
Thu, 21 Mar 2019 19:46:23 +0000 (15:46 -0400)
Restore old authority heading extraction code which grabs authority
browse headings properly and adds joiner text.

new file:   KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings-rollback.sql
new file:   KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings.sql

Signed-off-by: Michael Glass <mglass@catalystitservices.com>
KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings-rollback.sql [new file with mode: 0644]
KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings.sql [new file with mode: 0644]

diff --git a/KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings-rollback.sql b/KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings-rollback.sql
new file mode 100644 (file)
index 0000000..ae6ab2e
--- /dev/null
@@ -0,0 +1,84 @@
+-- Function: authority.simple_heading_set(text)
+
+DROP FUNCTION authority.simple_heading_set(text);
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_set(marcxml text)
+  RETURNS SETOF authority.simple_heading AS
+$BODY$
+DECLARE
+    res             authority.simple_heading%ROWTYPE;
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    sort_text       TEXT;
+    tmp_text        TEXT;
+    tmp_xml         TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml)::INT;
+BEGIN
+
+    res.record := auth_id;
+
+    SELECT  control_set INTO cset
+      FROM  authority.control_set_authority_field
+      WHERE tag IN ( SELECT UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]) )
+      LIMIT 1;
+
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
+
+        res.atag := acsaf.id;
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+
+        FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)) LOOP
+
+            heading_text := public.naco_normalize(
+                COALESCE(
+                    oils_xpath_string('//*[contains("'||acsaf.sf_list||'",@code)]',tmp_xml::TEXT, ' '),
+                    ''
+                )
+            );
+
+            IF nfi_used IS NOT NULL THEN
+
+                sort_text := SUBSTRING(
+                    heading_text FROM
+                    COALESCE(
+                        NULLIF(
+                            REGEXP_REPLACE(
+                                oils_xpath_string('./@ind'||nfi_used, tmp_xml::TEXT),
+                                $$\D+$$,
+                                '',
+                                'g'
+                            ),
+                            ''
+                        )::INT,
+                        0
+                    ) + 1
+                );
+
+            ELSE
+                sort_text := heading_text;
+            END IF;
+
+            IF heading_text IS NOT NULL AND heading_text <> '' THEN
+                res.value := heading_text;
+                res.sort_value := sort_text;
+                RETURN NEXT res;
+            END IF;
+
+        END LOOP;
+
+    END LOOP;
+
+    RETURN;
+END;
+$BODY$
+  LANGUAGE plpgsql IMMUTABLE
+  COST 100
+  ROWS 1000;
+ALTER FUNCTION authority.simple_heading_set(text)
+  OWNER TO evergreen;
diff --git a/KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings.sql b/KCLS/sql/kmain-1765/KMAIN-1765-reingest-causing-false-browse-headings.sql
new file mode 100644 (file)
index 0000000..d14d063
--- /dev/null
@@ -0,0 +1,83 @@
+-- Function: authority.simple_heading_set(text)
+
+DROP FUNCTION authority.simple_heading_set(text);
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_set(marcxml text)
+  RETURNS SETOF authority.simple_heading AS
+$BODY$
+DECLARE
+    res             authority.simple_heading%ROWTYPE;
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    joiner_text    TEXT;
+    sort_text       TEXT;
+    tmp_text        TEXT;
+    tmp_xml         TEXT;
+    first_sf        BOOL;
+    auth_id         INT DEFAULT COALESCE(NULLIF(oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml), ''), '0')::INT;
+BEGIN
+    --ver1.0
+    SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
+
+    IF cset IS NULL THEN
+        SELECT  control_set INTO cset
+          FROM  authority.control_set_authority_field
+          WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
+          LIMIT 1;
+    END IF;
+
+    res.record := auth_id;
+
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
+
+        res.atag := acsaf.id;
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+        joiner_text := COALESCE(acsaf.joiner, ' ');
+
+        FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)) LOOP
+
+            heading_text := COALESCE(
+                oils_xpath_string('./*[contains("'||acsaf.display_sf_list||'",@code)]', tmp_xml::TEXT, joiner_text),
+                ''
+            );
+            IF nfi_used IS NOT NULL THEN
+                sort_text := SUBSTRING(
+                    heading_text FROM
+                    COALESCE(
+                        NULLIF(
+                            REGEXP_REPLACE(
+                                oils_xpath_string('./@ind'||nfi_used, tmp_xml::TEXT),
+                                $$\D+$$,
+                                '',
+                                'g'
+                            ),
+                            ''
+                        )::INT,
+                        0
+                    ) + 1
+                );
+            ELSE
+                sort_text := heading_text;
+            END IF;
+            IF heading_text IS NOT NULL AND heading_text <> '' THEN
+                res.value := heading_text;
+                res.sort_value := public.naco_normalize(sort_text);
+                res.index_vector = to_tsvector('keyword'::regconfig, res.sort_value);
+                RETURN NEXT res;
+            END IF;
+        END LOOP;
+    END LOOP;
+
+    RETURN;
+END;
+$BODY$
+  LANGUAGE plpgsql IMMUTABLE
+  COST 100
+  ROWS 1000;
+ALTER FUNCTION authority.simple_heading_set(text)
+  OWNER TO evergreen;