More sqitch tracking; master rebase
authorBill Erickson <berickxx@gmail.com>
Thu, 15 Oct 2015 14:23:36 +0000 (10:23 -0400)
committerBill Erickson <berickxx@gmail.com>
Thu, 15 Oct 2015 14:23:38 +0000 (10:23 -0400)
data.authority.control_set_authority_field-remove-sf-e
schema.filter_authority_browse_search_by_thesaurus
data.additional_authority_fixed_fields
data.adjust_bills_perm
schema.dob-as-date

Signed-off-by: Bill Erickson <berickxx@gmail.com>
16 files changed:
Open-ILS/src/sql/schema/deploy/data.additional_authority_fixed_fields.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/deploy/data.adjust_bills_perm.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/deploy/data.authority.control_set_authority_field-remove-sf-e.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/deploy/schema.dob-as-date.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/deploy/schema.filter_authority_browse_search_by_thesaurus.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/revert/data.additional_authority_fixed_fields.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/revert/data.adjust_bills_perm.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/revert/data.authority.control_set_authority_field-remove-sf-e.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/revert/schema.dob-as-date.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/revert/schema.filter_authority_browse_search_by_thesaurus.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/sqitch.plan
Open-ILS/src/sql/schema/verify/data.additional_authority_fixed_fields.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/verify/data.adjust_bills_perm.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/verify/data.authority.control_set_authority_field-remove-sf-e.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/verify/schema.dob-as-date.sql [new file with mode: 0644]
Open-ILS/src/sql/schema/verify/schema.filter_authority_browse_search_by_thesaurus.sql [new file with mode: 0644]

diff --git a/Open-ILS/src/sql/schema/deploy/data.additional_authority_fixed_fields.sql b/Open-ILS/src/sql/schema/deploy/data.additional_authority_fixed_fields.sql
new file mode 100644 (file)
index 0000000..23b78f0
--- /dev/null
@@ -0,0 +1,24 @@
+BEGIN;
+
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Type', 'ldr', 'AUT', 6, 1, 'z');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('GeoDiv', '008', 'AUT', 6, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Roman', '008', 'AUT', 7, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('CatLang', '008', 'AUT', 8, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Kind', '008', 'AUT', 9, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Rules', '008', 'AUT', 10, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Subj', '008', 'AUT', 11, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Series', '008', 'AUT', 12, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('SerNum', '008', 'AUT', 13, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('NameUse', '008', 'AUT', 14, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('SubjUse', '008', 'AUT', 15, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('SerUse', '008', 'AUT', 16, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('TypeSubd', '008', 'AUT', 17, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('GovtAgn', '008', 'AUT', 28, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('RefStatus', '008', 'AUT', 29, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('UpdStatus', '008', 'AUT', 31, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Name', '008', 'AUT', 32, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Status', '008', 'AUT', 33, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('ModRec', '008', 'AUT', 38, 1, ' ');
+INSERT INTO config.marc21_ff_pos_map (fixed_field, tag, rec_type,start_pos, length, default_val) VALUES ('Source', '008', 'AUT', 39, 1, ' ');
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/deploy/data.adjust_bills_perm.sql b/Open-ILS/src/sql/schema/deploy/data.adjust_bills_perm.sql
new file mode 100644 (file)
index 0000000..fa9f8b7
--- /dev/null
@@ -0,0 +1,15 @@
+BEGIN;
+
+INSERT INTO permission.perm_list (id, code, description)
+    VALUES (
+        563,
+        'ADJUST_BILLS',
+        oils_i18n_gettext(
+            563,
+            'Allow a user to adjust a bill (generally to zero)',
+            'ppl',
+            'description'
+        )
+    );
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/deploy/data.authority.control_set_authority_field-remove-sf-e.sql b/Open-ILS/src/sql/schema/deploy/data.authority.control_set_authority_field-remove-sf-e.sql
new file mode 100644 (file)
index 0000000..505c70f
--- /dev/null
@@ -0,0 +1,11 @@
+BEGIN;
+
+UPDATE authority.control_set_authority_field 
+    SET sf_list = REGEXP_REPLACE( sf_list, 'e', '', 'i') 
+    WHERE tag = '100' AND control_set = 1 AND  sf_list ILIKE '%e%';
+
+UPDATE authority.control_set_authority_field 
+    SET sf_list = REGEXP_REPLACE( sf_list, 'e', '', 'i') 
+    WHERE tag = '110' AND control_set = 1 AND  sf_list ILIKE '%e%';
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/deploy/schema.dob-as-date.sql b/Open-ILS/src/sql/schema/deploy/schema.dob-as-date.sql
new file mode 100644 (file)
index 0000000..8953156
--- /dev/null
@@ -0,0 +1,161 @@
+BEGIN;
+
+DROP VIEW action.all_circulation;
+DROP VIEW reporter.demographic;
+DROP VIEW auditor.actor_usr_lifecycle;
+DROP VIEW action.all_hold_request;
+
+ALTER TABLE actor.usr ALTER dob TYPE date USING (dob + '3 hours')::date;
+
+CREATE VIEW auditor.actor_usr_lifecycle AS
+     SELECT (-1) AS audit_id, now() AS audit_time,
+        '-'::text AS audit_action, (-1) AS audit_user, (-1) AS audit_ws,
+        usr.id, usr.card, usr.profile, usr.usrname, usr.email, usr.passwd,
+        usr.standing, usr.ident_type, usr.ident_value, usr.ident_type2,
+        usr.ident_value2, usr.net_access_level, usr.photo_url, usr.prefix,
+        usr.first_given_name, usr.second_given_name, usr.family_name,
+        usr.suffix, usr.alias, usr.day_phone, usr.evening_phone,
+        usr.other_phone, usr.mailing_address, usr.billing_address,
+        usr.home_ou, usr.dob, usr.active, usr.master_account,
+        usr.super_user, usr.barred, usr.deleted, usr.juvenile, usr.usrgroup,
+        usr.claims_returned_count, usr.credit_forward_balance,
+        usr.last_xact_id, usr.alert_message, usr.create_date,
+        usr.expire_date, usr.claims_never_checked_out_count,
+        usr.last_update_time
+       FROM actor.usr
+UNION ALL
+     SELECT actor_usr_history.audit_id, actor_usr_history.audit_time,
+        actor_usr_history.audit_action, actor_usr_history.audit_user,
+        actor_usr_history.audit_ws, actor_usr_history.id,
+        actor_usr_history.card, actor_usr_history.profile,
+        actor_usr_history.usrname, actor_usr_history.email,
+        actor_usr_history.passwd, actor_usr_history.standing,
+        actor_usr_history.ident_type, actor_usr_history.ident_value,
+        actor_usr_history.ident_type2, actor_usr_history.ident_value2,
+        actor_usr_history.net_access_level, actor_usr_history.photo_url,
+        actor_usr_history.prefix, actor_usr_history.first_given_name,
+        actor_usr_history.second_given_name, actor_usr_history.family_name,
+        actor_usr_history.suffix, actor_usr_history.alias,
+        actor_usr_history.day_phone, actor_usr_history.evening_phone,
+        actor_usr_history.other_phone, actor_usr_history.mailing_address,
+        actor_usr_history.billing_address, actor_usr_history.home_ou,
+        actor_usr_history.dob, actor_usr_history.active,
+        actor_usr_history.master_account, actor_usr_history.super_user,
+        actor_usr_history.barred, actor_usr_history.deleted,
+        actor_usr_history.juvenile, actor_usr_history.usrgroup,
+        actor_usr_history.claims_returned_count,
+        actor_usr_history.credit_forward_balance,
+        actor_usr_history.last_xact_id, actor_usr_history.alert_message,
+        actor_usr_history.create_date, actor_usr_history.expire_date,
+        actor_usr_history.claims_never_checked_out_count,
+        actor_usr_history.last_update_time
+       FROM auditor.actor_usr_history;
+
+CREATE VIEW reporter.demographic AS
+    SELECT u.id, u.dob,
+        CASE
+            WHEN u.dob IS NULL THEN 'Adult'::text
+            WHEN age(u.dob) > '18 years'::interval THEN 'Adult'::text
+            ELSE 'Juvenile'::text
+        END AS general_division
+    FROM actor.usr u;
+
+CREATE VIEW action.all_circulation AS
+         SELECT aged_circulation.id, aged_circulation.usr_post_code,
+            aged_circulation.usr_home_ou, aged_circulation.usr_profile,
+            aged_circulation.usr_birth_year, aged_circulation.copy_call_number,
+            aged_circulation.copy_location, aged_circulation.copy_owning_lib,
+            aged_circulation.copy_circ_lib, aged_circulation.copy_bib_record,
+            aged_circulation.xact_start, aged_circulation.xact_finish,
+            aged_circulation.target_copy, aged_circulation.circ_lib,
+            aged_circulation.circ_staff, aged_circulation.checkin_staff,
+            aged_circulation.checkin_lib, aged_circulation.renewal_remaining,
+            aged_circulation.grace_period, aged_circulation.due_date,
+            aged_circulation.stop_fines_time, aged_circulation.checkin_time,
+            aged_circulation.create_time, aged_circulation.duration,
+            aged_circulation.fine_interval, aged_circulation.recurring_fine,
+            aged_circulation.max_fine, aged_circulation.phone_renewal,
+            aged_circulation.desk_renewal, aged_circulation.opac_renewal,
+            aged_circulation.duration_rule,
+            aged_circulation.recurring_fine_rule,
+            aged_circulation.max_fine_rule, aged_circulation.stop_fines,
+            aged_circulation.workstation, aged_circulation.checkin_workstation,
+            aged_circulation.checkin_scan_time, aged_circulation.parent_circ
+           FROM action.aged_circulation
+UNION ALL
+         SELECT DISTINCT circ.id,
+            COALESCE(a.post_code, b.post_code) AS usr_post_code,
+            p.home_ou AS usr_home_ou, p.profile AS usr_profile,
+            date_part('year'::text, p.dob)::integer AS usr_birth_year,
+            cp.call_number AS copy_call_number, circ.copy_location,
+            cn.owning_lib AS copy_owning_lib, cp.circ_lib AS copy_circ_lib,
+            cn.record AS copy_bib_record, circ.xact_start, circ.xact_finish,
+            circ.target_copy, circ.circ_lib, circ.circ_staff,
+            circ.checkin_staff, circ.checkin_lib, circ.renewal_remaining,
+            circ.grace_period, circ.due_date, circ.stop_fines_time,
+            circ.checkin_time, circ.create_time, circ.duration,
+            circ.fine_interval, circ.recurring_fine, circ.max_fine,
+            circ.phone_renewal, circ.desk_renewal, circ.opac_renewal,
+            circ.duration_rule, circ.recurring_fine_rule, circ.max_fine_rule,
+            circ.stop_fines, circ.workstation, circ.checkin_workstation,
+            circ.checkin_scan_time, circ.parent_circ
+           FROM action.circulation circ
+      JOIN asset.copy cp ON circ.target_copy = cp.id
+   JOIN asset.call_number cn ON cp.call_number = cn.id
+   JOIN actor.usr p ON circ.usr = p.id
+   LEFT JOIN actor.usr_address a ON p.mailing_address = a.id
+   LEFT JOIN actor.usr_address b ON p.billing_address = b.id;
+
+CREATE OR REPLACE VIEW action.all_hold_request AS
+         SELECT DISTINCT COALESCE(a.post_code, b.post_code) AS usr_post_code,
+            p.home_ou AS usr_home_ou, p.profile AS usr_profile,
+            date_part('year'::text, p.dob)::integer AS usr_birth_year,
+            ahr.requestor <> ahr.usr AS staff_placed, ahr.id, ahr.request_time,
+            ahr.capture_time, ahr.fulfillment_time, ahr.checkin_time,
+            ahr.return_time, ahr.prev_check_time, ahr.expire_time,
+            ahr.cancel_time, ahr.cancel_cause, ahr.cancel_note, ahr.target,
+            ahr.current_copy, ahr.fulfillment_staff, ahr.fulfillment_lib,
+            ahr.request_lib, ahr.selection_ou, ahr.selection_depth,
+            ahr.pickup_lib, ahr.hold_type, ahr.holdable_formats,
+                CASE
+                    WHEN ahr.phone_notify IS NULL THEN false
+                    WHEN ahr.phone_notify = ''::text THEN false
+                    ELSE true
+                END AS phone_notify,
+            ahr.email_notify,
+                CASE
+                    WHEN ahr.sms_notify IS NULL THEN false
+                    WHEN ahr.sms_notify = ''::text THEN false
+                    ELSE true
+                END AS sms_notify,
+            ahr.frozen, ahr.thaw_date, ahr.shelf_time, ahr.cut_in_line,
+            ahr.mint_condition, ahr.shelf_expire_time, ahr.current_shelf_lib,
+            ahr.behind_desk
+           FROM action.hold_request ahr
+      JOIN actor.usr p ON ahr.usr = p.id
+   LEFT JOIN actor.usr_address a ON p.mailing_address = a.id
+   LEFT JOIN actor.usr_address b ON p.billing_address = b.id
+UNION ALL
+         SELECT aged_hold_request.usr_post_code, aged_hold_request.usr_home_ou,
+            aged_hold_request.usr_profile, aged_hold_request.usr_birth_year,
+            aged_hold_request.staff_placed, aged_hold_request.id,
+            aged_hold_request.request_time, aged_hold_request.capture_time,
+            aged_hold_request.fulfillment_time, aged_hold_request.checkin_time,
+            aged_hold_request.return_time, aged_hold_request.prev_check_time,
+            aged_hold_request.expire_time, aged_hold_request.cancel_time,
+            aged_hold_request.cancel_cause, aged_hold_request.cancel_note,
+            aged_hold_request.target, aged_hold_request.current_copy,
+            aged_hold_request.fulfillment_staff,
+            aged_hold_request.fulfillment_lib, aged_hold_request.request_lib,
+            aged_hold_request.selection_ou, aged_hold_request.selection_depth,
+            aged_hold_request.pickup_lib, aged_hold_request.hold_type,
+            aged_hold_request.holdable_formats, aged_hold_request.phone_notify,
+            aged_hold_request.email_notify, aged_hold_request.sms_notify,
+            aged_hold_request.frozen, aged_hold_request.thaw_date,
+            aged_hold_request.shelf_time, aged_hold_request.cut_in_line,
+            aged_hold_request.mint_condition,
+            aged_hold_request.shelf_expire_time,
+            aged_hold_request.current_shelf_lib, aged_hold_request.behind_desk
+           FROM action.aged_hold_request;
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/deploy/schema.filter_authority_browse_search_by_thesaurus.sql b/Open-ILS/src/sql/schema/deploy/schema.filter_authority_browse_search_by_thesaurus.sql
new file mode 100644 (file)
index 0000000..e1f34e2
--- /dev/null
@@ -0,0 +1,601 @@
+BEGIN;
+
+CREATE OR REPLACE FUNCTION authority.extract_thesaurus( marcxml TEXT ) RETURNS TEXT AS $func$
+DECLARE
+    thes_code TEXT;
+BEGIN
+    thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
+    IF thes_code IS NULL THEN
+        thes_code := '|';
+    ELSIF thes_code = 'z' THEN
+        thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
+    END IF;
+    RETURN thes_code;
+END;
+$func$ LANGUAGE PLPGSQL STABLE STRICT;
+
+-- Intended to be used in a unique index on authority.record_entry like so:
+-- CREATE UNIQUE INDEX unique_by_heading_and_thesaurus
+--   ON authority.record_entry (heading)
+--   WHERE deleted IS FALSE or deleted = FALSE;
+CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
+DECLARE
+    acsaf           authority.control_set_authority_field%ROWTYPE;
+    tag_used        TEXT;
+    nfi_used        TEXT;
+    sf              TEXT;
+    sf_node         TEXT;
+    tag_node        TEXT;
+    thes_code       TEXT;
+    cset            INT;
+    heading_text    TEXT;
+    tmp_text        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
+    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;
+
+    heading_text := '';
+    FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
+        tag_used := acsaf.tag;
+        nfi_used := acsaf.nfi;
+        first_sf := TRUE;
+
+        FOR tag_node IN SELECT unnest(oils_xpath('//*[@tag="'||tag_used||'"]',marcxml)) LOOP
+            FOR sf_node IN SELECT unnest(oils_xpath('./*[contains("'||acsaf.sf_list||'",@code)]',tag_node)) LOOP
+
+                tmp_text := oils_xpath_string('.', sf_node);
+                sf := oils_xpath_string('./@code', sf_node);
+
+                IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
+
+                    tmp_text := SUBSTRING(
+                        tmp_text FROM
+                        COALESCE(
+                            NULLIF(
+                                REGEXP_REPLACE(
+                                    oils_xpath_string('./@ind'||nfi_used, tag_node),
+                                    $$\D+$$,
+                                    '',
+                                    'g'
+                                ),
+                                ''
+                            )::INT,
+                            0
+                        ) + 1
+                    );
+
+                END IF;
+
+                first_sf := FALSE;
+
+                IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
+                    heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
+                END IF;
+            END LOOP;
+
+            EXIT WHEN heading_text <> '';
+        END LOOP;
+
+        EXIT WHEN heading_text <> '';
+    END LOOP;
+
+    IF heading_text <> '' THEN
+        IF no_thesaurus IS TRUE THEN
+            heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
+        ELSE
+            thes_code := authority.extract_thesaurus(marcxml);
+            heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
+        END IF;
+    ELSE
+        heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
+    END IF;
+
+    RETURN heading_text;
+END;
+$func$ LANGUAGE PLPGSQL STABLE STRICT;
+
+ALTER TABLE authority.simple_heading ADD COLUMN thesaurus TEXT;
+CREATE INDEX authority_simple_heading_thesaurus_idx ON authority.simple_heading (thesaurus);
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
+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
+
+    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;
+    res.thesaurus := authority.extract_thesaurus(marcxml);
+
+    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)::TEXT[]) LOOP
+
+            heading_text := COALESCE(
+                oils_xpath_string('./*[contains("'||acsaf.display_sf_list||'",@code)]', tmp_xml, 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;
+
+$func$ LANGUAGE PLPGSQL STABLE STRICT;
+-- AFTER UPDATE OR INSERT trigger for authority.record_entry
+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
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_auto_update' AND enabled;
+
+        IF NOT FOUND 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;
+
+DROP FUNCTION IF EXISTS authority.atag_search_heading_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_search_heading_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_search_heading_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.atag_search_heading(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_search_heading(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_search_heading(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.simple_heading_search_heading(INT[], TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.atag_search_rank_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_search_rank_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_search_rank_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.atag_search_rank(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_search_rank(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_search_rank(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.simple_heading_search_rank(INT[], TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.atag_browse_top_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_browse_top_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_browse_top_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.atag_browse_top(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_browse_top(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_browse_top(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.simple_heading_browse_top(INT[], TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.atag_browse_center_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_browse_center_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_browse_center_refs(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.atag_browse_center(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.btag_browse_center(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.axis_browse_center(TEXT, TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.simple_heading_browse_center(INT[], TEXT, INT, INT);
+DROP FUNCTION IF EXISTS authority.simple_heading_find_pivot(INT[], TEXT);
+
+-- Support function used to find the pivot for alpha-heading-browse style searching
+CREATE OR REPLACE FUNCTION authority.simple_heading_find_pivot( a INT[], q TEXT, thesauruses TEXT DEFAULT '' ) RETURNS TEXT AS $$
+DECLARE
+    sort_value_row  RECORD;
+    value_row       RECORD;
+    t_term          TEXT;
+BEGIN
+
+    t_term := public.naco_normalize(q);
+
+    SELECT  CASE WHEN ash.sort_value LIKE t_term || '%' THEN 1 ELSE 0 END
+                + CASE WHEN ash.value LIKE t_term || '%' THEN 1 ELSE 0 END AS rank,
+            ash.sort_value
+    INTO  sort_value_row
+    FROM  authority.simple_heading ash
+    WHERE ash.atag = ANY (a)
+            AND ash.sort_value >= t_term
+            AND CASE thesauruses
+                WHEN '' THEN TRUE
+                ELSE ash.thesaurus = ANY(regexp_split_to_array(thesauruses, ','))
+                END
+    ORDER BY rank DESC, ash.sort_value
+    LIMIT 1;
+
+    SELECT  CASE WHEN ash.sort_value LIKE t_term || '%' THEN 1 ELSE 0 END
+                + CASE WHEN ash.value LIKE t_term || '%' THEN 1 ELSE 0 END AS rank,
+            ash.sort_value
+    INTO  value_row
+    FROM  authority.simple_heading ash
+    WHERE ash.atag = ANY (a)
+            AND ash.value >= t_term
+            AND CASE thesauruses
+                WHEN '' THEN TRUE
+                ELSE ash.thesaurus = ANY(regexp_split_to_array(thesauruses, ','))
+                END
+    ORDER BY rank DESC, ash.sort_value
+    LIMIT 1;
+
+    IF value_row.rank > sort_value_row.rank THEN
+        RETURN value_row.sort_value;
+    ELSE
+        RETURN sort_value_row.sort_value;
+    END IF;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_browse_center( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+DECLARE
+    pivot_sort_value    TEXT;
+    boffset             INT DEFAULT 0;
+    aoffset             INT DEFAULT 0;
+    blimit              INT DEFAULT 0;
+    alimit              INT DEFAULT 0;
+BEGIN
+
+    pivot_sort_value := authority.simple_heading_find_pivot(atag_list,q,thesauruses);
+
+    IF page = 0 THEN
+        blimit := pagesize / 2;
+        alimit := blimit;
+
+        IF pagesize % 2 <> 0 THEN
+            alimit := alimit + 1;
+        END IF;
+    ELSE
+        blimit := pagesize;
+        alimit := blimit;
+
+        boffset := pagesize / 2;
+        aoffset := boffset;
+
+        IF pagesize % 2 <> 0 THEN
+            boffset := boffset + 1;
+        END IF;
+    END IF;
+
+    IF page <= 0 THEN
+        -- "bottom" half of the browse results
+        RETURN QUERY
+            SELECT id FROM (
+                SELECT  ash.id,
+                        row_number() over ()
+                FROM  authority.simple_heading ash
+                WHERE ash.atag = ANY (atag_list)
+                        AND CASE thesauruses
+                            WHEN '' THEN TRUE
+                            ELSE ash.thesaurus = ANY(regexp_split_to_array(thesauruses, ','))
+                            END
+                        AND ash.sort_value < pivot_sort_value
+                ORDER BY ash.sort_value DESC
+                LIMIT blimit
+                OFFSET ABS(page) * pagesize - boffset
+            ) x ORDER BY row_number DESC;
+    END IF;
+
+    IF page >= 0 THEN
+        -- "bottom" half of the browse results
+        RETURN QUERY
+            SELECT  ash.id
+            FROM  authority.simple_heading ash
+            WHERE ash.atag = ANY (atag_list)
+                    AND CASE thesauruses
+                        WHEN '' THEN TRUE
+                        ELSE ash.thesaurus = ANY(regexp_split_to_array(thesauruses, ','))
+                        END
+                    AND ash.sort_value >= pivot_sort_value
+            ORDER BY ash.sort_value
+            LIMIT alimit
+            OFFSET ABS(page) * pagesize - aoffset;
+    END IF;
+END;
+$$ LANGUAGE PLPGSQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_browse_center( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_center(authority.axis_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_browse_center( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_center(authority.btag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_browse_center( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_center(authority.atag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_browse_center_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_center(authority.axis_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_browse_center_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_center(authority.btag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_browse_center_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_center(authority.atag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_browse_top( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+DECLARE
+    pivot_sort_value    TEXT;
+BEGIN
+
+    pivot_sort_value := authority.simple_heading_find_pivot(atag_list,q,thesauruses);
+
+    IF page < 0 THEN
+         -- "bottom" half of the browse results
+        RETURN QUERY
+            SELECT id FROM (
+                SELECT  ash.id,
+                        row_number() over ()
+                FROM  authority.simple_heading ash
+                WHERE ash.atag = ANY (atag_list)
+                        AND CASE thesauruses
+                            WHEN '' THEN TRUE
+                            ELSE ash.thesaurus = ANY(regexp_split_to_array(thesauruses, ','))
+                            END
+                        AND ash.sort_value < pivot_sort_value
+                ORDER BY ash.sort_value DESC
+                LIMIT pagesize
+                OFFSET (ABS(page) - 1) * pagesize
+            ) x ORDER BY row_number DESC;
+    END IF;
+
+    IF page >= 0 THEN
+         -- "bottom" half of the browse results
+        RETURN QUERY
+            SELECT  ash.id
+            FROM  authority.simple_heading ash
+            WHERE ash.atag = ANY (atag_list)
+                AND CASE thesauruses
+                    WHEN '' THEN TRUE
+                    ELSE ash.thesaurus = ANY(regexp_split_to_array(thesauruses, ','))
+                    END
+                    AND ash.sort_value >= pivot_sort_value
+            ORDER BY ash.sort_value
+            LIMIT pagesize
+            OFFSET ABS(page) * pagesize ;
+    END IF;
+END;
+$$ LANGUAGE PLPGSQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_browse_top( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_top(authority.axis_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_browse_top( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_top(authority.btag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_browse_top( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_top(authority.atag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_browse_top_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_top(authority.axis_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_browse_top_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_top(authority.btag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_browse_top_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_browse_top(authority.atag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_search_rank( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT  ash.id
+      FROM  authority.simple_heading ash,
+            public.naco_normalize($2) t(term),
+            plainto_tsquery('keyword'::regconfig,$2) ptsq(term)
+      WHERE ash.atag = ANY ($1)
+            AND ash.index_vector @@ ptsq.term
+            AND CASE $5
+                WHEN '' THEN TRUE
+                ELSE ash.thesaurus = ANY(regexp_split_to_array($5, ','))
+                END
+      ORDER BY ts_rank_cd(ash.index_vector,ptsq.term,14)::numeric
+                    + CASE WHEN ash.sort_value LIKE t.term || '%' THEN 2 ELSE 0 END
+                    + CASE WHEN ash.value LIKE t.term || '%' THEN 1 ELSE 0 END DESC
+      LIMIT $4
+      OFFSET $4 * $3;
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_search_rank( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_rank(authority.axis_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_search_rank( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_rank(authority.btag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_search_rank( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_rank(authority.atag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_search_rank_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_rank(authority.axis_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_search_rank_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_rank(authority.btag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_search_rank_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_rank(authority.atag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+
+CREATE OR REPLACE FUNCTION authority.simple_heading_search_heading( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT  ash.id
+      FROM  authority.simple_heading ash,
+            public.naco_normalize($2) t(term),
+            plainto_tsquery('keyword'::regconfig,$2) ptsq(term)
+      WHERE ash.atag = ANY ($1)
+            AND ash.index_vector @@ ptsq.term
+            AND CASE $5
+                WHEN '' THEN TRUE
+                ELSE ash.thesaurus = ANY(regexp_split_to_array($5, ','))
+                END
+      ORDER BY ash.sort_value
+      LIMIT $4
+      OFFSET $4 * $3;
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_search_heading( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_heading(authority.axis_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_search_heading( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_heading(authority.btag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_search_heading( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_heading(authority.atag_authority_tags($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.axis_search_heading_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_heading(authority.axis_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.btag_search_heading_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_heading(authority.btag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+CREATE OR REPLACE FUNCTION authority.atag_search_heading_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10, thesauruses TEXT DEFAULT '' ) RETURNS SETOF BIGINT AS $$
+    SELECT * FROM authority.simple_heading_search_heading(authority.atag_authority_tags_refs($1), $2, $3, $4, $5)
+$$ LANGUAGE SQL ROWS 10;
+
+
+\qecho
+\qecho Updating the thesaurus codes in authority.simple_heading;
+\qecho This may take a while in databases with many authority records.
+\qecho
+UPDATE authority.simple_heading a
+SET thesaurus = authority.extract_thesaurus(b.marc)
+FROM authority.record_entry b
+WHERE a.record = b.id;
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/revert/data.additional_authority_fixed_fields.sql b/Open-ILS/src/sql/schema/revert/data.additional_authority_fixed_fields.sql
new file mode 100644 (file)
index 0000000..6191364
--- /dev/null
@@ -0,0 +1,7 @@
+-- Revert evergreen:data.additional_authority_fixed_fields.sql from pg
+
+BEGIN;
+
+-- XXX Add DDLs here.
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/revert/data.adjust_bills_perm.sql b/Open-ILS/src/sql/schema/revert/data.adjust_bills_perm.sql
new file mode 100644 (file)
index 0000000..c27a4bf
--- /dev/null
@@ -0,0 +1,7 @@
+-- Revert evergreen:0944.data.adjust_bills_perm from pg
+
+BEGIN;
+
+-- XXX Add DDLs here.
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/revert/data.authority.control_set_authority_field-remove-sf-e.sql b/Open-ILS/src/sql/schema/revert/data.authority.control_set_authority_field-remove-sf-e.sql
new file mode 100644 (file)
index 0000000..3ce832f
--- /dev/null
@@ -0,0 +1,7 @@
+-- Revert evergreen:data.authority.control_set_authority_field-remove-sf-e from pg
+
+BEGIN;
+
+-- XXX Add DDLs here.
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/revert/schema.dob-as-date.sql b/Open-ILS/src/sql/schema/revert/schema.dob-as-date.sql
new file mode 100644 (file)
index 0000000..1e91270
--- /dev/null
@@ -0,0 +1,7 @@
+-- Revert evergreen:schema.dob-as-date from pg
+
+BEGIN;
+
+-- XXX Add DDLs here.
+
+COMMIT;
diff --git a/Open-ILS/src/sql/schema/revert/schema.filter_authority_browse_search_by_thesaurus.sql b/Open-ILS/src/sql/schema/revert/schema.filter_authority_browse_search_by_thesaurus.sql
new file mode 100644 (file)
index 0000000..10c9d97
--- /dev/null
@@ -0,0 +1,7 @@
+-- Revert evergreen:schema.filter_authority_browse_search_by_thesaurus.sql from pg
+
+BEGIN;
+
+-- XXX Add DDLs here.
+
+COMMIT;
index c0d4edd..b1a74df 100644 (file)
@@ -68,3 +68,8 @@ schema.teach_record_attributes_about_skos [schema.fix_ingest_of_xpath_based_attr
 data.some_rda_attributes [schema.teach_record_attributes_about_skos] 2015-08-28T21:45:03Z Bill Erickson <berickxx@gmail.com> # data.some_rda_attributes
 30day.expiration.prenotice [data.some_rda_attributes] 2015-08-28T21:45:03Z Bill Erickson <berickxx@gmail.com> # 30day.expiration.prenotice
 schema.vlist_freq [30day.expiration.prenotice] 2015-08-28T21:45:04Z Bill Erickson <berickxx@gmail.com> # schema.vlist_freq
+data.authority.control_set_authority_field-remove-sf-e [schema.vlist_freq] 2015-10-15T14:03:42Z Bill Erickson <berickxx@gmail.com> # data.authority.control_set_authority_field-remove-sf-e
+schema.filter_authority_browse_search_by_thesaurus [data.authority.control_set_authority_field-remove-sf-e] 2015-10-15T14:05:34Z Bill Erickson <berickxx@gmail.com> # schema.filter_authority_browse_search_by_thesaurus
+data.additional_authority_fixed_fields [schema.filter_authority_browse_search_by_thesaurus] 2015-10-15T14:06:55Z Bill Erickson <berickxx@gmail.com> # data.additional_authority_fixed_fields
+data.adjust_bills_perm [data.additional_authority_fixed_fields] 2015-10-15T14:08:04Z Bill Erickson <berickxx@gmail.com> # data.additional_authority_fixed_fields
+schema.dob-as-date [data.adjust_bills_perm] 2015-10-15T14:19:48Z Bill Erickson <berickxx@gmail.com> # schema.dob-as-date
diff --git a/Open-ILS/src/sql/schema/verify/data.additional_authority_fixed_fields.sql b/Open-ILS/src/sql/schema/verify/data.additional_authority_fixed_fields.sql
new file mode 100644 (file)
index 0000000..4e06d9e
--- /dev/null
@@ -0,0 +1,7 @@
+-- Verify evergreen:data.additional_authority_fixed_fields.sql on pg
+
+BEGIN;
+
+-- XXX Add verifications here.
+
+ROLLBACK;
diff --git a/Open-ILS/src/sql/schema/verify/data.adjust_bills_perm.sql b/Open-ILS/src/sql/schema/verify/data.adjust_bills_perm.sql
new file mode 100644 (file)
index 0000000..a4f83a3
--- /dev/null
@@ -0,0 +1,7 @@
+-- Verify evergreen:0944.data.adjust_bills_perm on pg
+
+BEGIN;
+
+-- XXX Add verifications here.
+
+ROLLBACK;
diff --git a/Open-ILS/src/sql/schema/verify/data.authority.control_set_authority_field-remove-sf-e.sql b/Open-ILS/src/sql/schema/verify/data.authority.control_set_authority_field-remove-sf-e.sql
new file mode 100644 (file)
index 0000000..a223c37
--- /dev/null
@@ -0,0 +1,7 @@
+-- Verify evergreen:data.authority.control_set_authority_field-remove-sf-e on pg
+
+BEGIN;
+
+-- XXX Add verifications here.
+
+ROLLBACK;
diff --git a/Open-ILS/src/sql/schema/verify/schema.dob-as-date.sql b/Open-ILS/src/sql/schema/verify/schema.dob-as-date.sql
new file mode 100644 (file)
index 0000000..11a29e6
--- /dev/null
@@ -0,0 +1,7 @@
+-- Verify evergreen:schema.dob-as-date on pg
+
+BEGIN;
+
+-- XXX Add verifications here.
+
+ROLLBACK;
diff --git a/Open-ILS/src/sql/schema/verify/schema.filter_authority_browse_search_by_thesaurus.sql b/Open-ILS/src/sql/schema/verify/schema.filter_authority_browse_search_by_thesaurus.sql
new file mode 100644 (file)
index 0000000..ad61d51
--- /dev/null
@@ -0,0 +1,7 @@
+-- Verify evergreen:schema.filter_authority_browse_search_by_thesaurus.sql on pg
+
+BEGIN;
+
+-- XXX Add verifications here.
+
+ROLLBACK;