[open-ils-commits] [GIT] Evergreen ILS branch rel_3_1 updated. a8fbc35549de6454a5c849bcb5d7504a3701fce9

Evergreen Git git at git.evergreen-ils.org
Thu Oct 3 17:34:03 EDT 2019


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, rel_3_1 has been updated
       via  a8fbc35549de6454a5c849bcb5d7504a3701fce9 (commit)
      from  c9c113b0004c7c3c107d8ae2f20d0fc9d041670b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit a8fbc35549de6454a5c849bcb5d7504a3701fce9
Author: Mike Rylander <mrylander at gmail.com>
Date:   Wed Jul 17 17:14:01 2019 -0400

    LP#1836963: reduce the cost of utility functions, speeding up search
    
    For large org trees, some several seconds are spent testing org visibility.
    The immediate cause is that AppUtils::get_org_tree() does not populate the
    process-local cache with a memcache-cached org tree. That only happens when
    memcache does not have a copy of the org tree. This is obviously a simple
    oversight, which is addressed by making sure any memcache return value
    is pushed into the the process local cache.
    
    Additionally, the visibility check is making heavy use of lots of
    indirection and delegation to utility code, when some slightly smarter code
    could avoid many repeated function calls.  We now supply some local
    utility code to flesh and unflesh the parent_ou field of objects in the
    org tree, allowing us to avoid using find_org() and instead just calling
    parent_ou() when walking "up" the tree.
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Galen Charlton <gmc at equinoxinitiative.org>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
index 5ed0e25436..f44e6ef049 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
@@ -1454,6 +1454,7 @@ sub get_org_tree {
     my $locale = shift || '';
     my $cache = OpenSRF::Utils::Cache->new("global", 0);
     my $tree = $ORG_TREE{$locale} || $cache->get_cache("orgtree.$locale");
+    $ORG_TREE{$locale} = $tree; # make sure to populate the process-local cache
     return $tree if $tree;
 
     my $ses = OpenILS::Utils::CStoreEditor->new;
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
index 941085133d..950a081b63 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
@@ -1179,13 +1179,28 @@ sub is_org_visible {
     my $non_inherited_vis_gf = shift || $U->get_global_flag('opac.org_unit.non_inherited_visibility');
     return 1 if ($U->is_true($non_inherited_vis_gf->enabled));
 
-    my $ot = $U->get_org_tree;
-    while ($org = $U->find_org($ot,$org->parent_ou)) {
+    while ($org = $org->parent_ou) {
         return 0 if (!$U->is_true($org->opac_visible));
     }
     return 1;
 }
 
+sub flesh_parents {
+    my $t = shift;
+    my $kids = $t->children;
+    if ($kids && @$kids) {
+        map {$_->parent_ou($t); flesh_parents($_)} @$kids;
+    }
+}
+
+sub unflesh_parents {
+    my $t = shift;
+    my $kids = $t->children;
+    if ($kids && @$kids) {
+        map {$_->parent_ou($t->id); unflesh_parents($_)} @$kids;
+    }
+}
+
 sub flatten {
     my $self = shift;
 
@@ -1446,11 +1461,13 @@ sub flatten {
     my $dorgs = $U->get_org_descendants($site_org->id, $depth_filter);
     my $aorgs = $U->get_org_ancestors($site_org->id);
 
+    flesh_parents($ot);
     if (!$self->find_modifier('staff')) {
         my $non_inherited_vis_gf = $U->get_global_flag('opac.org_unit.non_inherited_visibility');
         $dorgs = [ grep { is_org_visible($U->find_org($ot,$_), $non_inherited_vis_gf) } @$dorgs ];
         $aorgs = [ grep { is_org_visible($U->find_org($ot,$_), $non_inherited_vis_gf) } @$aorgs ];
     }
+    unflesh_parents($ot);
 
     push @{$vis_filter{'c_attr'}},
         "search.calculate_visibility_attribute_test('circ_lib','{".join(',', @$dorgs)."}',$negate)";

-----------------------------------------------------------------------

Summary of changes:
 .../perlmods/lib/OpenILS/Application/AppUtils.pm    |  1 +
 .../Application/Storage/Driver/Pg/QueryParser.pm    | 21 +++++++++++++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list