add normalizer support
authorGalen Charlton <gmc@esilibrary.com>
Tue, 10 Jan 2017 21:59:01 +0000 (16:59 -0500)
committerGalen Charlton <gmc@esilibrary.com>
Tue, 10 Jan 2017 21:59:01 +0000 (16:59 -0500)
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Open-ILS/src/sql/Pg/upgrade/YYYY.schema.authority.sql

index 6feae1a..30af392 100644 (file)
@@ -53,6 +53,14 @@ CREATE TABLE authority.heading_field (
     joiner          TEXT                        NULL
 );
 
+CREATE TABLE authority.heading_field_norm_map (
+        id      SERIAL  PRIMARY KEY,
+        field   INT     NOT NULL REFERENCES authority.heading_field (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+        norm    INT     NOT NULL REFERENCES config.index_normalizer (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+        params  TEXT,
+        pos     INT     NOT NULL DEFAULT 0
+);
+
 INSERT INTO authority.heading_field(heading_type, heading_purpose, label, heading_xpath, component_xpath, type_xpath, thesaurus_xpath, thesaurus_override_xpath) VALUES
 ( 'topical_term', 'main',    'Main Topical Term',    '/mads21:mads/mads21:authority', '//mads21:topic', NULL, '/mads21:mads/mads21:authority/mads21:topic[1]/@authority', NULL ),
 ( 'topical_term', 'variant', 'Variant Topical Term', '/mads21:mads/mads21:variant',   '//mads21:topic', '/mads21:variant/@type', '/mads21:mads/mads21:authority/mads21:topic[1]/@authority', '//mads21:topic[1]/@authority'),
@@ -61,6 +69,11 @@ INSERT INTO authority.heading_field(heading_type, heading_purpose, label, headin
 ( 'personal_name', 'variant', 'Variant Personal name',     '/mads21:mads/mads21:variant', '//mads21:name', NULL, NULL, NULL )
 ;
 
+-- NACO normalize all the things
+INSERT INTO authority.heading_field_norm_map (field, norm, pos)
+SELECT id, 1, 0
+FROM authority.heading_field;
+
 CREATE TYPE authority.heading AS (
     type                authority.heading_type,
     purpose             authority.heading_purpose,
@@ -83,6 +96,8 @@ DECLARE
     component_node    TEXT;
     component_node_list   TEXT[];
     raw_text    TEXT;
+    normalized_text    TEXT;
+    normalizer  RECORD;
     curr_text   TEXT;
     joiner      TEXT;
     type_value  TEXT;
@@ -177,7 +192,31 @@ BEGIN
             END LOOP;
 
             IF raw_text IS NOT NULL THEN
-                output_row.heading = raw_text;
+                output_row.heading := raw_text;
+                normalized_text := raw_text;
+
+                FOR normalizer IN
+                    SELECT  n.func AS func,
+                            n.param_count AS param_count,
+                            m.params AS params
+                    FROM  config.index_normalizer n
+                            JOIN authority.heading_field_norm_map m ON (m.norm = n.id)
+                    WHERE m.field = idx.id
+                    ORDER BY m.pos LOOP
+            
+                        EXECUTE 'SELECT ' || normalizer.func || '(' ||
+                            quote_literal( normalized_text ) ||
+                            CASE
+                                WHEN normalizer.param_count > 0
+                                    THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
+                                    ELSE ''
+                                END ||
+                            ')' INTO normalized_text;
+            
+                END LOOP;
+            
+                output_row.normalized_heading := normalized_text;
+            
                 RETURN NEXT output_row;
             END IF;
         END LOOP;