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