]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0613.schema.vandelay_isxn_normalization.sql
LP1615805 No inputs after submit in patron search (AngularJS)
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0613.schema.vandelay_isxn_normalization.sql
1 -- Evergreen DB patch 0613.schema.vandelay_isxn_normalization.sql
2 --
3 BEGIN;
4
5
6 -- check whether patch can be applied
7 SELECT evergreen.upgrade_deps_block_check('0613', :eg_version);
8
9 CREATE OR REPLACE FUNCTION vandelay.flatten_marc_hstore(
10     record_xml TEXT
11 ) RETURNS HSTORE AS $func$
12 BEGIN
13     RETURN (SELECT
14         HSTORE(
15             ARRAY_ACCUM(tag || (COALESCE(subfield, ''))),
16             ARRAY_ACCUM(value)
17         )
18         FROM (
19             SELECT  tag, subfield, ARRAY_ACCUM(value)::TEXT AS value
20               FROM  (SELECT tag,
21                             subfield,
22                             CASE WHEN tag = '020' THEN -- caseless -- isbn
23                                 LOWER((REGEXP_MATCHES(value,$$^(\S{10,17})$$))[1] || '%')
24                             WHEN tag = '022' THEN -- caseless -- issn
25                                 LOWER((REGEXP_MATCHES(value,$$^(\S{4}[- ]?\S{4})$$))[1] || '%')
26                             WHEN tag = '024' THEN -- caseless -- upc (other)
27                                 LOWER(value || '%')
28                             ELSE
29                                 value
30                             END AS value
31                       FROM  vandelay.flatten_marc(record_xml)) x
32                 GROUP BY tag, subfield ORDER BY tag, subfield
33         ) subquery
34     );
35 END;
36 $func$ LANGUAGE PLPGSQL;
37
38 CREATE OR REPLACE FUNCTION vandelay._get_expr_push_jrow(
39     node vandelay.match_set_point
40 ) RETURNS VOID AS $$
41 DECLARE
42     jrow        TEXT;
43     my_alias    TEXT;
44     op          TEXT;
45     tagkey      TEXT;
46     caseless    BOOL;
47 BEGIN
48     -- remember $1 is tags_rstore, and $2 is svf_rstore
49
50     caseless := FALSE;
51
52     IF node.tag IS NOT NULL THEN
53         caseless := (node.tag IN ('020', '022', '024'));
54         tagkey := node.tag;
55         IF node.subfield IS NOT NULL THEN
56             tagkey := tagkey || node.subfield;
57         END IF;
58     END IF;
59
60     IF node.negate THEN
61         IF caseless THEN
62             op := 'NOT LIKE';
63         ELSE
64             op := '<>';
65         END IF;
66     ELSE
67         IF caseless THEN
68             op := 'LIKE';
69         ELSE
70             op := '=';
71         END IF;
72     END IF;
73
74     my_alias := 'n' || node.id::TEXT;
75
76     jrow := 'LEFT JOIN (SELECT *, ' || node.quality ||
77         ' AS quality FROM metabib.';
78     IF node.tag IS NOT NULL THEN
79         jrow := jrow || 'full_rec) ' || my_alias || ' ON (' ||
80             my_alias || '.record = bre.id AND ' || my_alias || '.tag = ''' ||
81             node.tag || '''';
82         IF node.subfield IS NOT NULL THEN
83             jrow := jrow || ' AND ' || my_alias || '.subfield = ''' ||
84                 node.subfield || '''';
85         END IF;
86         jrow := jrow || ' AND (';
87
88         IF caseless THEN
89             jrow := jrow || 'LOWER(' || my_alias || '.value) ' || op;
90         ELSE
91             jrow := jrow || my_alias || '.value ' || op;
92         END IF;
93
94         jrow := jrow || ' ANY(($1->''' || tagkey || ''')::TEXT[])))';
95     ELSE    -- svf
96         jrow := jrow || 'record_attr) ' || my_alias || ' ON (' ||
97             my_alias || '.id = bre.id AND (' ||
98             my_alias || '.attrs->''' || node.svf ||
99             ''' ' || op || ' $2->''' || node.svf || '''))';
100     END IF;
101     INSERT INTO _vandelay_tmp_jrows (j) VALUES (jrow);
102 END;
103 $$ LANGUAGE PLPGSQL;
104
105
106
107 COMMIT;