X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=Equinox-Migration%2Flib%2FEquinox%2FMigration%2FMapDrivenMARCXMLProc.pm;fp=Equinox-Migration%2Flib%2FEquinox%2FMigration%2FMapDrivenMARCXMLProc.pm;h=8208b8b1b631b09236ba7cc65bd16057413e4fb0;hp=be44ade15d612287acd5f6bd23f69074e43d9464;hb=c9294d8a92619c2fe31d6b3843ad1593eddddebb;hpb=e210af4012ef44060bcd038509aa26bf95bd7006 diff --git a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm index be44ade..8208b8b 100644 --- a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm +++ b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm @@ -37,9 +37,10 @@ our $VERSION = '1.005'; my $dstore; my $sfmap; -my @modlist = qw( multi ignoremulti bib required first concatenate ); +my @modlist = qw( multi ignoremulti bib required first concatenate parallel ); my %allmods = (); my $multis = {}; +my $parallel_fields = {}; my $reccount; my $verbose = 0; @@ -70,7 +71,9 @@ sub new { $verbose = 1 if $args{verbose}; - my $self = bless { multis => \$multis, + my $self = bless { + multis => \$multis, + parallel_fields => \$parallel_fields, }, $class; # initialize map and taglist @@ -118,7 +121,13 @@ sub parse_record { my $fieldname = $sfmap->field($mappedtag, $mappedsub); my $mods = $sfmap->mods($fieldname); next if $mods->{multi}; - $crec->{tags}[-1]{uni}{$mappedsub} = ''; + if ($mods->{parallel}) { + push @{ $crec->{tags}[-1]{parallel}{$mappedsub} }, ''; + $crec->{tags}[-1]{uni} = undef; + } else { + $crec->{tags}[-1]{uni}{$mappedsub} = ''; + $crec->{tags}[-1]{parallel} = undef; + } $crec->{tags}[-1]{multi} = undef; $crec->{tags}[-1]{tag} = $mappedtag; } @@ -155,7 +164,7 @@ sub process_field { return; } if ($sfmap->has($tag)) { - push @{$crec->{tags}}, { tag => $tag, uni => undef, multi => undef }; + push @{$crec->{tags}}, { tag => $tag, uni => undef, multi => undef, parallel => undef }; push @{$crec->{tmap}{$tag}}, (@{$crec->{tags}} - 1); my @subs = $field->children('subfield'); for my $sub (@subs) @@ -166,8 +175,13 @@ sub process_field { my $fieldname = $sfmap->field($tag, $mappedsub); my $mods = $sfmap->mods($fieldname); next if $mods->{multi}; - $crec->{tags}[-1]{uni}{$mappedsub} = '' - unless defined $crec->{tags}[-1]{uni}{$mappedsub}; + if ($mods->{parallel}) { + push @{ $crec->{tags}[-1]{parallel}{$mappedsub} }, '' + unless defined $crec->{tags}[-1]{parallel}{$mappedsub}; + } else { + $crec->{tags}[-1]{uni}{$mappedsub} = '' + unless defined $crec->{tags}[-1]{uni}{$mappedsub}; + } } } } @@ -191,6 +205,12 @@ sub process_subs { return if ($sub->text =~ /$filter/i); } + if ($mods->{parallel}) { + $parallel_fields->{$tag}{$code} = 1; + push @{$dataf->{parallel}{$code}}, $sub->text; + return; + } + # handle multi modifier if ($mods->{multi}) { $multis->{$tag}{$code} = 1; @@ -289,6 +309,17 @@ sub get_multis { return $multis; } +=head2 get_parallel_fields + +Returns hashref of C<{tag}{code}> for all mapped parallel fields + +=cut + +sub get_parallel_fields { + my ($self) = @_; + return $parallel_fields; +} + =head1 MODIFIERS MapDrivenMARCXMLProc implements the following modifiers, and passes