1 package OpenILS::Application::Search::Serial;
2 use base qw/OpenILS::Application/;
3 use strict; use warnings;
6 use OpenSRF::Utils::JSON;
7 use OpenILS::Utils::Fieldmapper;
8 use OpenILS::Utils::MFHDParser;
9 use OpenSRF::Utils::SettingsClient;
10 use OpenILS::Utils::CStoreEditor q/:funcs/;
11 use OpenSRF::Utils::Cache;
14 use OpenSRF::Utils::Logger qw/:logger/;
18 use OpenSRF::Utils::JSON;
20 use Time::HiRes qw(time);
21 use OpenSRF::EX qw(:try);
22 use Digest::MD5 qw(md5_hex);
27 use OpenILS::Const qw/:const/;
29 use OpenILS::Application::AppUtils;
30 my $apputils = "OpenILS::Application::AppUtils";
33 my $pfx = "open-ils.search_";
41 Takes an MFHD record ID and returns a hash of holdings statements
46 my ($self, $client, $id) = @_;
48 my $session = OpenSRF::AppSession->create("open-ils.cstore");
49 my $request = $session->request(
50 "open-ils.cstore.direct.serial.record_entry.retrieve", $id )->gather(1);
52 my $u = OpenILS::Utils::MFHDParser->new();
53 my $mfhd_hash = $u->generate_svr( $request->id, $request->marc, $request->owning_lib );
55 $session->disconnect();
59 __PACKAGE__->register_method(
60 method => "mfhd_to_hash",
61 api_name => "open-ils.search.serial.record.mfhd.retrieve",
63 note => "Given a serial record ID, return MFHD holdings"
68 =item * bib_to_mfhd_hash
72 Given a bib record ID, returns a hash of holdings statements
77 #sub bib_to_mfhd_hash {
78 # my ($self, $client, $bib) = @_;
82 # # XXX perhaps this? --miker
83 ## my $e = OpenILS::Utils::CStoreEditor->new();
84 ## my $mfhd = $e->search_serial_record_entry({ record => $bib });
85 ## return $u->generate_svr( $mfhd->[0] ) if (ref $mfhd);
88 # my @mfhd = $U->cstorereq( "open-ils.cstore.json_query.atomic", {
89 # select => { sre => 'marc' },
91 # where => { record => $bib, deleted => 'f' },
95 # if (!@mfhd or scalar(@mfhd) == 0) {
99 # my $u = OpenILS::Utils::MFHDParser->new();
100 # $mfhd_hash = $u->generate_svr( $mfhd[0][0]->{id}, $mfhd[0][0]->{marc}, $mfhd[0][0]->{owning_lib} );
105 #__PACKAGE__->register_method(
106 # method => "bib_to_mfhd_hash",
107 # api_name => "open-ils.search.serial.record.bib_to_mfhd.retrieve",
109 # note => "Given a bibliographic record ID, return MFHD holdings"
113 my ($self, $client, $bib) = @_;
117 my $e = OpenILS::Utils::CStoreEditor->new();
118 # TODO: 'deleted' ssub support
119 my $sdists = $e->search_serial_distribution([{ "+ssub" => {"record_entry" => $bib} }, { "flesh" => 1, "flesh_fields" => {'sdist' => [ "record_entry", "holding_lib", "basic_summary", "supplement_summary", "index_summary" ]}, "join" => {"ssub" => {}} }]);
120 my $sres = $e->search_serial_record_entry([{ record => $bib, deleted => 'f', "+sdist" => {"id" => undef} }, { "join" => {"sdist" => { 'type' => 'left' }} }]);
121 if (!ref $sres and !ref $sdists) {
125 my $mfhd_parser = OpenILS::Utils::MFHDParser->new();
128 if (ref $_->record_entry) {
129 $svr = $mfhd_parser->generate_svr($_->record_entry->id, $_->record_entry->marc, $_->record_entry->owning_lib);
131 $svr = Fieldmapper::serial::virtual_record->new;
133 $svr->location($_->holding_lib->name);
134 $svr->owning_lib($_->holding_lib);
135 $svr->basic_holdings([]);
136 $svr->supplement_holdings([]);
137 $svr->index_holdings([]);
138 $svr->basic_holdings_add([]);
139 $svr->supplement_holdings_add([]);
140 $svr->index_holdings_add([]);
143 $svr->incomplete([]);
145 if (ref $_->basic_summary) { #TODO: 'show-generated' boolean on summaries
146 if ($_->basic_summary->generated_coverage) {
147 push(@{$svr->basic_holdings}, $_->basic_summary->generated_coverage);
149 if ($_->basic_summary->textual_holdings) {
150 push(@{$svr->basic_holdings_add}, $_->basic_summary->textual_holdings);
153 if (ref $_->supplement_summary) {
154 if ($_->supplement_summary->generated_coverage) {
155 push(@{$svr->supplement_holdings}, $_->supplement_summary->generated_coverage);
157 if ($_->supplement_summary->textual_holdings) {
158 push(@{$svr->supplement_holdings_add}, $_->supplement_summary->textual_holdings);
161 if (ref $_->index_summary) {
162 if ($_->index_summary->generated_coverage) {
163 push(@{$svr->index_holdings}, $_->index_summary->generated_coverage);
165 if ($_->index_summary->textual_holdings) {
166 push(@{$svr->index_holdings_add}, $_->index_summary->textual_holdings);
172 push(@$svrs, $mfhd_parser->generate_svr($_->id, $_->marc, $_->owning_lib));
175 # do a basic location sort for simple predictability
176 @$svrs = sort { $a->location cmp $b->location } @$svrs;
181 __PACKAGE__->register_method(
182 method => "bib_to_svr",
183 api_name => "open-ils.search.serial.record.bib.retrieve",
185 note => "Given a bibliographic record ID, return holdings in svr form"