From c4c8752ff968cee63f0e9f6d29d28378fb482dd6 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Wed, 30 Jan 2013 17:44:30 -0500 Subject: [PATCH] Z39 Batch ML Signed-off-by: Bill Erickson --- .../lib/OpenILS/Application/Search/Z3950.pm | 153 +++++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm index 978b106e4c..09e05ecd8a 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Z3950.pm @@ -479,5 +479,158 @@ sub compile_query { return $str; } + +__PACKAGE__->register_method( + method => 'bucket_search_queue', + api_name => 'open-ils.search.z3950.bucket_search_queue', + stream => 1, + signature => { + desc => q/ + Performs a Z39.50 search for every record in a bucket, using the + provided Z39.50 fields. Add all search results to the specified + Vandelay queue. If no source records or search results are found, + no queue is created. + /, + params => [ + {desc => q/Authentication token/, type => 'string'}, + {desc => q/Bucket ID/, type => 'number'}, + {desc => q/Destination Queue name/, type => 'string'}, + {desc => q/Z39 Servers. List of czs.name/, type => 'array'}, + {desc => q/Z39 Index Maps. List of czifm.id/, type => 'array'} + ], + return => { + q/Object containing status information about the on-going search + and queue operation. + { + searches : { + $zsource : { + pending : $pending, + sent : $sent, + received : $received + }, + ... + }, + queue_count : $queue_count, # on completion; 0 on no-op + queue : $queue_obj # on completion and action + } + This object will be streamed back with each milestone (search + result or complete). + Event object returned on failure + / + } + } +); + +sub bucket_search_queue { + my $self = shift; + my $conn = shift; + my $auth = shift; + my $bucket_id = shift; + my $qname = shift; + my $z_servers = shift; + my $z_indexes = shift; + + my $e = new_editor(authtoken => $auth); + return $e->event unless + $e->checkauth and + $e->allowed('REMOTE_Z3950_QUERY') and + $e->allowed('CREATE_BIB_IMPORT_QUEUE'); + + # find the source bib records + + my $bre_ids = $e->json_query({ + select => {cbrebi => ['target_biblio_record_entry']}, + from => 'cbrebi', + where => {bucket => $bucket_id}, + distinct => 1 + }); + + # empty bucket + return {queue_count => 0} unless @$bre_ids; + + $bre_ids = [ map {$_->{id}} @$bre_ids ]; + + # build the Z39 queries for the source bib records + + $z_indexes = $e->search_config_z3950_index_field_map({id => $z_indexes}); + + return OpenILS::Event->new('BAD_PARAMS', + note => q/No z_indexes/) unless @$z_indexes; + + + # pre-load the metabib_field's we'll need for this batch + + my %mb_fields; + my @mb_fields = grep { $_->metabib_field } @$z_indexes; + if (@mb_fields) { + @mb_fields = map { $_->metabib_field } @mb_fields; + my $field_objs = $e->search_config_metabib_field({id => \@mb_fields}); + %mb_fields = map {$_->id => $_} @$field_objs; + } + + # pre-load the referenced z3950_attrs + + my %z3950_attrs; + my @z3950_attrs = grep { $_->z3950_attr } @$z_indexes; + if (@z3950_attrs) { + @z3950_attrs = map { $_->z3950_attr } @z3950_attrs; + my $attr_objs = $e->search_config_z3950_attr({id => \@z3950_attrs}); + %z3950_attrs = map {$_->id => $_} @$attr_objs; + } + + # indexes with specific z3950_attr's take precedence + my @z_index_attrs = grep { {defined $_->z3959_attr} } @$z_indexes; + my @z_index_types = grep { {not defined $_->z3959_attr} } @$z_indexes; + + my %z_searches; + + # for each bib record, extract the indexed value for each of the + # selected indexes. + + for my $bre_id (@$bre_ids) { + + $z_searches{$bre_id} = []; # TODO + + for my $z_index (@z_index_attrs, @z_index_types) { + + my $bre_val; + if ($z_index->record_attr) { + my $attrs = $U->get_bre_attrs($bre_id, $e); + $bre_val = $attrs->{$z_index->record_attr}->{code} + if $attrs->{$z_index->record_attr}; + + } else { # metabib_field + my $fid = $z_index->metabib_field; + + # now find the extacted value for this record + my $entry_query = sprintf( + 'search_%s_field_entry', $mb_fields{$fid}->field_class); + + my $entry = $e->$entry_query({field => $fid, source => $bre_id}); + + $bre_val = $entry->value if $entry; + } + + push($z_searches{$bre_id}{$z_index->id}, [$z_index, $bre_val]); # TODO + + + + +# if ($bre_val) { +# if ($z_index->z3959_attr) { # source-specific +# $z_searches{$z_ +# } else { +# } +# } + + } + } + + # TODO + return \%z_searches; +} + + + 1; # vim:et:ts=4:sw=4: -- 2.11.0