Stamped upgrade script for "For vandelay bib matching, make 020, 022, 024 tags case...
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0597.schema.vandelay.bib_match_isxn_caseless.sql
1 -- Evergreen DB patch XXXX.schema.vandelay.bib_match_isxn_caseless.sql
2
3 BEGIN;
4
5 -- check whether patch can be applied
6 SELECT evergreen.upgrade_deps_block_check('0597', :eg_version);
7
8 CREATE INDEX metabib_full_rec_isxn_caseless_idx
9     ON metabib.real_full_rec (LOWER(value))
10     WHERE tag IN ('020', '022', '024');
11
12
13 CREATE OR REPLACE FUNCTION vandelay.flatten_marc_hstore(
14     record_xml TEXT
15 ) RETURNS HSTORE AS $$
16 BEGIN
17     RETURN (SELECT
18         HSTORE(
19             ARRAY_ACCUM(tag || (COALESCE(subfield, ''))),
20             ARRAY_ACCUM(value)
21         )
22         FROM (
23             SELECT
24                 tag, subfield,
25                 CASE WHEN tag IN ('020', '022', '024') THEN  -- caseless
26                     ARRAY_ACCUM(LOWER(value))::TEXT
27                 ELSE
28                     ARRAY_ACCUM(value)::TEXT
29                 END AS value
30                 FROM vandelay.flatten_marc(record_xml)
31                 GROUP BY tag, subfield ORDER BY tag, subfield
32         ) subquery
33     );
34 END;
35 $$ LANGUAGE PLPGSQL;
36
37 CREATE OR REPLACE FUNCTION vandelay._get_expr_push_jrow(
38     node vandelay.match_set_point
39 ) RETURNS VOID AS $$
40 DECLARE
41     jrow        TEXT;
42     my_alias    TEXT;
43     op          TEXT;
44     tagkey      TEXT;
45     caseless    BOOL;
46 BEGIN
47     -- remember $1 is tags_rstore, and $2 is svf_rstore
48
49     IF node.negate THEN
50         op := '<>';
51     ELSE
52         op := '=';
53     END IF;
54
55     caseless := FALSE;
56
57     IF node.tag IS NOT NULL THEN
58         caseless := (node.tag IN ('020', '022', '024'));
59         tagkey := node.tag;
60         IF node.subfield IS NOT NULL THEN
61             tagkey := tagkey || node.subfield;
62         END IF;
63     END IF;
64
65     my_alias := 'n' || node.id::TEXT;
66
67     jrow := 'LEFT JOIN (SELECT *, ' || node.quality ||
68         ' AS quality FROM metabib.';
69     IF node.tag IS NOT NULL THEN
70         jrow := jrow || 'full_rec) ' || my_alias || ' ON (' ||
71             my_alias || '.record = bre.id AND ' || my_alias || '.tag = ''' ||
72             node.tag || '''';
73         IF node.subfield IS NOT NULL THEN
74             jrow := jrow || ' AND ' || my_alias || '.subfield = ''' ||
75                 node.subfield || '''';
76         END IF;
77         jrow := jrow || ' AND (';
78
79         IF caseless THEN
80             jrow := jrow || 'LOWER(' || my_alias || '.value) ' || op;
81         ELSE
82             jrow := jrow || my_alias || '.value ' || op;
83         END IF;
84
85         jrow := jrow || ' ANY(($1->''' || tagkey || ''')::TEXT[])))';
86     ELSE    -- svf
87         jrow := jrow || 'record_attr) ' || my_alias || ' ON (' ||
88             my_alias || '.id = bre.id AND (' ||
89             my_alias || '.attrs->''' || node.svf ||
90             ''' ' || op || ' $2->''' || node.svf || '''))';
91     END IF;
92     INSERT INTO _vandelay_tmp_jrows (j) VALUES (jrow);
93 END;
94 $$ LANGUAGE PLPGSQL;
95
96 COMMIT;