]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/XXXX.schema-acs-nfi.sql
Address regression causing main headings to be null because the thesaurus code we...
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema-acs-nfi.sql
1 -- XXXX.schema-acs-nfi.sql
2 BEGIN;
3
4 SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
5
6 -- AFTER UPDATE OR INSERT trigger for authority.record_entry
7 CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
8 BEGIN
9
10     IF NEW.deleted IS TRUE THEN -- If this authority is deleted
11         DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible
12         DELETE FROM authority.full_rec WHERE record = NEW.id; -- Avoid validating fields against deleted authority records
13         DELETE FROM authority.simple_heading WHERE record = NEW.id;
14           -- Should remove matching $0 from controlled fields at the same time?
15         RETURN NEW; -- and we're done
16     END IF;
17
18     IF TG_OP = 'UPDATE' THEN -- re-ingest?
19         PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
20
21         IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
22             RETURN NEW;
23         END IF;
24
25         -- Propagate these updates to any linked bib records
26         PERFORM authority.propagate_changes(NEW.id) FROM authority.record_entry WHERE id = NEW.id;
27
28         DELETE FROM authority.simple_heading WHERE record = NEW.id;
29     END IF;
30
31     INSERT INTO authority.simple_heading (record,atag,value,sort_value)
32         SELECT record, atag, value, sort_value FROM authority.simple_heading_set(NEW.marc);
33
34     -- Flatten and insert the afr data
35     PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled;
36     IF NOT FOUND THEN
37         PERFORM authority.reingest_authority_full_rec(NEW.id);
38         PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled;
39         IF NOT FOUND THEN
40             PERFORM authority.reingest_authority_rec_descriptor(NEW.id);
41         END IF;
42     END IF;
43
44     RETURN NEW;
45 END;
46 $func$ LANGUAGE PLPGSQL;
47
48 ALTER TABLE authority.control_set_authority_field ADD COLUMN nfi CHAR(1);
49
50 -- Entries that need to respect an NFI
51 UPDATE authority.control_set_authority_field SET nfi = '2'
52     WHERE id IN (4,24,44,64);
53
54 DROP TRIGGER authority_full_rec_fti_trigger ON authority.full_rec;
55 CREATE TRIGGER authority_full_rec_fti_trigger
56     BEFORE UPDATE OR INSERT ON authority.full_rec
57     FOR EACH ROW EXECUTE PROCEDURE oils_tsearch2('keyword');
58
59 CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT, no_thesaurus BOOL ) RETURNS TEXT AS $func$
60 DECLARE
61     acsaf           authority.control_set_authority_field%ROWTYPE;
62     tag_used        TEXT;
63     nfi_used        TEXT;
64     sf              TEXT;
65     thes_code       TEXT;
66     cset            INT;
67     heading_text    TEXT;
68     tmp_text        TEXT;
69     first_sf        BOOL;
70     auth_id         INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml)::INT;
71 BEGIN
72     SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
73
74     IF cset IS NULL THEN
75         SELECT  control_set INTO cset
76           FROM  authority.control_set_authority_field
77           WHERE tag IN ( SELECT  UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]))
78           LIMIT 1;
79     END IF;
80
81     thes_code := vandelay.marc21_extract_fixed_field(marcxml,'Subj');
82     IF thes_code IS NULL THEN
83         thes_code := '|';
84     ELSIF thes_code = 'z' THEN
85         thes_code := COALESCE( oils_xpath_string('//*[@tag="040"]/*[@code="f"][1]', marcxml), '' );
86     END IF;
87
88     heading_text := '';
89     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset AND main_entry IS NULL LOOP
90         tag_used := acsaf.tag;
91         nfi_used := acsaf.nfi;
92         first_sf := TRUE;
93         FOR sf IN SELECT * FROM regexp_split_to_table(acsaf.sf_list,'') LOOP
94             tmp_text := oils_xpath_string('//*[@tag="'||tag_used||'"]/*[@code="'||sf||'"]', marcxml);
95
96             IF first_sf AND tmp_text IS NOT NULL AND nfi_used IS NOT NULL THEN
97
98                 tmp_text := SUBSTRING(
99                     tmp_text FROM
100                     COALESCE(
101                         NULLIF(
102                             REGEXP_REPLACE(
103                                 oils_xpath_string('//*[@tag="'||tag_used||'"]/@ind'||nfi_used, marcxml),
104                                 $$\D+$$,
105                                 '',
106                                 'g'
107                             ),
108                             ''
109                         )::INT,
110                         0
111                     ) + 1
112                 );
113
114             END IF;
115
116             first_sf := FALSE;
117
118             IF tmp_text IS NOT NULL AND tmp_text <> '' THEN
119                 heading_text := heading_text || E'\u2021' || sf || ' ' || tmp_text;
120             END IF;
121         END LOOP;
122         EXIT WHEN heading_text <> '';
123     END LOOP;
124
125     IF heading_text <> '' THEN
126         IF no_thesaurus IS TRUE THEN
127             heading_text := tag_used || ' ' || public.naco_normalize(heading_text);
128         ELSE
129             heading_text := tag_used || '_' || COALESCE(nfi_used,'-') || '_' || thes_code || ' ' || public.naco_normalize(heading_text);
130         END IF;
131     ELSE
132         heading_text := 'NOHEADING_' || thes_code || ' ' || MD5(marcxml);
133     END IF;
134
135     RETURN heading_text;
136 END;
137 $func$ LANGUAGE PLPGSQL IMMUTABLE;
138
139
140 CREATE TABLE authority.simple_heading (
141     id              BIGSERIAL   PRIMARY KEY,
142     record          BIGINT      NOT NULL REFERENCES authority.record_entry (id),
143     atag            INT         NOT NULL REFERENCES authority.control_set_authority_field (id),
144     value           TEXT        NOT NULL,
145     sort_value      TEXT        NOT NULL,
146     index_vector    tsvector    NOT NULL
147 );
148 CREATE TRIGGER authority_simple_heading_fti_trigger
149     BEFORE UPDATE OR INSERT ON authority.simple_heading
150     FOR EACH ROW EXECUTE PROCEDURE oils_tsearch2('keyword');
151
152 CREATE INDEX authority_simple_heading_index_vector_idx ON authority.simple_heading USING GIST (index_vector);
153 CREATE INDEX authority_simple_heading_value_idx ON authority.simple_heading (value);
154 CREATE INDEX authority_simple_heading_sort_value_idx ON authority.simple_heading (sort_value);
155
156 CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
157 DECLARE
158     res             authority.simple_heading%ROWTYPE;
159     acsaf           authority.control_set_authority_field%ROWTYPE;
160     tag_used        TEXT;
161     nfi_used        TEXT;
162     sf              TEXT;
163     cset            INT;
164     heading_text    TEXT;
165     sort_text       TEXT;
166     tmp_text        TEXT;
167     tmp_xml         TEXT;
168     first_sf        BOOL;
169     auth_id         INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml)::INT;
170 BEGIN
171
172     res.record := auth_id;
173
174     SELECT  control_set INTO cset
175       FROM  authority.control_set_authority_field
176       WHERE tag IN ( SELECT UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]) )
177       LIMIT 1;
178
179     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
180
181         res.atag := acsaf.id;
182         tag_used := acsaf.tag;
183         nfi_used := acsaf.nfi;
184
185         FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)) LOOP
186             heading_text := '';
187
188             FOR sf IN SELECT * FROM regexp_split_to_table(acsaf.sf_list,'') LOOP
189                 heading_text := heading_text || COALESCE( ' ' || oils_xpath_string('//*[@code="'||sf||'"]',tmp_xml::TEXT), '');
190             END LOOP;
191
192             heading_text := public.naco_normalize(heading_text);
193             
194             IF nfi_used IS NOT NULL THEN
195
196                 sort_text := SUBSTRING(
197                     heading_text FROM
198                     COALESCE(
199                         NULLIF(
200                             REGEXP_REPLACE(
201                                 oils_xpath_string('//*[@tag="'||tag_used||'"]/@ind'||nfi_used, marcxml),
202                                 $$\D+$$,
203                                 '',
204                                 'g'
205                             ),
206                             ''
207                         )::INT,
208                         0
209                     ) + 1
210                 );
211
212             ELSE
213                 sort_text := heading_text;
214             END IF;
215
216             IF heading_text IS NOT NULL AND heading_text <> '' THEN
217                 res.value := heading_text;
218                 res.sort_value := sort_text;
219                 RETURN NEXT res;
220             END IF;
221
222         END LOOP;
223
224     END LOOP;
225
226     RETURN;
227 END;
228 $func$ LANGUAGE PLPGSQL IMMUTABLE;
229
230 -- Support function used to find the pivot for alpha-heading-browse style searching
231 CREATE OR REPLACE FUNCTION authority.simple_heading_find_pivot( a INT[], q TEXT ) RETURNS TEXT AS $$
232 DECLARE
233     sort_value_row  RECORD;
234     value_row       RECORD;
235     t_term          TEXT;
236 BEGIN
237
238     t_term := public.naco_normalize(q);
239
240     SELECT  CASE WHEN ash.sort_value LIKE t_term || '%' THEN 1 ELSE 0 END
241                 + CASE WHEN ash.value LIKE t_term || '%' THEN 1 ELSE 0 END AS rank,
242             ash.sort_value
243       INTO  sort_value_row
244       FROM  authority.simple_heading ash
245       WHERE ash.atag = ANY (a)
246             AND ash.sort_value >= t_term
247       ORDER BY rank DESC, ash.sort_value
248       LIMIT 1;
249
250     SELECT  CASE WHEN ash.sort_value LIKE t_term || '%' THEN 1 ELSE 0 END
251                 + CASE WHEN ash.value LIKE t_term || '%' THEN 1 ELSE 0 END AS rank,
252             ash.sort_value
253       INTO  value_row
254       FROM  authority.simple_heading ash
255       WHERE ash.atag = ANY (a)
256             AND ash.value >= t_term
257       ORDER BY rank DESC, ash.sort_value
258       LIMIT 1;
259
260     IF value_row.rank > sort_value_row.rank THEN
261         RETURN value_row.sort_value;
262     ELSE
263         RETURN sort_value_row.sort_value;
264     END IF;
265 END;
266 $$ LANGUAGE PLPGSQL;
267
268
269 CREATE OR REPLACE FUNCTION authority.simple_heading_browse_center( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9 ) RETURNS SETOF BIGINT AS $$
270 DECLARE
271     pivot_sort_value    TEXT;
272     boffset             INT DEFAULT 0;
273     aoffset             INT DEFAULT 0;
274     blimit              INT DEFAULT 0;
275     alimit              INT DEFAULT 0;
276 BEGIN
277
278     pivot_sort_value := authority.simple_heading_find_pivot(atag_list,q);
279
280     IF page = 0 THEN
281         blimit := pagesize / 2;
282         alimit := blimit;
283
284         IF pagesize % 2 <> 0 THEN
285             alimit := alimit + 1;
286         END IF;
287     ELSE
288         blimit := pagesize;
289         alimit := blimit;
290
291         boffset := pagesize / 2;
292         aoffset := boffset;
293
294         IF pagesize % 2 <> 0 THEN
295             boffset := boffset + 1;
296         END IF;
297     END IF;
298
299     IF page <= 0 THEN
300         RETURN QUERY
301             -- "bottom" half of the browse results
302             SELECT id FROM (
303                 SELECT  ash.id,
304                         row_number() over ()
305                   FROM  authority.simple_heading ash
306                   WHERE ash.atag = ANY (atag_list)
307                         AND ash.sort_value < pivot_sort_value
308                   ORDER BY ash.sort_value DESC
309                   LIMIT blimit
310                   OFFSET ABS(page) * pagesize - boffset
311             ) x ORDER BY row_number DESC;
312     END IF;
313
314     IF page >= 0 THEN
315         RETURN QUERY
316             -- "bottom" half of the browse results
317             SELECT  ash.id
318               FROM  authority.simple_heading ash
319               WHERE ash.atag = ANY (atag_list)
320                     AND ash.sort_value >= pivot_sort_value
321               ORDER BY ash.sort_value
322               LIMIT alimit
323               OFFSET ABS(page) * pagesize - aoffset;
324     END IF;
325 END;
326 $$ LANGUAGE PLPGSQL ROWS 10;
327
328 CREATE OR REPLACE FUNCTION authority.simple_heading_browse_top( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
329 DECLARE
330     pivot_sort_value    TEXT;
331 BEGIN
332
333     pivot_sort_value := authority.simple_heading_find_pivot(atag_list,q);
334
335     IF page < 0 THEN
336         RETURN QUERY
337             -- "bottom" half of the browse results
338             SELECT id FROM (
339                 SELECT  ash.id,
340                         row_number() over ()
341                   FROM  authority.simple_heading ash
342                   WHERE ash.atag = ANY (atag_list)
343                         AND ash.sort_value < pivot_sort_value
344                   ORDER BY ash.sort_value DESC
345                   LIMIT pagesize
346                   OFFSET (ABS(page) - 1) * pagesize
347             ) x ORDER BY row_number DESC;
348     END IF;
349
350     IF page >= 0 THEN
351         RETURN QUERY
352             -- "bottom" half of the browse results
353             SELECT  ash.id
354               FROM  authority.simple_heading ash
355               WHERE ash.atag = ANY (atag_list)
356                     AND ash.sort_value >= pivot_sort_value
357               ORDER BY ash.sort_value
358               LIMIT pagesize
359               OFFSET ABS(page) * pagesize ;
360     END IF;
361 END;
362 $$ LANGUAGE PLPGSQL ROWS 10;
363
364 CREATE OR REPLACE FUNCTION authority.simple_heading_search_rank( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
365     SELECT  ash.id
366       FROM  authority.simple_heading ash,
367             public.naco_normalize($2) t(term),
368             plainto_tsquery('keyword'::regconfig,$2) ptsq(term)
369       WHERE ash.atag = ANY ($1)
370             AND ash.index_vector @@ ptsq.term
371       ORDER BY ts_rank_cd(ash.index_vector,ptsq.term,14)::numeric
372                     + CASE WHEN ash.sort_value LIKE t.term || '%' THEN 2 ELSE 0 END
373                     + CASE WHEN ash.value LIKE t.term || '%' THEN 1 ELSE 0 END DESC
374       LIMIT $4
375       OFFSET $4 * $3;
376 $$ LANGUAGE SQL ROWS 10;
377
378 CREATE OR REPLACE FUNCTION authority.simple_heading_search_heading( atag_list INT[], q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
379     SELECT  ash.id
380       FROM  authority.simple_heading ash,
381             public.naco_normalize($2) t(term),
382             plainto_tsquery('keyword'::regconfig,$2) ptsq(term)
383       WHERE ash.atag = ANY ($1)
384             AND ash.index_vector @@ ptsq.term
385       ORDER BY ash.sort_value
386       LIMIT $4
387       OFFSET $4 * $3;
388 $$ LANGUAGE SQL ROWS 10;
389
390
391 CREATE OR REPLACE FUNCTION authority.axis_authority_tags(a TEXT) RETURNS INT[] AS $$
392     SELECT ARRAY_ACCUM(field) FROM authority.browse_axis_authority_field_map WHERE axis = $1;
393 $$ LANGUAGE SQL;
394
395 CREATE OR REPLACE FUNCTION authority.axis_authority_tags_refs(a TEXT) RETURNS INT[] AS $$
396     SELECT  ARRAY_CAT(
397                 ARRAY[a.field],
398                 (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.field)
399             )
400       FROM  authority.browse_axis_authority_field_map a
401       WHERE axis = $1
402 $$ LANGUAGE SQL;
403
404
405
406 CREATE OR REPLACE FUNCTION authority.btag_authority_tags(btag TEXT) RETURNS INT[] AS $$
407     SELECT ARRAY_ACCUM(authority_field) FROM authority.control_set_bib_field WHERE tag = $1
408 $$ LANGUAGE SQL;
409
410 CREATE OR REPLACE FUNCTION authority.btag_authority_tags_refs(btag TEXT) RETURNS INT[] AS $$
411     SELECT  ARRAY_CAT(
412                 ARRAY[a.authority_field],
413                 (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.authority_field)
414             )
415       FROM  authority.control_set_bib_field a
416       WHERE a.tag = $1
417 $$ LANGUAGE SQL;
418
419
420
421 CREATE OR REPLACE FUNCTION authority.atag_authority_tags(atag TEXT) RETURNS INT[] AS $$
422     SELECT ARRAY_ACCUM(id) FROM authority.control_set_authority_field WHERE tag = $1
423 $$ LANGUAGE SQL;
424
425 CREATE OR REPLACE FUNCTION authority.atag_authority_tags_refs(atag TEXT) RETURNS INT[] AS $$
426     SELECT  ARRAY_CAT(
427                 ARRAY[a.id],
428                 (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.id)
429             )
430       FROM  authority.control_set_authority_field a
431       WHERE a.tag = $1
432 $$ LANGUAGE SQL;
433
434
435 CREATE OR REPLACE FUNCTION authority.axis_browse_center( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9 ) RETURNS SETOF BIGINT AS $$
436     SELECT * FROM authority.simple_heading_browse_center(authority.axis_authority_tags($1), $2, $3, $4)
437 $$ LANGUAGE SQL ROWS 10;
438
439 CREATE OR REPLACE FUNCTION authority.btag_browse_center( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9 ) RETURNS SETOF BIGINT AS $$
440     SELECT * FROM authority.simple_heading_browse_center(authority.btag_authority_tags($1), $2, $3, $4)
441 $$ LANGUAGE SQL ROWS 10;
442
443 CREATE OR REPLACE FUNCTION authority.atag_browse_center( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9 ) RETURNS SETOF BIGINT AS $$
444     SELECT * FROM authority.simple_heading_browse_center(authority.atag_authority_tags($1), $2, $3, $4)
445 $$ LANGUAGE SQL ROWS 10;
446
447 CREATE OR REPLACE FUNCTION authority.axis_browse_center_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9 ) RETURNS SETOF BIGINT AS $$
448     SELECT * FROM authority.simple_heading_browse_center(authority.axis_authority_tags_refs($1), $2, $3, $4)
449 $$ LANGUAGE SQL ROWS 10;
450
451 CREATE OR REPLACE FUNCTION authority.btag_browse_center_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9 ) RETURNS SETOF BIGINT AS $$
452     SELECT * FROM authority.simple_heading_browse_center(authority.btag_authority_tags_refs($1), $2, $3, $4)
453 $$ LANGUAGE SQL ROWS 10;
454
455 CREATE OR REPLACE FUNCTION authority.atag_browse_center_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 9 ) RETURNS SETOF BIGINT AS $$
456     SELECT * FROM authority.simple_heading_browse_center(authority.atag_authority_tags_refs($1), $2, $3, $4)
457 $$ LANGUAGE SQL ROWS 10;
458
459
460 CREATE OR REPLACE FUNCTION authority.axis_browse_top( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
461     SELECT * FROM authority.simple_heading_browse_top(authority.axis_authority_tags($1), $2, $3, $4)
462 $$ LANGUAGE SQL ROWS 10;
463
464 CREATE OR REPLACE FUNCTION authority.btag_browse_top( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
465     SELECT * FROM authority.simple_heading_browse_top(authority.btag_authority_tags($1), $2, $3, $4)
466 $$ LANGUAGE SQL ROWS 10;
467
468 CREATE OR REPLACE FUNCTION authority.atag_browse_top( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
469     SELECT * FROM authority.simple_heading_browse_top(authority.atag_authority_tags($1), $2, $3, $4)
470 $$ LANGUAGE SQL ROWS 10;
471
472 CREATE OR REPLACE FUNCTION authority.axis_browse_top_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
473     SELECT * FROM authority.simple_heading_browse_top(authority.axis_authority_tags_refs($1), $2, $3, $4)
474 $$ LANGUAGE SQL ROWS 10;
475
476 CREATE OR REPLACE FUNCTION authority.btag_browse_top_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
477     SELECT * FROM authority.simple_heading_browse_top(authority.btag_authority_tags_refs($1), $2, $3, $4)
478 $$ LANGUAGE SQL ROWS 10;
479
480 CREATE OR REPLACE FUNCTION authority.atag_browse_top_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
481     SELECT * FROM authority.simple_heading_browse_top(authority.atag_authority_tags_refs($1), $2, $3, $4)
482 $$ LANGUAGE SQL ROWS 10;
483
484
485 CREATE OR REPLACE FUNCTION authority.axis_search_rank( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
486     SELECT * FROM authority.simple_heading_search_rank(authority.axis_authority_tags($1), $2, $3, $4)
487 $$ LANGUAGE SQL ROWS 10;
488
489 CREATE OR REPLACE FUNCTION authority.btag_search_rank( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
490     SELECT * FROM authority.simple_heading_search_rank(authority.btag_authority_tags($1), $2, $3, $4)
491 $$ LANGUAGE SQL ROWS 10;
492
493 CREATE OR REPLACE FUNCTION authority.atag_search_rank( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
494     SELECT * FROM authority.simple_heading_search_rank(authority.atag_authority_tags($1), $2, $3, $4)
495 $$ LANGUAGE SQL ROWS 10;
496
497 CREATE OR REPLACE FUNCTION authority.axis_search_rank_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
498     SELECT * FROM authority.simple_heading_search_rank(authority.axis_authority_tags_refs($1), $2, $3, $4)
499 $$ LANGUAGE SQL ROWS 10;
500
501 CREATE OR REPLACE FUNCTION authority.btag_search_rank_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
502     SELECT * FROM authority.simple_heading_search_rank(authority.btag_authority_tags_refs($1), $2, $3, $4)
503 $$ LANGUAGE SQL ROWS 10;
504
505 CREATE OR REPLACE FUNCTION authority.atag_search_rank_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
506     SELECT * FROM authority.simple_heading_search_rank(authority.atag_authority_tags_refs($1), $2, $3, $4)
507 $$ LANGUAGE SQL ROWS 10;
508
509
510 CREATE OR REPLACE FUNCTION authority.axis_search_heading( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
511     SELECT * FROM authority.simple_heading_search_heading(authority.axis_authority_tags($1), $2, $3, $4)
512 $$ LANGUAGE SQL ROWS 10;
513
514 CREATE OR REPLACE FUNCTION authority.btag_search_heading( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
515     SELECT * FROM authority.simple_heading_search_heading(authority.btag_authority_tags($1), $2, $3, $4)
516 $$ LANGUAGE SQL ROWS 10;
517
518 CREATE OR REPLACE FUNCTION authority.atag_search_heading( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
519     SELECT * FROM authority.simple_heading_search_heading(authority.atag_authority_tags($1), $2, $3, $4)
520 $$ LANGUAGE SQL ROWS 10;
521
522 CREATE OR REPLACE FUNCTION authority.axis_search_heading_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
523     SELECT * FROM authority.simple_heading_search_heading(authority.axis_authority_tags_refs($1), $2, $3, $4)
524 $$ LANGUAGE SQL ROWS 10;
525
526 CREATE OR REPLACE FUNCTION authority.btag_search_heading_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
527     SELECT * FROM authority.simple_heading_search_heading(authority.btag_authority_tags_refs($1), $2, $3, $4)
528 $$ LANGUAGE SQL ROWS 10;
529
530 CREATE OR REPLACE FUNCTION authority.atag_search_heading_refs( a TEXT, q TEXT, page INT DEFAULT 0, pagesize INT DEFAULT 10 ) RETURNS SETOF BIGINT AS $$
531     SELECT * FROM authority.simple_heading_search_heading(authority.atag_authority_tags_refs($1), $2, $3, $4)
532 $$ LANGUAGE SQL ROWS 10;
533
534
535 COMMIT;
536