1 package OpenILS::Application::Search::Authority;
2 use base qw/OpenSRF::Application/;
3 use strict; use warnings;
7 use OpenILS::Utils::Fieldmapper;
8 use OpenILS::Application::AppUtils;
12 use Time::HiRes qw(time);
13 use OpenSRF::EX qw(:try);
14 use Digest::MD5 qw(md5_hex);
16 sub crossref_authority {
22 my $session = OpenSRF::AppSession->create("open-ils.storage");
25 my $freq = $session->request("open-ils.storage.authority.$class.see_from.controlled.atomic",$term);
26 my $areq = $session->request("open-ils.storage.authority.$class.see_also_from.controlled.atomic",$term);
28 my $fr = $freq->gather(1);
29 my $al = $areq->gather(1);
32 return _auth_flatten( $term, $fr, $al );
44 last unless ($$x[$i]);
45 if ($string =~ /\W$/o) {
46 $string .= ' '.$$x[$i];
48 $string .= ' -- '.$$x[$i];
51 next if (lc($string) eq lc($term));
53 $hash{$string}++ if (lc($$x[0]) eq lc($term));
55 my $from = [ sort { $hash{$b} <=> $hash{$a} || $a cmp $b } keys %hash ];
61 last unless ($$x[$i]);
62 if ($string =~ /\W$/o) {
63 $string .= ' '.$$x[$i];
65 $string .= ' -- '.$$x[$i];
68 next if (lc($string) eq lc($term));
70 $hash{$string}++ if (lc($$x[0]) eq lc($term));
72 my $also = [ sort { $hash{$b} <=> $hash{$a} || $a cmp $b } keys %hash ];
75 return { from => $from, also => $also };
78 __PACKAGE__->register_method(
79 method => "crossref_authority",
80 api_name => "open-ils.search.authority.crossref",
82 note => "Searches authority data for existing controlled terms and crossrefs",
85 __PACKAGE__->register_method(
86 method => "crossref_authority_batch",
87 api_name => "open-ils.search.authority.crossref.batch",
90 Takes an array of class,term pair sub-arrays and performs an authority lookup for each
92 PARAMS( [ ["subject", "earth"], ["author","shakespeare"] ] );
94 Returns an object like so:
97 "term" : { "from" : [ ...], "also" : [...] }
98 "term2" : { "from" : [ ...], "also" : [...] }
103 =head comment should work...
104 sub crossref_authority_batch {
105 my( $self, $client, $reqs ) = @_;
108 for my $req (@$reqs) {
110 my $class = $req->[0];
111 my $term = $req->[1];
112 next unless $class and $term;
113 $appreqs->{$class} = {} unless exists $appreqs->{$class};
114 $appreqs->{$class}->{$term} = [];
116 warn "Sending auth request for $class : $term\n";
117 my $session = OpenSRF::AppSession->create("open-ils.storage");
118 my $freq = $session->request("open-ils.storage.authority.$class.see_from.controlled.atomic",$term);
119 my $areq = $session->request("open-ils.storage.authority.$class.see_also_from.controlled.atomic",$term);
120 $appreqs->{$class}->{$term}->[0] = $freq;
121 $appreqs->{$class}->{$term}->[1] = $areq;
125 for my $class (keys %$appreqs) {
126 $response->{$class} = {} unless exists $response->{$class};
127 for my $term (keys %{$appreqs->{$class}}) {
128 warn "Receiving auth request for $class : $term\n";
129 my $fr = $appreqs->{$class}->{$term}->[0]->gather(1);
130 my $al = $appreqs->{$class}->{$term}->[1]->gather(1);
131 warn "Flattenting..\n";
132 $response->{$class}->{$term} = _auth_flatten( $term, $fr, $al );
133 warn "Done with $term\n";
135 warn "Done with $class\n";
139 warn "Returning responses: " . Dumper($response) . "\n";
146 sub crossref_authority_batch {
147 my( $self, $client, $reqs ) = @_;
151 my $session = OpenSRF::AppSession->create("open-ils.storage");
153 for my $req (@$reqs) {
155 my $class = $req->[0];
156 my $term = $req->[1];
157 next unless $class and $term;
158 warn "Sending authority request for $class : $term\n";
159 my $freq = $session->request("open-ils.storage.authority.$class.see_from.controlled.atomic",$term);
160 my $areq = $session->request("open-ils.storage.authority.$class.see_also_from.controlled.atomic",$term);
162 if( $lastr->[0] ) { #process old data while waiting on new data
163 my $cls = $lastr->[0];
164 my $trm = $lastr->[1];
165 my $fr = $lastr->[2];
166 my $al = $lastr->[3];
167 warn "Flattening $class : $term\n";
168 $response->{$cls} = {} unless exists $response->{$cls};
169 $response->{$cls}->{$trm} = _auth_flatten( $trm, $fr, $al );
172 $lastr->[0] = $class;
174 $lastr->[2] = $freq->gather(1);
175 $lastr->[3] = $areq->gather(1);
178 if( $lastr->[0] ) { #process old data while waiting on new data
179 my $cls = $lastr->[0];
180 my $trm = $lastr->[1];
181 my $fr = $lastr->[2];
182 my $al = $lastr->[3];
183 warn "Flattening $cls : $trm\n";
184 $response->{$cls} = {} unless exists $response->{$cls};
185 $response->{$cls}->{$trm} = _auth_flatten( $trm, $fr, $al );