} elsif( $hold_type eq OILS_HOLD_TYPE_METARECORD ) {
- my $maps = $e->search_metabib_metarecord_source_map({metarecord=>$mrid});
- my @recs = map { $_->source } @$maps;
+ my $recs = $self->method_lookup('open-ils.circ.holds.metarecord.filterd_records')->run($mrid, $holdable_formats);
my @status = ();
- for my $rec (@recs) {
+ for my $rec (@$recs) {
@status = _check_title_hold_is_possible(
$rec, $depth, $request_lib, $patron, $e->requestor, $pickup_lib, $selection_ou, $holdable_formats, $oargs
);
# else { Unrecognized hold_type ! } # FIXME: return error? or 0?
}
+sub MR_filter_records {
+ return $U->storagereq('open-ils.storage.metarecord.filtered_records.atomic', $_[2], $_[3]);
+}
+__PACKAGE__->register_method(
+ method => 'MR_filter_records',
+ api_name => 'open-ils.circ.holds.metarecord.filterd_records',
+);
+
+
my %prox_cache;
sub create_ranged_org_filter {
my($e, $selection_ou, $depth) = @_;
sub _check_title_hold_is_possible {
my( $titleid, $depth, $request_lib, $patron, $requestor, $pickup_lib, $selection_ou, $holdable_formats, $oargs ) = @_;
-
- my ($types, $formats, $lang);
- if (defined($holdable_formats)) {
- ($types, $formats, $lang) = split '-', $holdable_formats;
- }
+ # $holdable_formats is now unused. We pre-filter the MR's records.
my $e = new_editor();
my %org_filter = create_ranged_org_filter($e, $selection_ou, $depth);
acn => {
field => 'id',
fkey => 'call_number',
- 'join' => {
- bre => {
- field => 'id',
- filter => { id => $titleid },
- fkey => 'record'
- },
- mrd => {
- field => 'record',
- fkey => 'record',
- filter => {
- record => $titleid,
- ( $types ? (item_type => [split '', $types]) : () ),
- ( $formats ? (item_form => [split '', $formats]) : () ),
- ( $lang ? (item_lang => $lang) : () )
- }
- }
- }
+ filter => { record => $titleid }
},
acpl => { field => 'id', filter => { holdable => 't'}, fkey => 'location' },
ccs => { field => 'id', filter => { holdable => 't'}, fkey => 'status' },
);
+sub MR_records_matching_format {
+ my $self = shift;
+ my $client = shift;
+ my $MR = shift;
+ my $filter = shift;
+
+ # find filters for MR holds
+ my $mr_filter;
+ if (defined($filter)) {
+ ($mr_filter) = @{action::hold_request->db_Main->selectcol_arrayref(
+ 'SELECT metabib.compile_composite_attr(?)',
+ {},
+ $filter
+ )};
+ }
+
+ my $records = metabib::metarecord->retrieve($hold->target)->source_records
+
+ if (!$mr_filter) {
+ $client->respond( $_->id ) for @$records;
+ } else {
+ for my $r ( map { isTrue($_->deleted) ? () : ($_->id) } @$records ) {
+ $client->respond($r) if
+ @{action::hold_request->db_Main->selectcol_arrayref(
+ 'SELECT source FROM metabib.record_attr_vector_list WHERE source = ? AND vlist @@ ?'
+ {},
+ $r,
+ $mr_filter
+ )};
+ }
+ }
+}
+__PACKAGE__->register_method(
+ api_name => 'open-ils.storage.metarecord.filtered_records',
+ api_level => 1,
+ stream => 1,
+ argc => 2,
+ method => 'MR_records_matching_format',
+);
+
sub new_hold_copy_targeter {
my $self = shift;
my $all_copies = [];
- # find filters for MR holds
- my ($types, $formats, $lang);
- if (defined($hold->holdable_formats)) {
- ($types, $formats, $lang) = split '-', $hold->holdable_formats;
- }
-
# find all the potential copies
if ($hold->hold_type eq 'M') {
- my $records = [
- map {
- isTrue($_->deleted) ? () : ($_->id)
- } metabib::metarecord->retrieve($hold->target)->source_records
- ];
if(@$records > 0) {
- for my $r ( map
- {$_->record}
- metabib::record_descriptor
- ->search(
- record => $records,
- ( $types ? (item_type => [split '', $types]) : () ),
- ( $formats ? (item_form => [split '', $formats]) : () ),
- ( $lang ? (item_lang => $lang) : () ),
- )
+ for my $r (
+ $self->method_lookup(
+ 'open-ils.storage.metarecord.filtered_records'
+ )->run( $hold->target, $hold->holdable_formats );
) {
my ($rtree) = $self
->method_lookup( 'open-ils.storage.biblio.record_entry.ranged_tree')
$self->volume_hold_capture($hold,$cn_list) if (ref $cn_list and @$cn_list);
}
-sub metarecord_hold_capture {
- my $self = shift;
- my $hold = shift;
-
- my $titles;
- try {
- $titles = [ metabib::metarecord_source_map->search( metarecord => $hold->target) ];
-
- } catch Error with {
- my $e = shift;
- die "Could not retrieve initial title list:\n\n$e\n";
- };
-
- try {
- my @recs = map {$_->record} metabib::record_descriptor->search( record => $titles, item_type => [split '', $hold->holdable_formats] );
-
- $titles = [ biblio::record_entry->search( id => \@recs ) ];
-
- } catch Error with {
- my $e = shift;
- die "Could not retrieve format-pruned title list:\n\n$e\n";
- };
-
-
- $cache{titles}{$_->id} = $_ for (@$titles);
- $self->title_hold_capture($hold,$titles) if (ref $titles and @$titles);
-}
1;