# This is a helper for grouped_holdings_for_summary() later.
sub _label_holding_level {
- my ($pattern_field, $subfield, $value) = @_;
+ my ($pattern_field, $subfield, $value, $mfhd_cache) = @_;
- # This may be naïve, in that a-e are sometimes chron fields and not enum.
+ # This is naïve, in that a-f are sometimes chron fields and not enum.
# OpenILS::Utils::MFHD understands that, but so far I don't think our
# interfaces do.
- if ($subfield ge 'i') { # chron
- } else { # enum
+ my $cache_key = $subfield . $value;
+
+ if (not exists $mfhd_cache->{$cache_key}) {
+ my $link_id = (split(/\./, $pattern_field->subfield('8')))[0];
+ my $fake_holding = new MFHD::Holding(
+ 1,
+ new MARC::Field('863', '4', '1', '8', "$link_id.1"),
+ new MFHD::Caption($pattern_field->clone)
+ );
+
+ if ($subfield ge 'i') { # chron
+ $mfhd_cache->{$cache_key} = $fake_holding->format_single_chron(
+ {$subfield => $value}, $subfield, 1, 1
+ );
+ } else { # enum
+ $mfhd_cache->{$cache_key} = $fake_holding->format_single_enum(
+ {$subfield => $value}, $subfield, 1
+ );
+ }
}
- # XXX finish
+ return $mfhd_cache->{$cache_key};
}
# This is a helper for grouped_holdings_for_summary() later.
# This is a helper for grouped_holdings_for_summary() later.
sub _make_grouped_holding_node {
- my ($row, $subfield, $deepest_level, $pattern_field) = @_;
+ my ($row, $subfield, $deepest_level, $pattern_field, $mfhd_cache) = @_;
return {
$subfield eq $deepest_level ? (
) : (
value => $row->{value},
label => _label_holding_level(
- $pattern_field, $subfield, $row->{value}
+ $pattern_field, $subfield, $row->{value}, $mfhd_cache
)
)
};
}
}) or return $e->die_event;
+ # This will help us avoid certain repetitive calculations. Examine
+ # _label_holding_level() to see what I mean.
+ my $mfhd_cache = {};
+
# Make the tree we have so far.
my $tree = [ map(
- _make_grouped_holding_node($_,$subfield,$deepest_level,$pattern_field),
+ _make_grouped_holding_node(
+ $_, $subfield, $deepest_level, $pattern_field, $mfhd_cache
+ ),
@$top
) ];
$parent = $point->{children} = [
map(
_make_grouped_holding_node(
- $_, $subfield, $deepest_level, $pattern_field
+ $_, $subfield, $deepest_level, $pattern_field, $mfhd_cache
),
@$level
)