From 38716f74a6862cfd586578a685c049138e500c4b Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Tue, 6 Sep 2011 11:54:47 -0400 Subject: [PATCH] Generic mapping index normalizer Useful for mapping values extracted for SVF (metabib.record_attr.attrs) attributes to alternate values. For example, you can map collections of MARC Audience codes into groups of codes for to create audience groups. Signed-off-by: Bill Erickson --- Open-ILS/src/sql/Pg/950.data.seed-values.sql | 7 ++++ Open-ILS/src/sql/Pg/999.functions.global.sql | 26 +++++++++++++ ...XXX.schema.generic-mapping-index-normalizer.sql | 43 ++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.generic-mapping-index-normalizer.sql diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql index 8d224e8960..d16f77fb23 100644 --- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql +++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql @@ -6045,6 +6045,13 @@ INSERT INTO config.index_normalizer (name, description, func, param_count) VALUE 0 ); +INSERT INTO config.index_normalizer (name, description, func, param_count) VALUES ( + 'Generic Mapping Normalizer', + 'Map values or sets of values to new values', + 'generic_map_normalizer', + 1 +); + -- make use of the index normalizers INSERT INTO config.metabib_field_index_norm_map (field,norm) diff --git a/Open-ILS/src/sql/Pg/999.functions.global.sql b/Open-ILS/src/sql/Pg/999.functions.global.sql index 034b9e93f0..25dfb6aeac 100644 --- a/Open-ILS/src/sql/Pg/999.functions.global.sql +++ b/Open-ILS/src/sql/Pg/999.functions.global.sql @@ -1897,3 +1897,29 @@ CREATE TRIGGER ingest_item_trigger AFTER INSERT OR UPDATE ON vandelay.queued_bib_record FOR EACH ROW EXECUTE PROCEDURE vandelay.ingest_bib_items(); + +-- evergreen.generic_map_normalizer + +CREATE OR REPLACE FUNCTION evergreen.generic_map_normalizer ( TEXT, TEXT ) RETURNS TEXT AS $f$ +my $string = shift; +my %map; + +my $default = $string; + +$_ = shift; +while (/^\s*?(.*?)\s*?=>\s*?(\S+)\s*/) { + if ($1 eq '') { + $default = $2; + } else { + $map{$2} = [split(/\s*,\s*/, $1)]; + } + $_ = $'; +} + +for my $key ( keys %map ) { + return $key if (grep { $_ eq $string } @{ $map{$key} }); +} + +return $default; + +$f$ LANGUAGE PLPERLU; diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.generic-mapping-index-normalizer.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.generic-mapping-index-normalizer.sql new file mode 100644 index 0000000000..d7239fd6c5 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.generic-mapping-index-normalizer.sql @@ -0,0 +1,43 @@ +-- Evergreen DB patch XXXX.schema.generic-mapping-index-normalizer.sql +-- +BEGIN; + +-- check whether patch can be applied +SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); + +-- evergreen.generic_map_normalizer + +CREATE OR REPLACE FUNCTION evergreen.generic_map_normalizer ( TEXT, TEXT ) RETURNS TEXT AS $f$ +my $string = shift; +my %map; + +my $default = $string; + +$_ = shift; +while (/^\s*?(.*?)\s*?=>\s*?(\S+)\s*/) { + if ($1 eq '') { + $default = $2; + } else { + $map{$2} = [split(/\s*,\s*/, $1)]; + } + $_ = $'; +} + +for my $key ( keys %map ) { + return $key if (grep { $_ eq $string } @{ $map{$key} }); +} + +return $default; + +$f$ LANGUAGE PLPERLU; + +-- evergreen.generic_map_normalizer + +INSERT INTO config.index_normalizer (name, description, func, param_count) VALUES ( + 'Generic Mapping Normalizer', + 'Map values or sets of values to new values', + 'generic_map_normalizer', + 1 +); + +COMMIT; -- 2.11.0