removing overly agressive locale normalization
[Evergreen.git] / Open-ILS / src / sql / Pg / 002.functions.config.sql
1 /*
2  * Copyright (C) 2004-2008  Georgia Public Library Service
3  * Copyright (C) 2008  Equinox Software, Inc.
4  * Mike Rylander <miker@esilibrary.com>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18
19 BEGIN;
20
21 /*
22 CREATE OR REPLACE FUNCTION oils_xml_transform ( TEXT, TEXT ) RETURNS TEXT AS $_$
23         SELECT  CASE    WHEN (SELECT COUNT(*) FROM config.xml_transform WHERE name = $2 AND xslt = '---') > 0 THEN $1
24                         ELSE xslt_process($1, (SELECT xslt FROM config.xml_transform WHERE name = $2))
25                 END;
26 $_$ LANGUAGE SQL STRICT IMMUTABLE;
27
28
29
30 CREATE TYPE biblio_field_vtype AS ( record BIGINT, field INT, content TEXT );
31 CREATE OR REPLACE FUNCTION biblio_field_table ( record BIGINT, field_list INT[] ) RETURNS SETOF biblio_field_vtype AS $_$
32 DECLARE
33         i INT;
34         rec biblio_field_vtype%ROWTYPE;
35 BEGIN
36         FOR i IN ARRAY_LOWER(field_list,1) .. ARRAY_UPPER(field_list,1) LOOP
37                 FOR rec IN      SELECT  DISTINCT r, field_list[i], BTRIM(REGEXP_REPLACE(REGEXP_REPLACE(f, E'\n', ' ', 'g'), '[ ]+', ' ', 'g'))
38                                   FROM  xpath_table_ns(
39                                                 'id',
40                                                 $$oils_xml_transform(marc,'$$ || (SELECT format FROM config.metabib_field WHERE id = field_list[i]) || $$')$$,
41                                                 'biblio.record_entry',
42                                                 (SELECT xpath FROM config.metabib_field WHERE id = field_list[i]),
43                                                 'id = ' || record,
44                                                 (SELECT x.prefix FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i]),
45                                                     (SELECT x.namespace_uri FROM config.xml_transform x JOIN config.metabib_field m ON (m.format = x.name) WHERE m.id = field_list[i])
46                                         ) AS t( r bigint, f text)
47                                   WHERE f IS NOT NULL LOOP
48                         RETURN NEXT rec;
49                 END LOOP;
50         END LOOP;
51 END;
52 $_$ LANGUAGE PLPGSQL;
53
54
55 CREATE OR REPLACE FUNCTION biblio_field_table ( record BIGINT, field INT ) RETURNS SETOF biblio_field_vtype AS $_$
56         SELECT * FROM biblio_field_table( $1, ARRAY[$2] )
57 $_$ LANGUAGE SQL;
58
59 */
60
61 CREATE OR REPLACE FUNCTION public.extract_marc_field ( TEXT, BIGINT, TEXT, TEXT ) RETURNS TEXT AS $$
62     SELECT regexp_replace(array_to_string( array_accum( output ),' ' ),$4,'','g') FROM xpath_table('id', 'marc', $1, $3, 'id='||$2)x(id INT, output TEXT);
63 $$ LANGUAGE SQL;
64
65 CREATE OR REPLACE FUNCTION public.extract_marc_field ( TEXT, BIGINT, TEXT ) RETURNS TEXT AS $$
66         SELECT public.extract_marc_field($1,$2,$3,'');
67 $$ LANGUAGE SQL;
68
69 CREATE OR REPLACE FUNCTION oils_i18n_xlate ( keytable TEXT, keyclass TEXT, keycol TEXT, identcol TEXT, keyvalue TEXT, raw_locale TEXT ) RETURNS TEXT AS $func$
70 DECLARE
71     locale      TEXT := REGEXP_REPLACE( REGEXP_REPLACE( raw_locale, E'[;, ].+$', '' ), E'_', '-', 'g' );
72     language    TEXT := REGEXP_REPLACE( locale, E'-.+$', '' );
73     result      config.i18n_core%ROWTYPE;
74     fallback    TEXT;
75     keyfield    TEXT := keyclass || '.' || keycol;
76 BEGIN
77
78     -- Try the full locale
79     SELECT  * INTO result
80       FROM  config.i18n_core
81       WHERE fq_field = keyfield
82             AND identity_value = keyvalue
83             AND translation = locale;
84
85     -- Try just the language
86     IF NOT FOUND THEN
87         SELECT  * INTO result
88           FROM  config.i18n_core
89           WHERE fq_field = keyfield
90                 AND identity_value = keyvalue
91                 AND translation = language;
92     END IF;
93
94     -- Fall back to the string we passed in in the first place
95     IF NOT FOUND THEN
96         EXECUTE
97             'SELECT ' ||
98                 keycol ||
99             ' FROM ' || keytable ||
100             ' WHERE ' || identcol || ' = ' || quote_literal(keyvalue)
101                 INTO fallback;
102         RETURN fallback;
103     END IF;
104
105     RETURN result.string;
106 END;
107 $func$ LANGUAGE PLPGSQL;
108
109 -- Function for marking translatable strings in SQL statements
110 CREATE OR REPLACE FUNCTION oils_i18n_gettext( TEXT ) RETURNS TEXT AS $$
111     SELECT $1;
112 $$ LANGUAGE SQL;
113
114 CREATE OR REPLACE FUNCTION public.first_word ( TEXT ) RETURNS TEXT AS $$
115         SELECT SUBSTRING( $1 FROM $_$^\S+$_$);
116 $$ LANGUAGE SQL;
117
118 COMMIT;
119