]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0640.schema-acs-nfi.sql
LP#1248734: (follow-up) add new indexes to schema update script
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0640.schema-acs-nfi.sql
1 -- XXXX.schema-acs-nfi.sql
2 BEGIN;
3
4 SELECT evergreen.upgrade_deps_block_check('0640', :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 CREATE OR REPLACE FUNCTION authority.simple_normalize_heading( marcxml TEXT ) RETURNS TEXT AS $func$
140     SELECT authority.normalize_heading($1, TRUE);
141 $func$ LANGUAGE SQL IMMUTABLE;
142
143 CREATE OR REPLACE FUNCTION authority.normalize_heading( marcxml TEXT ) RETURNS TEXT AS $func$
144     SELECT authority.normalize_heading($1, FALSE);
145 $func$ LANGUAGE SQL IMMUTABLE;
146
147
148 CREATE TABLE authority.simple_heading (
149     id              BIGSERIAL   PRIMARY KEY,
150     record          BIGINT      NOT NULL REFERENCES authority.record_entry (id),
151     atag            INT         NOT NULL REFERENCES authority.control_set_authority_field (id),
152     value           TEXT        NOT NULL,
153     sort_value      TEXT        NOT NULL,
154     index_vector    tsvector    NOT NULL
155 );
156 CREATE TRIGGER authority_simple_heading_fti_trigger
157     BEFORE UPDATE OR INSERT ON authority.simple_heading
158     FOR EACH ROW EXECUTE PROCEDURE oils_tsearch2('keyword');
159
160 CREATE INDEX authority_simple_heading_index_vector_idx ON authority.simple_heading USING GIST (index_vector);
161 CREATE INDEX authority_simple_heading_value_idx ON authority.simple_heading (value);
162 CREATE INDEX authority_simple_heading_sort_value_idx ON authority.simple_heading (sort_value);
163
164 CREATE OR REPLACE FUNCTION authority.simple_heading_set( marcxml TEXT ) RETURNS SETOF authority.simple_heading AS $func$
165 DECLARE
166     res             authority.simple_heading%ROWTYPE;
167     acsaf           authority.control_set_authority_field%ROWTYPE;
168     tag_used        TEXT;
169     nfi_used        TEXT;
170     sf              TEXT;
171     cset            INT;
172     heading_text    TEXT;
173     sort_text       TEXT;
174     tmp_text        TEXT;
175     tmp_xml         TEXT;
176     first_sf        BOOL;
177     auth_id         INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', marcxml)::INT;
178 BEGIN
179
180     res.record := auth_id;
181
182     SELECT  control_set INTO cset
183       FROM  authority.control_set_authority_field
184       WHERE tag IN ( SELECT UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marcxml::XML)::TEXT[]) )
185       LIMIT 1;
186
187     FOR acsaf IN SELECT * FROM authority.control_set_authority_field WHERE control_set = cset LOOP
188
189         res.atag := acsaf.id;
190         tag_used := acsaf.tag;
191         nfi_used := acsaf.nfi;
192
193         FOR tmp_xml IN SELECT UNNEST(XPATH('//*[@tag="'||tag_used||'"]', marcxml::XML)) LOOP
194             heading_text := '';
195
196             FOR sf IN SELECT * FROM regexp_split_to_table(acsaf.sf_list,'') LOOP
197                 heading_text := heading_text || COALESCE( ' ' || oils_xpath_string('//*[@code="'||sf||'"]',tmp_xml::TEXT), '');
198             END LOOP;
199
200             heading_text := public.naco_normalize(heading_text);
201             
202             IF nfi_used IS NOT NULL THEN
203
204                 sort_text := SUBSTRING(
205                     heading_text FROM
206                     COALESCE(
207                         NULLIF(
208                             REGEXP_REPLACE(
209                                 oils_xpath_string('//*[@tag="'||tag_used||'"]/@ind'||nfi_used, marcxml),
210                                 $$\D+$$,
211                                 '',
212                                 'g'
213                             ),
214                             ''
215                         )::INT,
216                         0
217                     ) + 1
218                 );
219
220             ELSE
221                 sort_text := heading_text;
222             END IF;
223
224             IF heading_text IS NOT NULL AND heading_text <> '' THEN
225                 res.value := heading_text;
226                 res.sort_value := sort_text;
227                 RETURN NEXT res;
228             END IF;
229
230         END LOOP;
231
232     END LOOP;
233
234     RETURN;
235 END;
236 $func$ LANGUAGE PLPGSQL IMMUTABLE;
237
238 -- Support function used to find the pivot for alpha-heading-browse style searching
239 CREATE OR REPLACE FUNCTION authority.simple_heading_find_pivot( a INT[], q TEXT ) RETURNS TEXT AS $$
240 DECLARE
241     sort_value_row  RECORD;
242     value_row       RECORD;
243     t_term          TEXT;
244 BEGIN
245
246     t_term := public.naco_normalize(q);
247
248     SELECT  CASE WHEN ash.sort_value LIKE t_term || '%' THEN 1 ELSE 0 END
249                 + CASE WHEN ash.value LIKE t_term || '%' THEN 1 ELSE 0 END AS rank,
250             ash.sort_value
251       INTO  sort_value_row
252       FROM  authority.simple_heading ash
253       WHERE ash.atag = ANY (a)
254             AND ash.sort_value >= t_term
255       ORDER BY rank DESC, ash.sort_value
256       LIMIT 1;
257
258     SELECT  CASE WHEN ash.sort_value LIKE t_term || '%' THEN 1 ELSE 0 END
259                 + CASE WHEN ash.value LIKE t_term || '%' THEN 1 ELSE 0 END AS rank,
260             ash.sort_value
261       INTO  value_row
262       FROM  authority.simple_heading ash
263       WHERE ash.atag = ANY (a)
264             AND ash.value >= t_term
265       ORDER BY rank DESC, ash.sort_value
266       LIMIT 1;
267
268     IF value_row.rank > sort_value_row.rank THEN
269         RETURN value_row.sort_value;
270     ELSE
271         RETURN sort_value_row.sort_value;
272     END IF;
273 END;
274 $$ LANGUAGE PLPGSQL;
275
276
277 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 $$
278 DECLARE
279     pivot_sort_value    TEXT;
280     boffset             INT DEFAULT 0;
281     aoffset             INT DEFAULT 0;
282     blimit              INT DEFAULT 0;
283     alimit              INT DEFAULT 0;
284 BEGIN
285
286     pivot_sort_value := authority.simple_heading_find_pivot(atag_list,q);
287
288     IF page = 0 THEN
289         blimit := pagesize / 2;
290         alimit := blimit;
291
292         IF pagesize % 2 <> 0 THEN
293             alimit := alimit + 1;
294         END IF;
295     ELSE
296         blimit := pagesize;
297         alimit := blimit;
298
299         boffset := pagesize / 2;
300         aoffset := boffset;
301
302         IF pagesize % 2 <> 0 THEN
303             boffset := boffset + 1;
304         END IF;
305     END IF;
306
307     IF page <= 0 THEN
308         RETURN QUERY
309             -- "bottom" half of the browse results
310             SELECT id FROM (
311                 SELECT  ash.id,
312                         row_number() over ()
313                   FROM  authority.simple_heading ash
314                   WHERE ash.atag = ANY (atag_list)
315                         AND ash.sort_value < pivot_sort_value
316                   ORDER BY ash.sort_value DESC
317                   LIMIT blimit
318                   OFFSET ABS(page) * pagesize - boffset
319             ) x ORDER BY row_number DESC;
320     END IF;
321
322     IF page >= 0 THEN
323         RETURN QUERY
324             -- "bottom" half of the browse results
325             SELECT  ash.id
326               FROM  authority.simple_heading ash
327               WHERE ash.atag = ANY (atag_list)
328                     AND ash.sort_value >= pivot_sort_value
329               ORDER BY ash.sort_value
330               LIMIT alimit
331               OFFSET ABS(page) * pagesize - aoffset;
332     END IF;
333 END;
334 $$ LANGUAGE PLPGSQL ROWS 10;
335
336 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 $$
337 DECLARE
338     pivot_sort_value    TEXT;
339 BEGIN
340
341     pivot_sort_value := authority.simple_heading_find_pivot(atag_list,q);
342
343     IF page < 0 THEN
344         RETURN QUERY
345             -- "bottom" half of the browse results
346             SELECT id FROM (
347                 SELECT  ash.id,
348                         row_number() over ()
349                   FROM  authority.simple_heading ash
350                   WHERE ash.atag = ANY (atag_list)
351                         AND ash.sort_value < pivot_sort_value
352                   ORDER BY ash.sort_value DESC
353                   LIMIT pagesize
354                   OFFSET (ABS(page) - 1) * pagesize
355             ) x ORDER BY row_number DESC;
356     END IF;
357
358     IF page >= 0 THEN
359         RETURN QUERY
360             -- "bottom" half of the browse results
361             SELECT  ash.id
362               FROM  authority.simple_heading ash
363               WHERE ash.atag = ANY (atag_list)
364                     AND ash.sort_value >= pivot_sort_value
365               ORDER BY ash.sort_value
366               LIMIT pagesize
367               OFFSET ABS(page) * pagesize ;
368     END IF;
369 END;
370 $$ LANGUAGE PLPGSQL ROWS 10;
371
372 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 $$
373     SELECT  ash.id
374       FROM  authority.simple_heading ash,
375             public.naco_normalize($2) t(term),
376             plainto_tsquery('keyword'::regconfig,$2) ptsq(term)
377       WHERE ash.atag = ANY ($1)
378             AND ash.index_vector @@ ptsq.term
379       ORDER BY ts_rank_cd(ash.index_vector,ptsq.term,14)::numeric
380                     + CASE WHEN ash.sort_value LIKE t.term || '%' THEN 2 ELSE 0 END
381                     + CASE WHEN ash.value LIKE t.term || '%' THEN 1 ELSE 0 END DESC
382       LIMIT $4
383       OFFSET $4 * $3;
384 $$ LANGUAGE SQL ROWS 10;
385
386 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 $$
387     SELECT  ash.id
388       FROM  authority.simple_heading ash,
389             public.naco_normalize($2) t(term),
390             plainto_tsquery('keyword'::regconfig,$2) ptsq(term)
391       WHERE ash.atag = ANY ($1)
392             AND ash.index_vector @@ ptsq.term
393       ORDER BY ash.sort_value
394       LIMIT $4
395       OFFSET $4 * $3;
396 $$ LANGUAGE SQL ROWS 10;
397
398
399 CREATE OR REPLACE FUNCTION authority.axis_authority_tags(a TEXT) RETURNS INT[] AS $$
400     SELECT ARRAY_ACCUM(field) FROM authority.browse_axis_authority_field_map WHERE axis = $1;
401 $$ LANGUAGE SQL;
402
403 CREATE OR REPLACE FUNCTION authority.axis_authority_tags_refs(a TEXT) RETURNS INT[] AS $$
404     SELECT  ARRAY_CAT(
405                 ARRAY[a.field],
406                 (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.field)
407             )
408       FROM  authority.browse_axis_authority_field_map a
409       WHERE axis = $1
410 $$ LANGUAGE SQL;
411
412
413
414 CREATE OR REPLACE FUNCTION authority.btag_authority_tags(btag TEXT) RETURNS INT[] AS $$
415     SELECT ARRAY_ACCUM(authority_field) FROM authority.control_set_bib_field WHERE tag = $1
416 $$ LANGUAGE SQL;
417
418 CREATE OR REPLACE FUNCTION authority.btag_authority_tags_refs(btag TEXT) RETURNS INT[] AS $$
419     SELECT  ARRAY_CAT(
420                 ARRAY[a.authority_field],
421                 (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.authority_field)
422             )
423       FROM  authority.control_set_bib_field a
424       WHERE a.tag = $1
425 $$ LANGUAGE SQL;
426
427
428
429 CREATE OR REPLACE FUNCTION authority.atag_authority_tags(atag TEXT) RETURNS INT[] AS $$
430     SELECT ARRAY_ACCUM(id) FROM authority.control_set_authority_field WHERE tag = $1
431 $$ LANGUAGE SQL;
432
433 CREATE OR REPLACE FUNCTION authority.atag_authority_tags_refs(atag TEXT) RETURNS INT[] AS $$
434     SELECT  ARRAY_CAT(
435                 ARRAY[a.id],
436                 (SELECT ARRAY_ACCUM(x.id) FROM authority.control_set_authority_field x WHERE x.main_entry = a.id)
437             )
438       FROM  authority.control_set_authority_field a
439       WHERE a.tag = $1
440 $$ LANGUAGE SQL;
441
442
443 CREATE OR REPLACE FUNCTION authority.axis_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.axis_authority_tags($1), $2, $3, $4)
445 $$ LANGUAGE SQL ROWS 10;
446
447 CREATE OR REPLACE FUNCTION authority.btag_browse_center( 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.btag_authority_tags($1), $2, $3, $4)
449 $$ LANGUAGE SQL ROWS 10;
450
451 CREATE OR REPLACE FUNCTION authority.atag_browse_center( 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.atag_authority_tags($1), $2, $3, $4)
453 $$ LANGUAGE SQL ROWS 10;
454
455 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 $$
456     SELECT * FROM authority.simple_heading_browse_center(authority.axis_authority_tags_refs($1), $2, $3, $4)
457 $$ LANGUAGE SQL ROWS 10;
458
459 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 $$
460     SELECT * FROM authority.simple_heading_browse_center(authority.btag_authority_tags_refs($1), $2, $3, $4)
461 $$ LANGUAGE SQL ROWS 10;
462
463 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 $$
464     SELECT * FROM authority.simple_heading_browse_center(authority.atag_authority_tags_refs($1), $2, $3, $4)
465 $$ LANGUAGE SQL ROWS 10;
466
467
468 CREATE OR REPLACE FUNCTION authority.axis_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.axis_authority_tags($1), $2, $3, $4)
470 $$ LANGUAGE SQL ROWS 10;
471
472 CREATE OR REPLACE FUNCTION authority.btag_browse_top( 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.btag_authority_tags($1), $2, $3, $4)
474 $$ LANGUAGE SQL ROWS 10;
475
476 CREATE OR REPLACE FUNCTION authority.atag_browse_top( 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.atag_authority_tags($1), $2, $3, $4)
478 $$ LANGUAGE SQL ROWS 10;
479
480 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 $$
481     SELECT * FROM authority.simple_heading_browse_top(authority.axis_authority_tags_refs($1), $2, $3, $4)
482 $$ LANGUAGE SQL ROWS 10;
483
484 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 $$
485     SELECT * FROM authority.simple_heading_browse_top(authority.btag_authority_tags_refs($1), $2, $3, $4)
486 $$ LANGUAGE SQL ROWS 10;
487
488 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 $$
489     SELECT * FROM authority.simple_heading_browse_top(authority.atag_authority_tags_refs($1), $2, $3, $4)
490 $$ LANGUAGE SQL ROWS 10;
491
492
493 CREATE OR REPLACE FUNCTION authority.axis_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.axis_authority_tags($1), $2, $3, $4)
495 $$ LANGUAGE SQL ROWS 10;
496
497 CREATE OR REPLACE FUNCTION authority.btag_search_rank( 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.btag_authority_tags($1), $2, $3, $4)
499 $$ LANGUAGE SQL ROWS 10;
500
501 CREATE OR REPLACE FUNCTION authority.atag_search_rank( 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.atag_authority_tags($1), $2, $3, $4)
503 $$ LANGUAGE SQL ROWS 10;
504
505 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 $$
506     SELECT * FROM authority.simple_heading_search_rank(authority.axis_authority_tags_refs($1), $2, $3, $4)
507 $$ LANGUAGE SQL ROWS 10;
508
509 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 $$
510     SELECT * FROM authority.simple_heading_search_rank(authority.btag_authority_tags_refs($1), $2, $3, $4)
511 $$ LANGUAGE SQL ROWS 10;
512
513 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 $$
514     SELECT * FROM authority.simple_heading_search_rank(authority.atag_authority_tags_refs($1), $2, $3, $4)
515 $$ LANGUAGE SQL ROWS 10;
516
517
518 CREATE OR REPLACE FUNCTION authority.axis_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.axis_authority_tags($1), $2, $3, $4)
520 $$ LANGUAGE SQL ROWS 10;
521
522 CREATE OR REPLACE FUNCTION authority.btag_search_heading( 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.btag_authority_tags($1), $2, $3, $4)
524 $$ LANGUAGE SQL ROWS 10;
525
526 CREATE OR REPLACE FUNCTION authority.atag_search_heading( 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.atag_authority_tags($1), $2, $3, $4)
528 $$ LANGUAGE SQL ROWS 10;
529
530 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 $$
531     SELECT * FROM authority.simple_heading_search_heading(authority.axis_authority_tags_refs($1), $2, $3, $4)
532 $$ LANGUAGE SQL ROWS 10;
533
534 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 $$
535     SELECT * FROM authority.simple_heading_search_heading(authority.btag_authority_tags_refs($1), $2, $3, $4)
536 $$ LANGUAGE SQL ROWS 10;
537
538 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 $$
539     SELECT * FROM authority.simple_heading_search_heading(authority.atag_authority_tags_refs($1), $2, $3, $4)
540 $$ LANGUAGE SQL ROWS 10;
541
542
543 COMMIT;
544