LP#1744385: Parallelize highlight gathering with XML feed retrieval
authorMike Rylander <mrylander@gmail.com>
Mon, 19 Feb 2018 21:48:33 +0000 (16:48 -0500)
committerDan Wells <dbw2@calvin.edu>
Wed, 28 Feb 2018 21:19:19 +0000 (16:19 -0500)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>
Signed-off-by: Dan Wells <dbw2@calvin.edu>
Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
Open-ILS/src/templates/opac/parts/misc_util.tt2

index 96e6a18..ca3f85a 100644 (file)
@@ -1342,7 +1342,8 @@ sub fetch_display_fields {
 }
 __PACKAGE__->register_method(
     method    => 'fetch_display_fields',
-    api_name  => 'open-ils.search.fetch.metabib.display_field.highlight'
+    api_name  => 'open-ils.search.fetch.metabib.display_field.highlight',
+    stream   => 1
 );
 
 
index c243d72..e753057 100644 (file)
@@ -346,12 +346,24 @@ sub load_common {
 
     $ctx->{fetch_display_fields} = sub {
         my $id = shift;
-        return $U->simplereq(
+
+        if (@$id == 1) {
+            return $ctx->{_hl_data}{''.$$id[0]}
+                if ($ctx->{_hl_data}{''.$$id[0]});
+        }
+
+        $self->timelog("HL data not cached, fetching from server.");
+
+        my $rows = $U->simplereq(
             'open-ils.search', 
             'open-ils.search.fetch.metabib.display_field.highlight',
             $ctx->{query_struct}{additional_data}{highlight_map},
             map {int($_)} @$id
         );
+
+        $ctx->{_hl_data}{''.$$id[0]} = $rows if (@$id == 1);
+
+        return $rows;
     };
 
     return Apache2::Const::OK;
index c788761..5505cd6 100644 (file)
@@ -374,6 +374,7 @@ sub get_records_and_facets {
     );
 
     my %tmp_data;
+    my %hl_tmp_data;
     my $outer_self = $self;
 
     my $sdepth = $unapi_args->{flesh_depth};
@@ -385,6 +386,7 @@ sub get_records_and_facets {
     $flesh =~ s/}$/,mmr.unapi}/g if $is_meta;
 
     my $ses = OpenSRF::AppSession->create('open-ils.cstore');
+    my $hl_ses = OpenSRF::AppSession->create('open-ils.search');
 
     my @loop_recs;
     for my $bid (@$rec_ids) {
@@ -410,6 +412,13 @@ sub get_records_and_facets {
         ]}
     );
 
+    my $hl_req = $hl_ses->request(
+        'open-ils.search.fetch.metabib.display_field.highlight.atomic',
+        $self->ctx->{query_struct}{additional_data}{highlight_map},
+        @$rec_ids
+    ) if (!$is_meta);
+
+
     my $facets = {};
     if ($facet_req) {
         $self->timelog("get_records_and_facets():almost ready to fetch facets");
@@ -444,7 +453,13 @@ sub get_records_and_facets {
 
     my $data = $unapi_req->gather(1);
 
-    $outer_self->timelog("get_records_and_facets(): got response content");
+    $outer_self->timelog("get_records_and_facets(): got feed content");
+
+    if (!$is_meta) {
+        my $hl_data = $hl_req->gather(1); # list of arrayref of hashrefs
+        $self->ctx->{_hl_data} = { map { ''.$$_[0]{source} => $_ } @$hl_data };
+        $outer_self->timelog("get_records_and_facets(): got highlighting content (". keys(%{$self->ctx->{_hl_data}}).")");
+    }
 
     # Protect against requests for non-existent records
     return unless $data->{$unapi_type};
index e8d4895..e4bf98c 100644 (file)
         args.hl = {};
         IF !CGI.param('no_highlight') && !search.no_highlight;
 
-            junk = ctx.timelog('Fetching of highlighted display fields for bib(s) ' _ args.df_bib_list.list.join(', ')); 
             args.display_field_list = ctx.fetch_display_fields(args.df_bib_list.list);
-            junk = ctx.timelog('Finished fetch of highlighted display fields for bib(s) ' _ args.df_bib_list.list.join(', ')); 
 
             junk = ctx.timelog('Mapping highlighted display fields for bib(s) ' _ args.df_bib_list.list.join(', ')); 
             FOR df IN args.display_field_list;