Allow matching and transfer of indicators user/miker/indicator-overlay
authorMike Rylander <mrylander@gmail.com>
Thu, 27 Mar 2014 18:52:46 +0000 (14:52 -0400)
committerMike Rylander <mrylander@gmail.com>
Thu, 27 Mar 2014 18:52:46 +0000 (14:52 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/012.schema.vandelay.sql

index 5076037..d0ff2de 100644 (file)
@@ -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}));
             }