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 @marc = $self->method_lookup('open-ils.storage.authority.search.marc')
100 ->run( term => $term, tag => '4%', subfield => 'a' );
101 for my $m ( @marc ) {
102 my $doc = $parser->parse_string($m);
103 my @nodes = $doc->documentElement->findnodes('//*[substring(@tag,1,1)="1"]/*');
104 my $list = [ map { $_->textContent } @nodes ];
105 $client->respond( $list ) if (_empty_check($$list[0], 'metabib::subject_field_entry'));
109 __PACKAGE__->register_method(
110 api_name => "open-ils.storage.authority.see_from.controlled",
111 method => 'find_see_from_controlled',
117 sub find_see_also_from_controlled {
122 my @marc = $self->method_lookup('open-ils.storage.authority.search.marc')
123 ->run( term => $term, tag => '5%', subfield => 'a' );
124 for my $m ( @marc ) {
125 my $doc = $parser->parse_string($m);
126 my @nodes = $doc->documentElement->findnodes('//*[substring(@tag,1,1)="1"]/*');
127 my $list = [ map { $_->textContent } @nodes ];
128 $client->respond( $list ) if (_empty_check($$list[0], 'metabib::subject_field_entry'));
132 __PACKAGE__->register_method(
133 api_name => "open-ils.storage.authority.see_also_from.controlled",
134 method => 'find_see_also_from_controlled',