package OpenILS::Application::Storage::Publisher::authority; use base qw/OpenILS::Application::Storage::Publisher/; use vars qw/$VERSION/; use OpenSRF::EX qw/:try/; use OpenILS::Application::Storage::FTS; use OpenILS::Utils::Fieldmapper; use OpenSRF::Utils::Logger qw/:level/; use OpenSRF::Utils::Cache; use Data::Dumper; use Digest::MD5 qw/md5_hex/; use XML::LibXML; my $log = 'OpenSRF::Utils::Logger'; $VERSION = 1; my $parser = XML::LibXML->new; sub find_authority_marc { my $self = shift; my $client = shift; my %args = @_; my $term = $args{term}; my $tag = $args{tag}; my $subfield = $args{subfield}; my $tag_where = "AND f.tag LIKE '$tag'"; my $sf_where = "AND f.subfield = '$subfield'"; my $search_table = authority::full_rec->table; my $marc_table = authority::record_entry->table; my ($index_col) = authority::full_rec->columns('FTS'); $index_col ||= 'value'; my $fts = OpenILS::Application::Storage::FTS->compile($term, 'f.value', "f.$index_col"); my $fts_where = $fts->sql_where_clause; my $fts_words = join '%', map { s/([\%\_'])/\\$1/go; }$fts->words; my $fts_words_where = "f.value LIKE '$fts_words\%'"; my $select = <<" SQL"; SELECT DISTINCT a.marc FROM $search_table f, $marc_table a WHERE $fts_where AND $fts_words_where $tag_where $sf_where AND a.id = f.record SQL $log->debug("Authority Search SQL :: [$select]",DEBUG); my $recs = authority::full_rec->db_Main->selectcol_arrayref( $select ); $log->debug("Search yielded ".scalar(@$recs)." results.",DEBUG); $client->respond($_) for (@$recs); return undef; } __PACKAGE__->register_method( api_name => "open-ils.storage.authority.search.marc", method => 'find_authority_marc', api_level => 1, stream => 1, cachable => 1, ); sub _empty_check { my $term = shift; my $class = shift || 'metabib::full_rec'; my $table = $class->table; my ($index_col) = $class->columns('FTS'); $index_col ||= 'value'; my $fts = OpenILS::Application::Storage::FTS->compile($term, 'm.value', "m.$index_col"); my $fts_where = $fts->sql_where_clause; my $sql = <<" SQL"; SELECT TRUE FROM $table m WHERE $fts_where LIMIT 1 SQL return $class->db_Main->selectcol_arrayref($sql)->[0]; } sub find_see_from_controlled { my $self = shift; my $client = shift; my $term = shift; my @marc = $self->method_lookup('open-ils.storage.authority.search.marc') ->run( term => $term, tag => '4%', subfield => 'a' ); for my $m ( @marc ) { my $doc = $parser->parse_string($m); my @nodes = $doc->documentElement->findnodes('//*[substring(@tag,1,1)="1"]/*'); my $list = [ map { $_->textContent } @nodes ]; $client->respond( $list ) if (_empty_check($$list[0], 'metabib::subject_field_entry')); } return undef; } __PACKAGE__->register_method( api_name => "open-ils.storage.authority.see_from.controlled", method => 'find_see_from_controlled', api_level => 1, stream => 1, cachable => 1, ); sub find_see_also_from_controlled { my $self = shift; my $client = shift; my $term = shift; my @marc = $self->method_lookup('open-ils.storage.authority.search.marc') ->run( term => $term, tag => '5%', subfield => 'a' ); for my $m ( @marc ) { my $doc = $parser->parse_string($m); my @nodes = $doc->documentElement->findnodes('//*[substring(@tag,1,1)="1"]/*'); my $list = [ map { $_->textContent } @nodes ]; $client->respond( $list ) if (_empty_check($$list[0], 'metabib::subject_field_entry')); } return undef; } __PACKAGE__->register_method( api_name => "open-ils.storage.authority.see_also_from.controlled", method => 'find_see_also_from_controlled', api_level => 1, stream => 1, cachable => 1, ); 1;