Save unicode characters when populating metabib.browse_entry
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Tue, 24 Jan 2012 21:47:37 +0000 (16:47 -0500)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Tue, 24 Jan 2012 21:47:37 +0000 (16:47 -0500)
Using a perl-based regexp string splitter instead of the built-in one
means that we can get correct suggestions when we type "José"

Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/src/sql/Pg/000.functions.general.sql
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/upgrade/YYYY.schema.bib_autosuggest.sql

index 40ab727..6a46d1b 100644 (file)
@@ -28,6 +28,11 @@ CREATE OR REPLACE FUNCTION evergreen.xml_escape(str TEXT) RETURNS text AS $$
        '>', '&gt;');
 $$ LANGUAGE SQL IMMUTABLE;
 
+CREATE OR REPLACE FUNCTION evergreen.regexp_split_to_array(TEXT, TEXT)
+RETURNS TEXT[] AS $$
+    return encode_array_literal([split $_[1], $_[0]]);
+$$ LANGUAGE PLPERLU STRICT IMMUTABLE;
+
 -- Provide a named type for patching functions
 CREATE TYPE evergreen.patch AS (patch TEXT);
 
index 6dcdd6c..fa24e60 100644 (file)
@@ -806,7 +806,9 @@ BEGIN
     END IF;
 
     IF TG_TABLE_NAME::TEXT ~ 'browse_entry$' THEN
-        value :=  ARRAY_TO_STRING(regexp_split_to_array(value, E'\\W+'), ' ');
+        value :=  ARRAY_TO_STRING(
+            evergreen.regexp_split_to_array(value, E'\\W+'), ' '
+        );
     END IF;
 
     NEW.index_vector = to_tsvector((TG_ARGV[0])::regconfig, value);
index 838512e..aec97f5 100644 (file)
@@ -452,6 +452,14 @@ BEGIN
 END;
 $func$ LANGUAGE PLPGSQL;
 
+-- The advantage of this over the stock regexp_split_to_array() is that it
+-- won't degrade unicode strings.
+CREATE OR REPLACE FUNCTION evergreen.regexp_split_to_array(TEXT, TEXT)
+RETURNS TEXT[] AS $$
+    return encode_array_literal([split $_[1], $_[0]]);
+$$ LANGUAGE PLPERLU STRICT IMMUTABLE;
+
+
 -- Adds some logic for browse_entry to split on non-word chars for index_vector, post-normalize
 CREATE OR REPLACE FUNCTION oils_tsearch2 () RETURNS TRIGGER AS $$
 DECLARE
@@ -510,7 +518,9 @@ BEGIN
     END IF;
 
     IF TG_TABLE_NAME::TEXT ~ 'browse_entry$' THEN
-        value :=  ARRAY_TO_STRING(regexp_split_to_array(value, E'\\W+'), ' ');
+        value :=  ARRAY_TO_STRING(
+            evergreen.regexp_split_to_array(value, E'\\W+'), ' '
+        );
     END IF;
 
     NEW.index_vector = to_tsvector((TG_ARGV[0])::regconfig, value);