From d3e4822b8c66bcb7b72a728f857fb46edcc4635b Mon Sep 17 00:00:00 2001 From: Shawn Boyette Date: Tue, 5 May 2009 20:27:38 +0000 Subject: [PATCH] tmap updates --- .../lib/Equinox/Migration/MapDrivenMARCXMLProc.pm | 27 +++++++++++++++---- Equinox-Migration/t/03-MapDrivenMARCXMLProc.t | 8 +++--- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm index 805d70c..b55fdc4 100644 --- a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm +++ b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm @@ -51,7 +51,6 @@ sub new { data => { recs => undef, # X::T record objects rptr => 0, # next record pointer crec => undef, # parsed record storage - tmap => undef, # tag_id-to-tag array map }, }, $class; @@ -96,7 +95,6 @@ sub parse_record { return 0 unless defined $self->{data}{recs}[ $self->{data}{rptr} ]; my $record = $self->{data}{recs}[ $self->{data}{rptr} ]; $self->{data}{crec} = { egid => undef, tags => undef }; - $self->{data}{tmap} = {}; my @fields = $record->children; for my $f (@fields) @@ -117,7 +115,6 @@ sub process_field { my $map = $self->{map}; my $tag = $field->{'att'}->{'tag'}; my $crec = $self->{data}{crec}; - my $tmap = $self->{data}{tmap}; # leader unless (defined $tag) { @@ -133,7 +130,7 @@ sub process_field { } if ($map->has($tag)) { push @{$crec->{tags}}, { tag => $tag, uni => undef, multi => undef }; - push @{$tmap->{$tag}}, (@{$crec->{tags}} - 1); + push @{$crec->{tmap}{$tag}}, (@{$crec->{tags}} - 1); my @subs = $field->children('subfield'); for my $sub (@subs) { $self->process_subs($tag, $sub) } @@ -244,11 +241,13 @@ Then C<$rec> will look like: uni => { code => value, code2 => value2, ... }, }, ... - ] + ], + tmap => { tag_id => [ INDEX_LIST ], tag_id2 => [ INDEX_LIST ], ... } } That is, there is an C key which points to the Evergreen ID of -that record, and a C key which points to an arrayref. +that record, a C key which points to an arrayref, and a C +key which points to a hashref. =head3 C @@ -276,6 +275,22 @@ datafield will be given a value of '' (the null string) in the current record struct. Oppose subfields which are not mapped, which will be C. +=head3 tmap + +A hashref, where each key (a tag id like "650") points to a listref +containing the index (or indices) of C where that tag has +extracted data. + +The intended use of this is to simplify the processing of data from +tags which can appear more than once in a MARC record, like +holdings. If your holdings data is in 852, C{852}> will be a +listref with the indices of C which hold the data from the 852 +datafields. + +Complimentarily, C prevents data from singular datafields from +having to be copied for every instance of a multiple datafield, as it +lets you get the data from that record's one instance of whichever +field you're looking for. =head1 AUTHOR diff --git a/Equinox-Migration/t/03-MapDrivenMARCXMLProc.t b/Equinox-Migration/t/03-MapDrivenMARCXMLProc.t index d01d6d1..6e19df4 100644 --- a/Equinox-Migration/t/03-MapDrivenMARCXMLProc.t +++ b/Equinox-Migration/t/03-MapDrivenMARCXMLProc.t @@ -89,8 +89,8 @@ is ($rec->{tags}[0]{uni}{a}, "1st ed.", '999$a'); is ($rec->{tags}[1]{tag}, 999, 'should be 999'); is ($rec->{tags}[1]{uni}{a}, "MYS DEM", '999$a'); is_deeply ($rec->{tags}[1]{multi}{'999x'}, ['MYSTERY'], '999$x - multi'); -is_deeply ($mp->{data}{tmap}{250}, [0], 'tag map test 1a'); -is_deeply ($mp->{data}{tmap}{999}, [1], 'tag map test 1b'); +is_deeply ($rec->{tmap}{250}, [0], 'tag map test 1a'); +is_deeply ($rec->{tmap}{999}, [1], 'tag map test 1b'); $rec = $mp->parse_record; $rec = $mp->parse_record; $rec = $mp->parse_record; @@ -98,8 +98,8 @@ is ($rec->{tags}[0]{tag}, 999, '250 doesnt exist in this record'); is ($rec->{tags}[0]{uni}{a}, "FIC DEV", 'subfield value 4'); is_deeply ($rec->{tags}[0]{multi}{'999x'}, ['FICTION','FICTION2','FICTION3','FICTION4'], '999$x - multi'); -is ($mp->{data}{tmap}{250}, undef, 'tag map test 2a'); -is_deeply ($mp->{data}{tmap}{999}, [0], 'tag map test 2b'); +is ($rec->{tmap}{250}, undef, 'tag map test 2a'); +is_deeply ($rec->{tmap}{999}, [0], 'tag map test 2b'); # map-05 is map-04 with a "no digits" filter on 999$x $mp = Equinox::Migration::MapDrivenMARCXMLProc->new( marcfile => 't/corpus/mdmp-0.txt', -- 1.7.2.5