]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0067.schema.hold-copy-ratios.sql
adding stored procedure for calculating available and total copy/hold ratios for...
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0067.schema.hold-copy-ratios.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0067');
4
5 CREATE TYPE action.hold_stats AS (
6     hold_count              INT,
7     copy_count              INT,
8     available_count         INT,
9     total_copy_ratio        FLOAT,
10     available_copy_ratio    FLOAT
11 );
12
13 CREATE OR REPLACE FUNCTION action.copy_related_hold_stats (copy_id INT) RETURNS action.hold_stats AS $func$
14 DECLARE
15     output          action.hold_stats%ROWTYPE;
16     hold_count      INT := 0;
17     copy_count      INT := 0;
18     available_count INT := 0;
19     hold_map_data   RECORD;
20 BEGIN
21
22     output.hold_count := 0;
23     output.copy_count := 0;
24     output.available_count := 0;
25
26     SELECT  COUNT( DISTINCT m.hold ) INTO hold_count
27       FROM  action.hold_copy_map m
28             JOIN action.hold_request h ON (m.hold = h.id)
29       WHERE m.target_copy = copy_id
30             AND NOT h.frozen;
31
32     output.hold_count := hold_count;
33
34     FOR hold_map_data IN
35         SELECT  DISTINCT m.target_copy,
36                 acp.status
37           FROM  action.hold_copy_map m
38                 JOIN asset.copy acp ON (m.target_copy = acp.id)
39                 JOIN action.hold_request h ON (m.hold = h.id)
40           WHERE m.hold IN ( SELECT DISTINCT hold FROM action.hold_copy_map WHERE target_copy = copy_id ) AND NOT h.frozen
41     LOOP
42         output.copy_count := output.copy_count + 1;
43         IF hold_map_data.status IN (0,7,12) THEN
44             output.available_count := output.available_count + 1;
45         END IF;
46     END LOOP;
47
48     output.total_copy_ratio = output.copy_count::FLOAT / output.hold_count::FLOAT;
49     output.available_copy_ratio = output.available_count::FLOAT / output.hold_count::FLOAT;
50
51     RETURN output;
52
53 END;
54 $func$ LANGUAGE PLPGSQL;
55
56 COMMIT;
57