]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0184.schema.vandelay.merge_functions.sql
LP#1248734: (follow-up) add new indexes to schema update script
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0184.schema.vandelay.merge_functions.sql
1
2 BEGIN;
3
4 INSERT INTO config.upgrade_log (version) VALUES ('0184'); -- miker
5
6 CREATE OR REPLACE FUNCTION vandelay.add_field ( incumbent_xml TEXT, incoming_xml TEXT, field TEXT ) RETURNS TEXT AS $_$
7
8     use MARC::Record;
9     use MARC::File::XML;
10
11     my $incumbent_xml = shift;
12     my $incoming_xml = shift;
13     my $field_spec = shift;
14     $field_spec =~ s/\s+//g;
15
16     my $incumbent_r = MARC::Record->new_from_xml( $incumbent_xml );
17     my $incoming_r = MARC::Record->new_from_xml( $incoming_xml );
18
19     return $incumbent_xml unless ($incumbent_r && $incoming_r);
20
21     my @field_list = split(',', $field_spec);
22
23     my %fields;
24     for my $f (@field_list) {
25         if ($f =~ /^(.{3})(.*)$/) {
26             $fields{$1} = [ split('', $2) ];
27         }
28     }
29
30     for my $f ( keys %fields) {
31         if ( @{$fields{$f}} ) {
32             for my $from_field ($incoming_r->field( $f )) {
33                 for my $to_field ($incumbent_r->field( $f )) {
34                     my @new_sf = map { ($_ => $from_field->subfield($_)) } @{$fields{$f}};
35                     $to_field->add_subfields( @new_sf );
36                 }
37             }
38         } else {
39             my @new_fields = map { $_->clone } $incoming_r->field( $f );
40             $incumbent_r->insert_fields_ordered( @new_fields );
41         }
42     }
43
44     $incumbent_xml = $incumbent_r->as_xml_record;
45     $incumbent_xml =~ s/^<\?.+?\?>$//mo;
46     $incumbent_xml =~ s/\n//sgo;
47     $incumbent_xml =~ s/>\s+</></sgo;
48
49     return $incumbent_xml;
50
51 $_$ LANGUAGE PLPERLU;
52
53 CREATE OR REPLACE FUNCTION vandelay.strip_field ( xml TEXT, field TEXT ) RETURNS TEXT AS $_$
54
55     use MARC::Record;
56     use MARC::File::XML;
57
58     my $xml = shift;
59     my $r = MARC::Record->new_from_xml( $xml );
60
61     return $xml unless ($r);
62
63     my $field_spec = shift;
64     $field_spec =~ s/\s+//g;
65
66     my @field_list = split(',', $field_spec);
67
68     my %fields;
69     for my $f (@field_list) {
70         if ($f =~ /^(.{3})(.*)$/) {
71             $fields{$1} = [ split('', $2) ];
72         }
73     }
74
75     for my $f ( keys %fields) {
76         if ( @{$fields{$f}} ) {
77             $_->delete_subfield(code => $fields{$f}) for ($r->field( $f ));
78         } else {
79             $r->delete_field( $_ ) for ( $r->field( $f ) );
80         }
81     }
82
83     $xml = $r->as_xml_record;
84     $xml =~ s/^<\?.+?\?>$//mo;
85     $xml =~ s/\n//sgo;
86     $xml =~ s/>\s+</></sgo;
87
88     return $xml;
89
90 $_$ LANGUAGE PLPERLU;
91
92 CREATE OR REPLACE FUNCTION vandelay.replace_field ( incumbent_xml TEXT, incoming_xml TEXT, field TEXT ) RETURNS TEXT AS $_$
93     SELECT vandelay.add_field( vandelay.strip_field( $1, $3), $2, $3 );
94 $_$ LANGUAGE SQL;
95
96 CREATE OR REPLACE FUNCTION vandelay.preserve_field ( incumbent_xml TEXT, incoming_xml TEXT, field TEXT ) RETURNS TEXT AS $_$
97     SELECT vandelay.add_field( vandelay.strip_field( $2, $3), $1, $3 );
98 $_$ LANGUAGE SQL;
99
100 COMMIT;