LP#1284864 metarecord filtered constituent record counts
authorBill Erickson <berick@esilibrary.com>
Thu, 27 Feb 2014 21:27:55 +0000 (16:27 -0500)
committerMike Rylander <mrylander@gmail.com>
Mon, 10 Mar 2014 16:29:52 +0000 (12:29 -0400)
Ensure the count of constiuent records in the MR results lists is
derived from the filtered record set (search org, depth, holdable, etc.)
and not all records.

Signed-off-by: Bill Erickson <berick@esilibrary.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm

index 5e7871e..a42ad09 100644 (file)
@@ -296,6 +296,22 @@ sub load_rresults_bookbag_item_notes {
     return;
 }
 
+# $filter -- CCVM filter expression (see also composite attr def)
+sub recs_from_metarecord {
+    my ($self, $mr_id, $org, $depth, $filter) = @_;
+    $self->timelog("Getting metarecords to records");
+
+    my $bre_ids = $U->simplereq(
+        'open-ils.circ',
+        'open-ils.circ.holds.metarecord.filtered_records',
+        $mr_id, $filter, $org, $depth);
+
+    $self->timelog("Got metarecords to records");
+    return $bre_ids;
+}
+
+
+
 # context additions: 
 #   page_size
 #   hit_count
@@ -384,16 +400,9 @@ sub load_rresults {
     }
 
     if ($metarecord) {
-
-        # TODO: other limits, like SVF/format, etc.
-        $self->timelog("Getting metarecords to records");
-        my $bre_ids = $U->simplereq(
-            'open-ils.circ',
-            'open-ils.circ.holds.metarecord.filtered_records',
-            $metarecord, undef, $ctx->{search_ou}, $depth);
-
-        $self->timelog("Got metarecords to records");
-
+        my $bre_ids = $self->recs_from_metarecord(
+            $metarecord, $ctx->{search_ou}, $depth);
+       
         # force the metarecord result blob to match the format of regular search results
         $results->{ids} = [map { [$_] } @$bre_ids];
 
@@ -502,20 +511,6 @@ sub load_rresults {
     # load temporary_list settings for user and ou:
     $self->_load_lists_and_settings if ($ctx->{user});
 
-    # fetch metarecord constituent counts for display
-    my $mr_counts = [];
-    if ($is_meta) {
-        $mr_counts = $e->json_query({
-            select => {mmrsm => [{
-                    column => 'id', transform => 'count', 
-                    alias => 'count', aggregate => 1
-                }, 'metarecord'
-            ]},
-            from => 'mmrsm',
-            where => {'+mmrsm' => {metarecord => $rec_ids}}
-        });
-    }
-
     # shove recs into context in search results order
     for my $rec_id (@$rec_ids) {
         my ($rec) = grep { $_->{$id_key} == $rec_id } @data;
@@ -525,9 +520,10 @@ sub load_rresults {
             if $metarecord_master and $metarecord_master eq $rec_id;
 
         if ($is_meta) {
-            # add the count of constituent records to the metarecord
-            my ($count) = grep {$_->{metarecord} == $rec_id} @$mr_counts;
-            $rec->{mr_constituent_count} = $count->{count};
+            # collect filtered, constituent records count for each MR
+            my $bre_ids = $self->recs_from_metarecord(
+                $rec_id, $ctx->{search_ou}, $depth);
+            $rec->{mr_constituent_count} = scalar(@$bre_ids);
         }
     }