]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/version-upgrade/3.1.15-3.1.16-upgrade-db.sql
LP2061136 - Stamping 1405 DB upgrade script
[Evergreen.git] / Open-ILS / src / sql / Pg / version-upgrade / 3.1.15-3.1.16-upgrade-db.sql
1 --Upgrade Script for 3.1.15 to 3.1.16
2 \set eg_version '''3.1.16'''
3 BEGIN;
4 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.1.16', :eg_version);
5
6 SELECT evergreen.upgrade_deps_block_check('1185', :eg_version); -- csharp / gmcharlt / jboyer
7
8 ALTER FUNCTION permission.grp_descendants( INT ) STABLE;
9
10
11 SELECT evergreen.upgrade_deps_block_check('1195', :eg_version);
12
13 CREATE OR REPLACE FUNCTION metabib.suggest_browse_entries(raw_query_text text, search_class text, headline_opts text, visibility_org integer, query_limit integer, normalization integer)
14  RETURNS TABLE(value text, field integer, buoyant_and_class_match boolean, field_match boolean, field_weight integer, rank real, buoyant boolean, match text)
15 AS $f$
16 DECLARE
17     prepared_query_texts    TEXT[];
18     query                   TSQUERY;
19     plain_query             TSQUERY;
20     opac_visibility_join    TEXT;
21     search_class_join       TEXT;
22     r_fields                RECORD;
23     b_tests                 TEXT := '';
24 BEGIN
25     prepared_query_texts := metabib.autosuggest_prepare_tsquery(raw_query_text);
26
27     query := TO_TSQUERY('keyword', prepared_query_texts[1]);
28     plain_query := TO_TSQUERY('keyword', prepared_query_texts[2]);
29
30     visibility_org := NULLIF(visibility_org,-1);
31     IF visibility_org IS NOT NULL THEN
32         PERFORM FROM actor.org_unit WHERE id = visibility_org AND parent_ou IS NULL;
33         IF FOUND THEN
34             opac_visibility_join := '';
35         ELSE
36             PERFORM 1 FROM config.internal_flag WHERE enabled AND name = 'opac.located_uri.act_as_copy';
37             IF FOUND THEN
38                 b_tests := search.calculate_visibility_attribute_test(
39                     'luri_org',
40                     (SELECT ARRAY_AGG(id) FROM actor.org_unit_full_path(visibility_org))
41                 );
42             ELSE
43                 b_tests := search.calculate_visibility_attribute_test(
44                     'luri_org',
45                     (SELECT ARRAY_AGG(id) FROM actor.org_unit_ancestors(visibility_org))
46                 );
47             END IF;
48             opac_visibility_join := '
49     LEFT JOIN asset.copy_vis_attr_cache acvac ON (acvac.record = x.source)
50     LEFT JOIN biblio.record_entry b ON (b.id = x.source)
51     JOIN vm ON (acvac.vis_attr_vector @@
52             (vm.c_attrs || $$&$$ ||
53                 search.calculate_visibility_attribute_test(
54                     $$circ_lib$$,
55                     (SELECT ARRAY_AGG(id) FROM actor.org_unit_descendants($4))
56                 )
57             )::query_int
58          ) OR (b.vis_attr_vector @@ $$' || b_tests || '$$::query_int)
59 ';
60         END IF;
61     ELSE
62         opac_visibility_join := '';
63     END IF;
64
65     -- The following determines whether we only provide suggestsons matching
66     -- the user's selected search_class, or whether we show other suggestions
67     -- too. The reason for MIN() is that for search_classes like
68     -- 'title|proper|uniform' you would otherwise get multiple rows.  The
69     -- implication is that if title as a class doesn't have restrict,
70     -- nor does the proper field, but the uniform field does, you're going
71     -- to get 'false' for your overall evaluation of 'should we restrict?'
72     -- To invert that, change from MIN() to MAX().
73
74     SELECT
75         INTO r_fields
76             MIN(cmc.restrict::INT) AS restrict_class,
77             MIN(cmf.restrict::INT) AS restrict_field
78         FROM metabib.search_class_to_registered_components(search_class)
79             AS _registered (field_class TEXT, field INT)
80         JOIN
81             config.metabib_class cmc ON (cmc.name = _registered.field_class)
82         LEFT JOIN
83             config.metabib_field cmf ON (cmf.id = _registered.field);
84
85     -- evaluate 'should we restrict?'
86     IF r_fields.restrict_field::BOOL OR r_fields.restrict_class::BOOL THEN
87         search_class_join := '
88     JOIN
89         metabib.search_class_to_registered_components($2)
90         AS _registered (field_class TEXT, field INT) ON (
91             (_registered.field IS NULL AND
92                 _registered.field_class = cmf.field_class) OR
93             (_registered.field = cmf.id)
94         )
95     ';
96     ELSE
97         search_class_join := '
98     LEFT JOIN
99         metabib.search_class_to_registered_components($2)
100         AS _registered (field_class TEXT, field INT) ON (
101             _registered.field_class = cmc.name
102         )
103     ';
104     END IF;
105
106     RETURN QUERY EXECUTE '
107 WITH vm AS ( SELECT * FROM asset.patron_default_visibility_mask() ),
108      mbe AS (SELECT * FROM metabib.browse_entry WHERE index_vector @@ $1 LIMIT 10000)
109 SELECT  DISTINCT
110         x.value,
111         x.id,
112         x.push,
113         x.restrict,
114         x.weight,
115         x.ts_rank_cd,
116         x.buoyant,
117         TS_HEADLINE(value, $7, $3)
118   FROM  (SELECT DISTINCT
119                 mbe.value,
120                 cmf.id,
121                 cmc.buoyant AND _registered.field_class IS NOT NULL AS push,
122                 _registered.field = cmf.id AS restrict,
123                 cmf.weight,
124                 TS_RANK_CD(mbe.index_vector, $1, $6),
125                 cmc.buoyant,
126                 mbedm.source
127           FROM  metabib.browse_entry_def_map mbedm
128                 JOIN mbe ON (mbe.id = mbedm.entry)
129                 JOIN config.metabib_field cmf ON (cmf.id = mbedm.def)
130                 JOIN config.metabib_class cmc ON (cmf.field_class = cmc.name)
131                 '  || search_class_join || '
132           ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
133           LIMIT 1000) AS x
134         ' || opac_visibility_join || '
135   ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
136   LIMIT $5
137 '   -- sic, repeat the order by clause in the outer select too
138     USING
139         query, search_class, headline_opts,
140         visibility_org, query_limit, normalization, plain_query
141         ;
142
143     -- sort order:
144     --  buoyant AND chosen class = match class
145     --  chosen field = match field
146     --  field weight
147     --  rank
148     --  buoyancy
149     --  value itself
150
151 END;
152 $f$ LANGUAGE plpgsql ROWS 10;
153
154 COMMIT;