1 package OpenILS::Application::Search;
2 use base qw/OpenSRF::Application/;
3 use strict; use warnings;
5 use OpenILS::Utils::Fieldmapper;
6 use OpenILS::Utils::ModsParser;
8 use OpenILS::Application::Search::StaffClient;
9 use OpenILS::Application::Search::Web;
11 use Time::HiRes qw(time);
12 use OpenSRF::EX qw(:try);
14 # Houses generic search utilites
18 __PACKAGE__->register_method(
19 method => "biblio_search_marc",
20 api_name => "open-ils.search.biblio.marc",
22 note => "Searches biblio information by marc tag",
25 sub biblio_search_marc {
27 my( $self, $client, $search_hash, $string ) = @_;
29 warn "Building biblio marc session\n";
30 my $session = OpenSRF::AppSession->create("open-ils.storage");
32 warn "Sending biblio marc request\n";
33 my $request = $session->request(
34 "open-ils.storage.metabib.full_rec.search_fts.index_vector",
35 $search_hash, $string );
37 warn "Waiting complete\n";
38 $request->wait_complete();
40 warn "Calling recv\n";
41 my $response = $request->recv();
44 if($response and UNIVERSAL::isa($response,"OpenSRF::EX")) {
45 throw $response ($response->stringify);
50 if($response and UNIVERSAL::can($response,"content")) {
51 $data = $response->content;
53 warn "finishing request\n";
57 $session->disconnect();
65 __PACKAGE__->register_method(
66 method => "get_org_tree",
67 api_name => "open-ils.search.actor.org_tree.retrieve",
69 note => "Returns the entire org tree structure",
74 my( $self, $client, $user_session ) = @_;
76 if( $user_session ) { # keep for now for backwards compatibility
79 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
81 my $session = OpenSRF::AppSession->create("open-ils.storage");
82 my $request = $session->request(
83 "open-ils.storage.actor.org_unit.retrieve", $user_obj->home_ou );
84 my $response = $request->recv();
87 throw OpenSRF::EX::ERROR (
88 "No response from storage for org_unit retrieve");
90 if(UNIVERSAL::isa($response,"Error")) {
91 throw $response ($response->stringify);
94 my $home_ou = $response->content;
96 $session->disconnect();
101 return OpenILS::Application::AppUtils->get_org_tree();
106 __PACKAGE__->register_method(
107 method => "get_org_sub_tree",
108 api_name => "open-ils.search.actor.org_subtree.retrieve",
110 note => "Returns the entire org tree structure",
113 sub get_sub_org_tree {
115 my( $self, $client, $user_session ) = @_;
118 throw OpenSRF::EX::InvalidArg
119 ("No User session provided to org_subtree.retrieve");
122 if( $user_session ) {
125 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
128 my $session = OpenSRF::AppSession->create("open-ils.storage");
129 my $request = $session->request(
130 "open-ils.storage.actor.org_unit.retrieve", $user_obj->home_ou );
131 my $response = $request->recv();
134 throw OpenSRF::EX::ERROR (
135 "No response from storage for org_unit retrieve");
137 if(UNIVERSAL::isa($response,"Error")) {
138 throw $response ($response->stringify);
141 my $home_ou = $response->content;
143 # XXX grab descendants and build org tree from them
145 my $request = $session->request(
146 "open-ils.storage.actor.org_unit_descendants" );
147 my $response = $request->recv();
149 throw OpenSRF::EX::ERROR (
150 "No response from storage for org_unit retrieve");
152 if(UNIVERSAL::isa($response,"Error")) {
153 throw $response ($response->stringify);
156 my $descendants = $response->content;
160 $session->disconnect();
172 # ---------------------------------------------------------------------------
173 # takes a list of record id's and turns the docs into friendly
174 # mods structures. Creates one MODS structure for each doc id.
175 # ---------------------------------------------------------------------------
176 sub _records_to_mods {
182 my $session = OpenSRF::AppSession->create("open-ils.storage");
183 my $request = $session->request(
184 "open-ils.storage.biblio.record_marc.batch.retrieve", @ids );
186 my $last_content = undef;
188 while( my $response = $request->recv() ) {
190 if( $last_content ) {
191 my $u = OpenILS::Utils::ModsParser->new();
192 $u->start_mods_batch( $last_content->marc );
193 my $mods = $u->finish_mods_batch();
194 $mods->{doc_id} = $last_content->id();
195 warn "Turning doc " . $mods->{doc_id} . " into MODS\n";
196 $last_content = undef;
197 push @results, $mods;
200 next unless $response;
202 if($response->isa("OpenSRF::EX")) {
203 throw $response ($response->stringify);
206 $last_content = $response->content;
210 if( $last_content ) {
211 my $u = OpenILS::Utils::ModsParser->new();
212 $u->start_mods_batch( $last_content->marc );
213 my $mods = $u->finish_mods_batch();
214 $mods->{doc_id} = $last_content->id();
215 push @results, $mods;
220 $session->disconnect();
226 __PACKAGE__->register_method(
227 method => "record_id_to_mods",
228 api_name => "open-ils.search.biblio.record.mods.retrieve",
230 note => "Provide ID, we provide the mods"
233 # converts a record into a mods object with copy counts attached
234 sub record_id_to_mods {
236 my( $self, $client, $org_id, $id ) = @_;
238 my $mods_list = _records_to_mods( $id );
239 my $mods_obj = $mods_list->[0];
241 # --------------------------------------------------------------- # append copy count information to the mods objects
242 my $session = OpenSRF::AppSession->create("open-ils.storage");
244 warn "mods retrieve $id\n";
246 my $request = $session->request(
247 "open-ils.storage.biblio.record_copy_count", $org_id, $id );
248 warn "mods retrieve wait $id\n";
249 $request->wait_complete;
250 warn "mods retrieve recv $id\n";
251 my $response = $request->recv();
252 return undef unless $response;
253 warn "mods retrieve after recv $id\n";
255 if( $response and UNIVERSAL::isa($response, "Error")) {
256 throw $response ($response->stringify);
259 my $count = $response->content;
260 $mods_obj->{copy_count} = $count;
264 $session->disconnect();