From e4be1275c8206cf3b1395e327f310d3b35e3863a Mon Sep 17 00:00:00 2001 From: miker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4> Date: Wed, 10 Mar 2010 01:16:44 +0000 Subject: [PATCH] functions for merging MARC records of the same type git-svn-id: svn://svn.open-ils.org/ILS/trunk@15771 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/src/sql/Pg/002.schema.config.sql | 2 +- .../0184.schema.vandelay.merge_functions.sql | 100 +++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 Open-ILS/src/sql/Pg/upgrade/0184.schema.vandelay.merge_functions.sql diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index ba73b9b74d..753124ec4e 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -51,7 +51,7 @@ CREATE TABLE config.upgrade_log ( install_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); -INSERT INTO config.upgrade_log (version) VALUES ('0183'); -- Scott McKellar +INSERT INTO config.upgrade_log (version) VALUES ('0184'); -- miker CREATE TABLE config.bib_source ( id SERIAL PRIMARY KEY, diff --git a/Open-ILS/src/sql/Pg/upgrade/0184.schema.vandelay.merge_functions.sql b/Open-ILS/src/sql/Pg/upgrade/0184.schema.vandelay.merge_functions.sql new file mode 100644 index 0000000000..451e7f6b3f --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/0184.schema.vandelay.merge_functions.sql @@ -0,0 +1,100 @@ + +BEGIN; + +INSERT INTO config.upgrade_log (version) VALUES ('0184'); -- miker + +CREATE OR REPLACE FUNCTION vandelay.add_field ( incumbent_xml TEXT, incoming_xml TEXT, field TEXT ) RETURNS TEXT AS $_$ + + use MARC::Record; + use MARC::File::XML; + + my $incumbent_xml = shift; + my $incoming_xml = shift; + my $field_spec = shift; + $field_spec =~ s/\s+//g; + + my $incumbent_r = MARC::Record->new_from_xml( $incumbent_xml ); + my $incoming_r = MARC::Record->new_from_xml( $incoming_xml ); + + return $incumbent_xml unless ($incumbent_r && $incoming_r); + + my @field_list = split(',', $field_spec); + + my %fields; + for my $f (@field_list) { + if ($f =~ /^(.{3})(.*)$/) { + $fields{$1} = [ split('', $2) ]; + } + } + + for my $f ( keys %fields) { + if ( @{$fields{$f}} ) { + for my $from_field ($incoming_r->field( $f )) { + for my $to_field ($incumbent_r->field( $f )) { + my @new_sf = map { ($_ => $from_field->subfield($_)) } @{$fields{$f}}; + $to_field->add_subfields( @new_sf ); + } + } + } else { + my @new_fields = map { $_->clone } $incoming_r->field( $f ); + $incumbent_r->insert_fields_ordered( @new_fields ); + } + } + + $incumbent_xml = $incumbent_r->as_xml_record; + $incumbent_xml =~ s/^<\?.+?\?>$//mo; + $incumbent_xml =~ s/\n//sgo; + $incumbent_xml =~ s/>\s+</></sgo; + + return $incumbent_xml; + +$_$ LANGUAGE PLPERLU; + +CREATE OR REPLACE FUNCTION vandelay.strip_field ( xml TEXT, field TEXT ) RETURNS TEXT AS $_$ + + use MARC::Record; + use MARC::File::XML; + + my $xml = shift; + my $r = MARC::Record->new_from_xml( $xml ); + + return $xml unless ($r); + + my $field_spec = shift; + $field_spec =~ s/\s+//g; + + my @field_list = split(',', $field_spec); + + my %fields; + for my $f (@field_list) { + if ($f =~ /^(.{3})(.*)$/) { + $fields{$1} = [ split('', $2) ]; + } + } + + for my $f ( keys %fields) { + if ( @{$fields{$f}} ) { + $_->delete_subfield(code => $fields{$f}) for ($r->field( $f )); + } else { + $r->delete_field( $_ ) for ( $r->field( $f ) ); + } + } + + $xml = $r->as_xml_record; + $xml =~ s/^<\?.+?\?>$//mo; + $xml =~ s/\n//sgo; + $xml =~ s/>\s+</></sgo; + + return $xml; + +$_$ LANGUAGE PLPERLU; + +CREATE OR REPLACE FUNCTION vandelay.replace_field ( incumbent_xml TEXT, incoming_xml TEXT, field TEXT ) RETURNS TEXT AS $_$ + SELECT vandelay.add_field( vandelay.strip_field( $1, $3), $2, $3 ); +$_$ LANGUAGE SQL; + +CREATE OR REPLACE FUNCTION vandelay.preserve_field ( incumbent_xml TEXT, incoming_xml TEXT, field TEXT ) RETURNS TEXT AS $_$ + SELECT vandelay.add_field( vandelay.strip_field( $2, $3), $1, $3 ); +$_$ LANGUAGE SQL; + +COMMIT; -- 2.11.0