]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0515.schema.copy-vis-cache.sql
Stamping upgrade script for revive-qp-fts (LP 1161601).
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0515.schema.copy-vis-cache.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0515'); -- miker
4
5 CREATE OR REPLACE FUNCTION asset.cache_copy_visibility () RETURNS TRIGGER as $func$
6 DECLARE
7     add_query       TEXT;
8     remove_query    TEXT;
9     do_add          BOOLEAN := false;
10     do_remove       BOOLEAN := false;
11 BEGIN
12     add_query := $$
13             INSERT INTO asset.opac_visible_copies (copy_id, circ_lib, record)
14               SELECT id, circ_lib, record FROM (
15                 SELECT  cp.id, cp.circ_lib, cn.record, cn.id AS call_number
16                   FROM  asset.copy cp
17                         JOIN asset.call_number cn ON (cn.id = cp.call_number)
18                         JOIN actor.org_unit a ON (cp.circ_lib = a.id)
19                         JOIN asset.copy_location cl ON (cp.location = cl.id)
20                         JOIN config.copy_status cs ON (cp.status = cs.id)
21                         JOIN biblio.record_entry b ON (cn.record = b.id)
22                   WHERE NOT cp.deleted
23                         AND NOT cn.deleted
24                         AND NOT b.deleted
25                         AND cs.opac_visible
26                         AND cl.opac_visible
27                         AND cp.opac_visible
28                         AND a.opac_visible
29                             UNION
30                 SELECT  cp.id, cp.circ_lib, pbcm.peer_record AS record, NULL AS call_number
31                   FROM  asset.copy cp
32                         JOIN biblio.peer_bib_copy_map pbcm ON (pbcm.target_copy = cp.id)
33                         JOIN actor.org_unit a ON (cp.circ_lib = a.id)
34                         JOIN asset.copy_location cl ON (cp.location = cl.id)
35                         JOIN config.copy_status cs ON (cp.status = cs.id)
36                   WHERE NOT cp.deleted
37                         AND cs.opac_visible
38                         AND cl.opac_visible
39                         AND cp.opac_visible
40                         AND a.opac_visible
41                     ) AS x 
42
43     $$;
44  
45     remove_query := $$ DELETE FROM asset.opac_visible_copies WHERE copy_id IN ( SELECT id FROM asset.copy WHERE $$;
46
47     IF TG_TABLE_NAME = 'peer_bib_copy_map' THEN
48         IF TG_OP = 'INSERT' THEN
49             add_query := add_query || 'WHERE x.id = ' || NEW.target_copy || ' AND x.record = ' || NEW.peer_record || ';';
50             EXECUTE add_query;
51             RETURN NEW;
52         ELSE
53             remove_query := 'DELETE FROM asset.opac_visible_copies WHERE copy_id = ' || OLD.target_copy || ' AND record = ' || OLD.peer_record || ';';
54             EXECUTE remove_query;
55             RETURN OLD;
56         END IF;
57     END IF;
58
59     IF TG_OP = 'INSERT' THEN
60
61         IF TG_TABLE_NAME IN ('copy', 'unit') THEN
62             add_query := add_query || 'WHERE x.id = ' || NEW.id || ';';
63             EXECUTE add_query;
64         END IF;
65
66         RETURN NEW;
67
68     END IF;
69
70     -- handle items first, since with circulation activity
71     -- their statuses change frequently
72     IF TG_TABLE_NAME IN ('copy', 'unit') THEN
73
74         IF OLD.location    <> NEW.location OR
75            OLD.call_number <> NEW.call_number OR
76            OLD.status      <> NEW.status OR
77            OLD.circ_lib    <> NEW.circ_lib THEN
78             -- any of these could change visibility, but
79             -- we'll save some queries and not try to calculate
80             -- the change directly
81             do_remove := true;
82             do_add := true;
83         ELSE
84
85             IF OLD.deleted <> NEW.deleted THEN
86                 IF NEW.deleted THEN
87                     do_remove := true;
88                 ELSE
89                     do_add := true;
90                 END IF;
91             END IF;
92
93             IF OLD.opac_visible <> NEW.opac_visible THEN
94                 IF OLD.opac_visible THEN
95                     do_remove := true;
96                 ELSIF NOT do_remove THEN -- handle edge case where deleted item
97                                         -- is also marked opac_visible
98                     do_add := true;
99                 END IF;
100             END IF;
101
102         END IF;
103
104         IF do_remove THEN
105             DELETE FROM asset.opac_visible_copies WHERE copy_id = NEW.id;
106         END IF;
107         IF do_add THEN
108             add_query := add_query || 'WHERE x.id = ' || NEW.id || ';';
109             EXECUTE add_query;
110         END IF;
111
112         RETURN NEW;
113
114     END IF;
115
116     IF TG_TABLE_NAME IN ('call_number', 'record_entry') THEN -- these have a 'deleted' column
117  
118         IF OLD.deleted AND NEW.deleted THEN -- do nothing
119
120             RETURN NEW;
121  
122         ELSIF NEW.deleted THEN -- remove rows
123  
124             IF TG_TABLE_NAME = 'call_number' THEN
125                 DELETE FROM asset.opac_visible_copies WHERE copy_id IN (SELECT id FROM asset.copy WHERE call_number = NEW.id);
126             ELSIF TG_TABLE_NAME = 'record_entry' THEN
127                 DELETE FROM asset.opac_visible_copies WHERE record = NEW.id;
128             END IF;
129  
130             RETURN NEW;
131  
132         ELSIF OLD.deleted THEN -- add rows
133  
134             IF TG_TABLE_NAME IN ('copy','unit') THEN
135                 add_query := add_query || 'WHERE x.id = ' || NEW.id || ';';
136             ELSIF TG_TABLE_NAME = 'call_number' THEN
137                 add_query := add_query || 'WHERE x.call_number = ' || NEW.id || ';';
138             ELSIF TG_TABLE_NAME = 'record_entry' THEN
139                 add_query := add_query || 'WHERE x.record = ' || NEW.id || ';';
140             END IF;
141  
142             EXECUTE add_query;
143             RETURN NEW;
144  
145         END IF;
146  
147     END IF;
148
149     IF TG_TABLE_NAME = 'call_number' THEN
150
151         IF OLD.record <> NEW.record THEN
152             -- call number is linked to different bib
153             remove_query := remove_query || 'call_number = ' || NEW.id || ');';
154             EXECUTE remove_query;
155             add_query := add_query || 'WHERE x.call_number = ' || NEW.id || ';';
156             EXECUTE add_query;
157         END IF;
158
159         RETURN NEW;
160
161     END IF;
162
163     IF TG_TABLE_NAME IN ('record_entry') THEN
164         RETURN NEW; -- don't have 'opac_visible'
165     END IF;
166
167     -- actor.org_unit, asset.copy_location, asset.copy_status
168     IF NEW.opac_visible = OLD.opac_visible THEN -- do nothing
169
170         RETURN NEW;
171
172     ELSIF NEW.opac_visible THEN -- add rows
173
174         IF TG_TABLE_NAME = 'org_unit' THEN
175             add_query := add_query || 'AND cp.circ_lib = ' || NEW.id || ';';
176         ELSIF TG_TABLE_NAME = 'copy_location' THEN
177             add_query := add_query || 'AND cp.location = ' || NEW.id || ';';
178         ELSIF TG_TABLE_NAME = 'copy_status' THEN
179             add_query := add_query || 'AND cp.status = ' || NEW.id || ';';
180         END IF;
181  
182         EXECUTE add_query;
183  
184     ELSE -- delete rows
185
186         IF TG_TABLE_NAME = 'org_unit' THEN
187             remove_query := 'DELETE FROM asset.opac_visible_copies WHERE circ_lib = ' || NEW.id || ';';
188         ELSIF TG_TABLE_NAME = 'copy_location' THEN
189             remove_query := remove_query || 'location = ' || NEW.id || ');';
190         ELSIF TG_TABLE_NAME = 'copy_status' THEN
191             remove_query := remove_query || 'status = ' || NEW.id || ');';
192         END IF;
193  
194         EXECUTE remove_query;
195  
196     END IF;
197  
198     RETURN NEW;
199 END;
200 $func$ LANGUAGE PLPGSQL;
201
202 COMMIT;