1 package OpenILS::Application::Storage::Publisher::authority;
2 use base qw/OpenILS::Application::Storage::Publisher/;
4 use OpenSRF::EX qw/:try/;
5 use OpenILS::Application::Storage::FTS;
6 use OpenILS::Utils::Fieldmapper;
7 use OpenSRF::Utils::Logger qw/:level/;
8 use OpenSRF::Utils::Cache;
10 use Digest::MD5 qw/md5_hex/;
13 my $log = 'OpenSRF::Utils::Logger';
17 my $parser = XML::LibXML->new;
19 sub find_authority_marc {
24 my $term = $args{term};
26 my $subfield = $args{subfield};
28 my $tag_where = "AND f.tag LIKE '$tag'";
29 my $sf_where = "AND f.subfield = '$subfield'";
31 my $search_table = authority::full_rec->table;
32 my $marc_table = authority::record_entry->table;
34 my ($index_col) = authority::full_rec->columns('FTS');
35 $index_col ||= 'value';
37 my $fts = OpenILS::Application::Storage::FTS->compile($term, 'f.value', "f.$index_col");
39 my $fts_where = $fts->sql_where_clause;
40 my $fts_words = join '%', map { s/([\%\_'])/\\$1/go; }$fts->words;
41 my $fts_words_where = "f.value LIKE '$fts_words\%'";
44 my $select = <<" SQL";
45 SELECT DISTINCT a.marc
55 $log->debug("Authority Search SQL :: [$select]",DEBUG);
57 my $recs = authority::full_rec->db_Main->selectcol_arrayref( $select );
59 $log->debug("Search yielded ".scalar(@$recs)." results.",DEBUG);
61 $client->respond($_) for (@$recs);
64 __PACKAGE__->register_method(
65 api_name => "open-ils.storage.authority.search.marc",
66 method => 'find_authority_marc',
74 my $class = shift || 'metabib::full_rec';
76 my $table = $class->table;
78 my ($index_col) = $class->columns('FTS');
79 $index_col ||= 'value';
81 my $fts = OpenILS::Application::Storage::FTS->compile($term, 'm.value', "m.$index_col");
82 my $fts_where = $fts->sql_where_clause;
91 return $class->db_Main->selectcol_arrayref($sql)->[0];
94 sub find_see_from_controlled {
99 (my $class = $self->api_name) =~ s/^.+authority.([^\.]+)\.see.+$/$1/o;
101 my @marc = $self->method_lookup('open-ils.storage.authority.search.marc')
102 ->run( term => $term, tag => '4%', subfield => 'a' );
103 for my $m ( @marc ) {
104 my $doc = $parser->parse_string($m);
105 my @nodes = $doc->documentElement->findnodes('//*[substring(@tag,1,1)="1"]/*');
106 my $list = [ map { $_->textContent } @nodes ];
107 $client->respond( $list ) if (_empty_check($$list[0], "metabib::${class}_field_entry"));
111 for my $class ( qw/title author subject keyword series/ ) {
112 __PACKAGE__->register_method(
113 api_name => "open-ils.storage.authority.$class.see_from.controlled",
114 method => 'find_see_from_controlled',
121 sub find_see_also_from_controlled {
126 (my $class = $self->api_name) =~ s/^.+authority.([^\.]+)\.see.+$/$1/o;
128 my @marc = $self->method_lookup('open-ils.storage.authority.search.marc')
129 ->run( term => $term, tag => '5%', subfield => 'a' );
130 for my $m ( @marc ) {
131 my $doc = $parser->parse_string($m);
132 my @nodes = $doc->documentElement->findnodes('//*[substring(@tag,1,1)="1"]/*');
133 my $list = [ map { $_->textContent } @nodes ];
134 $client->respond( $list ) if (_empty_check($$list[0], "metabib::${class}_field_entry"));
138 for my $class ( qw/title author subject keyword series/ ) {
139 __PACKAGE__->register_method(
140 api_name => "open-ils.storage.authority.$class.see_also_from.controlled",
141 method => 'find_see_also_from_controlled',