]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0743.schema.remove_tsearch2.sql
LP#1759238: stamping upgrade script
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0743.schema.remove_tsearch2.sql
1 -- Evergreen DB patch 0743.schema.remove_tsearch2.sql
2 --
3 -- Enable native full-text search to be used, and drop TSearch2 extension
4 --
5 BEGIN;
6
7 -- check whether patch can be applied
8 SELECT evergreen.upgrade_deps_block_check('0743', :eg_version);
9
10 -- FIXME: add/check SQL statements to perform the upgrade
11 -- First up, these functions depend on metabib.full_rec. They have to go for now.
12 DROP FUNCTION IF EXISTS biblio.flatten_marc(bigint);
13 DROP FUNCTION IF EXISTS biblio.flatten_marc(text);
14
15 -- These views depend on metabib.full_rec as well. Bye-bye!
16 DROP VIEW IF EXISTS reporter.old_super_simple_record;
17 DROP VIEW IF EXISTS reporter.simple_record;
18 DROP VIEW IF EXISTS reporter.classic_item_list;
19
20 \echo WARNING: The reporter.classic_item_list view was dropped if it existed.
21 \echo If you use that view, please run the example.reporter-extension.sql script
22 \echo to recreate it after rest of the schema upgrade is complete.
23
24 -- Now we can drop metabib.full_rec.
25 DROP VIEW IF EXISTS metabib.full_rec;
26
27 -- These indexes have to go. BEFORE we alter the tables, otherwise things take extra time when we alter the tables.
28 DROP INDEX metabib.metabib_author_field_entry_value_idx;
29 DROP INDEX metabib.metabib_identifier_field_entry_value_idx;
30 DROP INDEX metabib.metabib_keyword_field_entry_value_idx;
31 DROP INDEX metabib.metabib_series_field_entry_value_idx;
32 DROP INDEX metabib.metabib_subject_field_entry_value_idx;
33 DROP INDEX metabib.metabib_title_field_entry_value_idx;
34
35 -- Now grab all of the tsvector-enabled columns and switch them to the non-wrapper version of the type.
36 ALTER TABLE authority.full_rec ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
37 ALTER TABLE authority.simple_heading ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
38 ALTER TABLE metabib.real_full_rec ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
39 ALTER TABLE metabib.author_field_entry ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
40 ALTER TABLE metabib.browse_entry ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
41 ALTER TABLE metabib.identifier_field_entry ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
42 ALTER TABLE metabib.keyword_field_entry ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
43 ALTER TABLE metabib.series_field_entry ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
44 ALTER TABLE metabib.subject_field_entry ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
45 ALTER TABLE metabib.title_field_entry ALTER COLUMN index_vector TYPE pg_catalog.tsvector;
46
47 -- Make sure that tsearch2 exists as an extension (for a sufficiently
48 -- old Evergreen database, it might still be an unpackaged contrib).
49 CREATE EXTENSION IF NOT EXISTS tsearch2 SCHEMA public FROM unpackaged;
50 -- Halfway there! Goodbye tsearch2 extension!
51 DROP EXTENSION tsearch2;
52
53 -- Next up, re-creating all of the stuff we just dropped.
54
55 -- Indexes! Note to whomever: Do we even need these anymore?
56 CREATE INDEX metabib_author_field_entry_value_idx ON metabib.author_field_entry (SUBSTRING(value,1,1024)) WHERE index_vector = ''::TSVECTOR;
57 CREATE INDEX metabib_identifier_field_entry_value_idx ON metabib.identifier_field_entry (SUBSTRING(value,1,1024)) WHERE index_vector = ''::TSVECTOR;
58 CREATE INDEX metabib_keyword_field_entry_value_idx ON metabib.keyword_field_entry (SUBSTRING(value,1,1024)) WHERE index_vector = ''::TSVECTOR;
59 CREATE INDEX metabib_series_field_entry_value_idx ON metabib.series_field_entry (SUBSTRING(value,1,1024)) WHERE index_vector = ''::TSVECTOR;
60 CREATE INDEX metabib_subject_field_entry_value_idx ON metabib.subject_field_entry (SUBSTRING(value,1,1024)) WHERE index_vector = ''::TSVECTOR;
61 CREATE INDEX metabib_title_field_entry_value_idx ON metabib.title_field_entry (SUBSTRING(value,1,1024)) WHERE index_vector = ''::TSVECTOR;
62
63 -- metabib.full_rec, with insert/update/delete rules
64 CREATE OR REPLACE VIEW metabib.full_rec AS
65     SELECT  id,
66             record,
67             tag,
68             ind1,
69             ind2,
70             subfield,
71             SUBSTRING(value,1,1024) AS value,
72             index_vector
73       FROM  metabib.real_full_rec;
74
75 CREATE OR REPLACE RULE metabib_full_rec_insert_rule
76     AS ON INSERT TO metabib.full_rec
77     DO INSTEAD
78     INSERT INTO metabib.real_full_rec VALUES (
79         COALESCE(NEW.id, NEXTVAL('metabib.full_rec_id_seq'::REGCLASS)),
80         NEW.record,
81         NEW.tag,
82         NEW.ind1,
83         NEW.ind2,
84         NEW.subfield,
85         NEW.value,
86         NEW.index_vector
87     );
88
89 CREATE OR REPLACE RULE metabib_full_rec_update_rule
90     AS ON UPDATE TO metabib.full_rec
91     DO INSTEAD
92     UPDATE  metabib.real_full_rec SET
93         id = NEW.id,
94         record = NEW.record,
95         tag = NEW.tag,
96         ind1 = NEW.ind1,
97         ind2 = NEW.ind2,
98         subfield = NEW.subfield,
99         value = NEW.value,
100         index_vector = NEW.index_vector
101       WHERE id = OLD.id;
102
103 CREATE OR REPLACE RULE metabib_full_rec_delete_rule
104     AS ON DELETE TO metabib.full_rec
105     DO INSTEAD
106     DELETE FROM metabib.real_full_rec WHERE id = OLD.id;
107
108 -- reporter views that depended on metabib.full_rec are up next
109 CREATE OR REPLACE VIEW reporter.simple_record AS
110 SELECT  r.id,
111     s.metarecord,
112     r.fingerprint,
113     r.quality,
114     r.tcn_source,
115     r.tcn_value,
116     title.value AS title,
117     uniform_title.value AS uniform_title,
118     author.value AS author,
119     publisher.value AS publisher,
120     SUBSTRING(pubdate.value FROM $$\d+$$) AS pubdate,
121     series_title.value AS series_title,
122     series_statement.value AS series_statement,
123     summary.value AS summary,
124     ARRAY_ACCUM( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') ) AS isbn,
125     ARRAY_ACCUM( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') ) AS issn,
126     ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '650' AND subfield = 'a' AND record = r.id)) AS topic_subject,
127     ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '651' AND subfield = 'a' AND record = r.id)) AS geographic_subject,
128     ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '655' AND subfield = 'a' AND record = r.id)) AS genre,
129     ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '600' AND subfield = 'a' AND record = r.id)) AS name_subject,
130     ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '610' AND subfield = 'a' AND record = r.id)) AS corporate_subject,
131     ARRAY((SELECT value FROM metabib.full_rec WHERE tag = '856' AND subfield IN ('3','y','u') AND record = r.id ORDER BY CASE WHEN subfield IN ('3','y') THEN 0 ELSE 1 END)) AS external_uri
132   FROM  biblio.record_entry r
133     JOIN metabib.metarecord_source_map s ON (s.source = r.id)
134     LEFT JOIN metabib.full_rec uniform_title ON (r.id = uniform_title.record AND uniform_title.tag = '240' AND uniform_title.subfield = 'a')
135     LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
136     LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag = '100' AND author.subfield = 'a')
137     LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
138     LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
139     LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
140     LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
141     LEFT JOIN metabib.full_rec series_title ON (r.id = series_title.record AND series_title.tag IN ('830','440') AND series_title.subfield = 'a')
142     LEFT JOIN metabib.full_rec series_statement ON (r.id = series_statement.record AND series_statement.tag = '490' AND series_statement.subfield = 'a')
143     LEFT JOIN metabib.full_rec summary ON (r.id = summary.record AND summary.tag = '520' AND summary.subfield = 'a')
144   GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14;
145
146 CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
147 SELECT  r.id,
148     r.fingerprint,
149     r.quality,
150     r.tcn_source,
151     r.tcn_value,
152     FIRST(title.value) AS title,
153     FIRST(author.value) AS author,
154     ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT publisher.value), ', ') AS publisher,
155     ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT SUBSTRING(pubdate.value FROM $$\d+$$) ), ', ') AS pubdate,
156     ARRAY_ACCUM( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') ) AS isbn,
157     ARRAY_ACCUM( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') ) AS issn
158   FROM  biblio.record_entry r
159     LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
160     LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
161     LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
162     LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
163     LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
164     LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
165   GROUP BY 1,2,3,4,5;
166
167 -- And finally, the biblio functions. NOTE: I can't find the original source of the second one, so I skipped it as old cruft that was in our production DB.
168 CREATE OR REPLACE FUNCTION biblio.flatten_marc ( rid BIGINT ) RETURNS SETOF metabib.full_rec AS $func$
169 DECLARE
170     bib biblio.record_entry%ROWTYPE;
171     output  metabib.full_rec%ROWTYPE;
172     field   RECORD;
173 BEGIN
174     SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
175
176     FOR field IN SELECT * FROM vandelay.flatten_marc( bib.marc ) LOOP
177         output.record := rid;
178         output.ind1 := field.ind1;
179         output.ind2 := field.ind2;
180         output.tag := field.tag;
181         output.subfield := field.subfield;
182         output.value := field.value;
183
184         RETURN NEXT output;
185     END LOOP;
186 END;
187 $func$ LANGUAGE PLPGSQL;
188
189 COMMIT;