my $chunk;
# Is this an OCLC record?
- if ($conf->{scores}{oclc}) {
- if ($record->field('008')) {
- $chunk = $record->field('008')->as_string();
- push @score, ( $chunk =~ /^o/i ? 1 : 0 );
- } else {
- push @score, 0;
- }
- }
+ if ($conf->{scores}{oclc})
+ { push @score, ( defined $marc->{oclc}[0] ? 1 : 0 ) }
# does 040a contain "dlc"?
if ($conf->{scores}{dlc}) {
if ($conf->{scores}{num_650}) {
if ($record->field('650')) {
my @tags = $record->field('650');
- push @score, scalar @tags;
+ push @score, ( sprintf("%04d", scalar @tags) );
} else {
- push @score, 0;
+ push @score, '0000';
}
}
# zero-padded to 4 digits with printf
if ($conf->{scores}{num_tags}) {
my @tags = $record->fields;
- push @score, scalar @tags;
+ push @score, ( sprintf("%04d", scalar @tags) );
}
# encoding level
}
# put score in marc hash
- $marc->{score} = join('', '{oclc:', $score[0], ',dlc:', $score[1],
- ',num_650:', $score[2], ',num_tags:', $score[3],
- ',enc_lvl:', $score[4], '}');
+ my $json = join('', '{oclc:', $score[0], ',dlc:', $score[1],
+ ',num_650:', $score[2], ',num_tags:', $score[3],
+ ',enc_lvl:', $score[4], '}');
+ my $compact = join('', @score);
+ $marc->{score} = "$compact\t$json";
+}
+
+
+=head2 dyn_score_marc
+
+Assign a score to the record based on various criteria.
+
+Score is constructed by pushing elements onto a list. At the end of
+the routine, the list is flattened into a string via join();
+
+=cut
+
+my %dyn_scores_code = (
+ oclc => sub { return $_[0]->{oclc}[0] ? 1 : 0 },
+ dlc => sub { return scalar($_[1]->subfield( '040', 'a')) =~ /dlc/io ? 1 : 0 },
+ num_650 => sub { return sprintf( '%04d', scalar( $_[1]->field('650') ) ) },
+ num_tags=> sub { return sprintf( '%04d', scalar( $_[1]->fields ) ) },
+ enc_lvl => sub {
+ my $enc = substr($_[1]->leader, 17, 1) || 'u';
+ my %levels = ( ' ' => 9, 1 => 8, 2 => 7, 3 => 6, 4 => 5, 5 => 4,
+ 6 => 3, 7 => 2, 8 => 1, 'u' => 0, 'z' => 0 );
+ return $levels{$enc} || 0;
+ }
+);
+
+
+sub dyn_score_marc {
+ my ($marc, $record) = @_;
+ my @score = ();
+ my $json = '{';
+
+ for ( @{ $conf->{dyn_scores} } ) {
+ push @score, $dyn_scores_code{$_}->($marc, $record);
+ $json .= $_ . ':' . $score[-1] . ',';
+ }
+ chop($json); # get rid of the trailing comma
+
+ $json .= '}';
+
+ my $compact = join('', @score);
+ $marc->{score} = "$compact\t$json";
}
=head2 dump_fingerprints
die "Invalid score mode '$_'\n" unless $valid_scores{$_};
$scores{$_} = 1;
}
+ $c->{dyn_scores} = [split /,/, $c->{scores}];
$c->{scores} = \%scores;
} else {
$c->{scores} = {oclc => 1, dlc => 1, num_650 => 1,
num_tags => 1, enc_lvl => 1};
+ $c->{dyn_scores} = [ qw/oclc dlc num_650 num_tags enc_lvl/ ];
}
# set defaults if told to do so