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