From 0f1c77cd7a8dbabc667856eb736bd5bd9a4b40e3 Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Thu, 27 Mar 2014 14:52:46 -0400 Subject: [PATCH] Allow matching and transfer of indicators Signed-off-by: Mike Rylander --- Open-ILS/src/sql/Pg/012.schema.vandelay.sql | 44 ++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql index 5076037d52..d0ff2de419 100644 --- a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql +++ b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql @@ -1051,14 +1051,17 @@ CREATE OR REPLACE FUNCTION vandelay.add_field ( target_xml TEXT, source_xml TEXT my %fields; for my $f (@field_list) { $f =~ s/^\s*//; $f =~ s/\s*$//; - if ($f =~ /^(.{3})(\w*)(?:\[([^]]*)\])?$/) { - my $field = $1; - $field =~ s/\s+//; - my $sf = $2; - $sf =~ s/\s+//; - my $match = $3; - $match =~ s/^\s*//; $match =~ s/\s*$//; + if ($f =~ /^(.{3})(?:_(..))?(\w*)(?:\[([^]]*)\])?$/) { + my $field = $1; $field =~ s/\s+//; + my $ind = $2; $ind =~ s/\s+//; + my $sf = $3; $sf =~ s/\s+//; + my $match = $4; $match =~ s/^\s*//; $match =~ s/\s*$//; $fields{$field} = { sf => [ split('', $sf) ] }; + if ($ind) { + my ($i1,$i2) = split('', $ind); + $fields{$field}{ind1} = $i1 if ($i1 ne '_'); + $fields{$field}{ind2} = $i2 if ($i2 ne '_'); + } if ($match) { my ($msf,$mre) = split('~', $match); if (length($msf) > 0 and length($mre) > 0) { @@ -1075,17 +1078,25 @@ CREATE OR REPLACE FUNCTION vandelay.add_field ( target_xml TEXT, source_xml TEXT for my $from_field ($source_r->field( $f )) { my @tos = $target_r->field( $f ); if (!@tos) { + next if (exists($fields{$f}{ind1}) and !$force_add); + next if (exists($fields{$f}{ind2}) and !$force_add); next if (exists($fields{$f}{match}) and !$force_add); my @new_fields = map { $_->clone } $source_r->field( $f ); $target_r->insert_fields_ordered( @new_fields ); } else { for my $to_field (@tos) { + next unless ($to_field->indicator(1) eq $fields{$f}{ind1}) if (defined($fields{$f}{ind1})); + next unless ($to_field->indicator(2) eq $fields{$f}{ind2}) if (defined($fields{$f}{ind2})); if (exists($fields{$f}{match})) { next unless (grep { $_ =~ $fields{$f}{match}{re} } $to_field->subfield($fields{$f}{match}{sf})); } for my $old_sf ($from_field->subfields) { $to_field->add_subfields( @$old_sf ) if grep(/$$old_sf[0]/,@{$fields{$f}{sf}}); } + $to_field->update( + ind1 => $from_field->indicator(1), + ind2 => $from_field->indicator(2), + ); } } } @@ -1128,14 +1139,17 @@ CREATE OR REPLACE FUNCTION vandelay.strip_field ( xml TEXT, field TEXT ) RETURNS my %fields; for my $f (@field_list) { $f =~ s/^\s*//; $f =~ s/\s*$//; - if ($f =~ /^(.{3})(\w*)(?:\[([^]]*)\])?$/) { - my $field = $1; - $field =~ s/\s+//; - my $sf = $2; - $sf =~ s/\s+//; - my $match = $3; - $match =~ s/^\s*//; $match =~ s/\s*$//; + if ($f =~ /^(.{3})(?:_(..))?(\w*)(?:\[([^]]*)\])?$/) { + my $field = $1; $field =~ s/\s+//; + my $ind = $2; $ind =~ s/\s+//; + my $sf = $3; $sf =~ s/\s+//; + my $match = $4; $match =~ s/^\s*//; $match =~ s/\s*$//; $fields{$field} = { sf => [ split('', $sf) ] }; + if ($ind) { + my ($i1,$i2) = split('', $ind); + $fields{$field}{ind1} = $i1 if ($i1 ne '_'); + $fields{$field}{ind2} = $i2 if ($i2 ne '_'); + } if ($match) { my ($msf,$mre) = split('~', $match); if (length($msf) > 0 and length($mre) > 0) { @@ -1149,6 +1163,8 @@ CREATE OR REPLACE FUNCTION vandelay.strip_field ( xml TEXT, field TEXT ) RETURNS for my $f ( keys %fields) { for my $to_field ($r->field( $f )) { + next unless ($to_field->indicator(1) eq $fields{$f}{ind1}) if (defined($fields{$f}{ind1})); + next unless ($to_field->indicator(2) eq $fields{$f}{ind2}) if (defined($fields{$f}{ind2})); if (exists($fields{$f}{match})) { next unless (grep { $_ =~ $fields{$f}{match}{re} } $to_field->subfield($fields{$f}{match}{sf})); } -- 2.11.0