]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/1262.schema.search_highlight_escape_html.sql
LP#1831803: (follow-up) update release notes formatting
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 1262.schema.search_highlight_escape_html.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('1262', :eg_version);
4
5 CREATE OR REPLACE FUNCTION search.highlight_display_fields_impl(
6     rid         BIGINT,
7     tsq         TEXT,
8     field_list  INT[] DEFAULT '{}'::INT[],
9     css_class   TEXT DEFAULT 'oils_SH',
10     hl_all      BOOL DEFAULT TRUE,
11     minwords    INT DEFAULT 5,
12     maxwords    INT DEFAULT 25,
13     shortwords  INT DEFAULT 0,
14     maxfrags    INT DEFAULT 0,
15     delimiter   TEXT DEFAULT ' ... '
16 ) RETURNS SETOF search.highlight_result AS $f$
17 DECLARE
18     opts            TEXT := '';
19     v_css_class     TEXT := css_class;
20     v_delimiter     TEXT := delimiter;
21     v_field_list    INT[] := field_list;
22     hl_query        TEXT;
23 BEGIN
24     IF v_delimiter LIKE $$%'%$$ OR v_delimiter LIKE '%"%' THEN --"
25         v_delimiter := ' ... ';
26     END IF;
27
28     IF NOT hl_all THEN
29         opts := opts || 'MinWords=' || minwords;
30         opts := opts || ', MaxWords=' || maxwords;
31         opts := opts || ', ShortWords=' || shortwords;
32         opts := opts || ', MaxFragments=' || maxfrags;
33         opts := opts || ', FragmentDelimiter="' || delimiter || '"';
34     ELSE
35         opts := opts || 'HighlightAll=TRUE';
36     END IF;
37
38     IF v_css_class LIKE $$%'%$$ OR v_css_class LIKE '%"%' THEN -- "
39         v_css_class := 'oils_SH';
40     END IF;
41
42     opts := opts || $$, StopSel=</b>, StartSel="<b class='$$ || v_css_class; -- "
43
44     IF v_field_list = '{}'::INT[] THEN
45         SELECT ARRAY_AGG(id) INTO v_field_list FROM config.metabib_field WHERE display_field;
46     END IF;
47
48     hl_query := $$
49         SELECT  de.id,
50                 de.source,
51                 de.field,
52                 evergreen.escape_for_html(de.value) AS value,
53                 ts_headline(
54                     ts_config::REGCONFIG,
55                     evergreen.escape_for_html(de.value),
56                     $$ || quote_literal(tsq) || $$,
57                     $1 || ' ' || mf.field_class || ' ' || mf.name || $xx$'>"$xx$ -- "'
58                 ) AS highlight
59           FROM  metabib.display_entry de
60                 JOIN config.metabib_field mf ON (mf.id = de.field)
61                 JOIN search.best_tsconfig t ON (t.id = de.field)
62           WHERE de.source = $2
63                 AND field = ANY ($3)
64           ORDER BY de.id;$$;
65
66     RETURN QUERY EXECUTE hl_query USING opts, rid, v_field_list;
67 END;
68 $f$ LANGUAGE PLPGSQL;
69
70 CREATE OR REPLACE FUNCTION search.highlight_display_fields(
71     rid         BIGINT,
72     tsq_map     TEXT, -- { '(a | b) & c' => '1,2,3,4', ...}
73     css_class   TEXT DEFAULT 'oils_SH',
74     hl_all      BOOL DEFAULT TRUE,
75     minwords    INT DEFAULT 5,
76     maxwords    INT DEFAULT 25,
77     shortwords  INT DEFAULT 0,
78     maxfrags    INT DEFAULT 0,
79     delimiter   TEXT DEFAULT ' ... '
80 ) RETURNS SETOF search.highlight_result AS $f$
81 DECLARE
82     tsq_hstore  TEXT;
83     tsq         TEXT;
84     fields      TEXT;
85     afields     INT[];
86     seen        INT[];
87 BEGIN
88     IF (tsq_map ILIKE 'hstore%') THEN
89         EXECUTE 'SELECT ' || tsq_map INTO tsq_hstore;
90     ELSE
91         tsq_hstore := tsq_map::HSTORE;
92     END IF;
93
94     FOR tsq, fields IN SELECT key, value FROM each(tsq_hstore::HSTORE) LOOP
95         SELECT  ARRAY_AGG(unnest::INT) INTO afields
96           FROM  unnest(regexp_split_to_array(fields,','));
97         seen := seen || afields;
98
99         RETURN QUERY
100             SELECT * FROM search.highlight_display_fields_impl(
101                 rid, tsq, afields, css_class, hl_all,minwords,
102                 maxwords, shortwords, maxfrags, delimiter
103             );
104     END LOOP;
105
106     RETURN QUERY
107         SELECT  id,
108                 source,
109                 field,
110                 evergreen.escape_for_html(value) AS value,
111                 evergreen.escape_for_html(value) AS highlight
112           FROM  metabib.display_entry
113           WHERE source = rid
114                 AND NOT (field = ANY (seen));
115 END;
116 $f$ LANGUAGE PLPGSQL ROWS 10;
117
118 COMMIT;