]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/1052.data-inhouse-use-badge.sql
LP1893463: Follow-up to address de-duplication and adding release notes.
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 1052.data-inhouse-use-badge.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('1052', :eg_version);
4
5 CREATE OR REPLACE FUNCTION rating.inhouse_over_time(badge_id INT)
6     RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
7 DECLARE
8     badge   rating.badge_with_orgs%ROWTYPE;
9     iage    INT     := 1;
10     iint    INT     := NULL;
11     iscale  NUMERIC := NULL;
12 BEGIN
13
14     SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
15
16     IF badge.horizon_age IS NULL THEN
17         RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
18             badge.name,
19             badge.id;
20     END IF;
21
22     PERFORM rating.precalc_bibs_by_copy(badge_id);
23
24     DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
25         SELECT id FROM precalc_filter_bib_list
26             INTERSECT
27         SELECT id FROM precalc_bibs_by_copy_list
28     );
29
30     ANALYZE precalc_copy_filter_bib_list;
31
32     iint := EXTRACT(EPOCH FROM badge.importance_interval);
33     IF badge.importance_age IS NOT NULL THEN
34         iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
35     END IF;
36
37     -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
38     iscale := COALESCE(badge.importance_scale, 1.0);
39
40     RETURN QUERY
41      SELECT bib,
42             SUM( uses * GREATEST( iscale * (iage - cage), 1.0 ))
43       FROM (
44          SELECT cn.record AS bib,
45                 (1 + EXTRACT(EPOCH FROM AGE(u.use_time)) / iint)::INT AS cage,
46                 COUNT(u.id)::INT AS uses
47           FROM  action.in_house_use u
48                 JOIN precalc_copy_filter_bib_list cf ON (u.item = cf.copy)
49                 JOIN asset.copy cp ON (cp.id = u.item)
50                 JOIN asset.call_number cn ON (cn.id = cp.call_number)
51           WHERE u.use_time >= NOW() - badge.horizon_age
52                 AND cn.owning_lib = ANY (badge.orgs)
53           GROUP BY 1, 2
54       ) x
55       GROUP BY 1;
56 END;
57 $f$ LANGUAGE PLPGSQL STRICT;
58
59 INSERT INTO rating.popularity_parameter (id, name, func, require_horizon,require_percentile) VALUES
60     (18,'In-House Use Over Time', 'rating.inhouse_over_time', TRUE, TRUE);
61
62 COMMIT;
63