X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=Equinox-Migration%2Flib%2FEquinox%2FMigration%2FMapDrivenMARCXMLProc.pm;h=b98a7ff6d10215d96561db8f6be87ed0d79519f2;hp=ca82ca7e6328c6a17b48de26f1216a791a64cd30;hb=5a0ffda818989fddf5c3315d00c87fdf348cae92;hpb=d1d70c501f6592ae84fc351e4325e5a5f9a67376 diff --git a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm index ca82ca7..b98a7ff 100644 --- a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm +++ b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm @@ -13,15 +13,16 @@ Equinox::Migration::MapDrivenMARCXMLProc =head1 VERSION -Version 1.004 +Version 1.005 =cut -our $VERSION = '1.004'; +our $VERSION = '1.005'; my $dstore; my $sfmap; -my @mods = qw( multi bib required ); +my @modlist = qw( multi ignoremulti bib required first concatenate ); +my %allmods = (); my $multis = {}; my $reccount; my $verbose = 0; @@ -59,7 +60,7 @@ sub new { # initialize map and taglist die "Argument 'mapfile' must be specified\n" unless ($args{mapfile}); $sfmap = Equinox::Migration::SubfieldMapper->new( file => $args{mapfile}, - mods => \@mods ); + mods => \@modlist ); # initialize datastore $dstore = {}; @@ -150,9 +151,12 @@ sub process_subs { # handle unmapped tag/subs return unless ($sfmap->has($tag, $code)); - # fetch our datafield struct and fiel + # fetch our datafield struct and field and mods my $dataf = $crec->{tags}[-1]; my $field = $sfmap->field($tag, $code); + my $sep = $sfmap->sep($field); + $allmods{$field} = $sfmap->mods($field) unless $allmods{$field}; + my $mods = $allmods{$field}; # test filters for my $filter ( @{$sfmap->filters($field)} ) { @@ -160,17 +164,34 @@ sub process_subs { } # handle multi modifier - if (my $mods = $sfmap->mods($field)) { - if ($mods->{multi}) { - push @{$dataf->{multi}{$code}}, $sub->text; + if ($mods->{multi}) { + $multis->{$tag}{$code} = 1; + if ($mods->{concatenate}) { + if (exists($dataf->{multi}{$code})) { + $dataf->{multi}{$code}[0] .= $sep . $sub->text; + } else { + push @{$dataf->{multi}{$code}}, $sub->text; + } $multis->{$tag}{$code} = 1; - return; + } else { + push @{$dataf->{multi}{$code}}, $sub->text; } + return; + } + + + if ($mods->{concatenate}) { + if (exists($dataf->{uni}{$code})) { + $dataf->{uni}{$code} .= $sep . $sub->text; + } else { + $dataf->{uni}{$code} = $sub->text; + } + return; } # if this were a multi field, it would be handled already. make sure its a singleton die "Multiple occurances of a non-multi field: $tag$code at rec ", - ($reccount + 1),"\n" if (defined $dataf->{uni}{$code}); + ($reccount + 1),"\n" if (defined $dataf->{uni}{$code} and !$mods->{ignoremulti}); # everything seems okay $dataf->{uni}{$code} = $sub->text; @@ -215,6 +236,20 @@ Returns mapped fieldname when passed a tag, and code sub name { my ($self, $t, $c) = @_; return $sfmap->field($t, $c) } +=head2 first_only + +Returns whether mapped fieldname is to be applied only to first +item in a bib + +=cut + +sub first_only { + my ($self, $t, $c) = @_; + my $field = $sfmap->field($t, $c); + my $mods = $sfmap->mods($field); + return exists($mods->{first}); +} + =head2 get_multis Returns hashref of C<{tag}{code}> for all mapped multi fields