summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2016-02-09 22:27:06 -0800
committerIvan Kohler <ivan@freeside.biz>2016-02-09 22:27:06 -0800
commit5fd8c24bf8752b0198ff3daf9f1290332e53caf2 (patch)
treea77ac5a5f91bac92c7a9c5aa1595d563a3d15b86
parentc90a529450dd85902449788fd83940471be50377 (diff)
optimize Reports->Customers->List Customers, RT#20173
-rw-r--r--FS/FS/Maketext.pm13
-rw-r--r--FS/FS/Msgcat.pm2
-rw-r--r--FS/FS/access_user.pm11
-rw-r--r--FS/FS/part_pkg.pm48
-rwxr-xr-xhttemplate/search/cust_main.cgi1
5 files changed, 59 insertions, 16 deletions
diff --git a/FS/FS/Maketext.pm b/FS/FS/Maketext.pm
index c90e573..b4a9b81 100644
--- a/FS/FS/Maketext.pm
+++ b/FS/FS/Maketext.pm
@@ -1,6 +1,6 @@
package FS::Maketext;
-
use base qw( Exporter );
+
use FS::CurrentUser;
use FS::Conf;
use FS::L10N;
@@ -10,6 +10,13 @@ our @EXPORT_OK = qw( mt emt js_mt );
our $lh;
+our $locale;
+#ask FS::UID to run this stuff for us later
+FS::UID->install_callback( sub {
+ my $conf = new FS::Conf;
+ $locale = $conf->config('locale');
+});
+
sub mt {
return '' if $_[0] eq '';
$lh ||= lh();
@@ -32,8 +39,8 @@ sub js_mt {
}
sub lh {
- my $locale = $FS::CurrentUser::CurrentUser->option('locale')
- || FS::Conf->new->config('locale')
+ my $locale = $FS::CurrentUser::CurrentUser->locale
+ || $locale
|| 'en_US';
$locale =~ s/_/-/g;
FS::L10N->get_handle($locale) || die "Unknown locale $locale";
diff --git a/FS/FS/Msgcat.pm b/FS/FS/Msgcat.pm
index ce0fa78..b6f36bf 100644
--- a/FS/FS/Msgcat.pm
+++ b/FS/FS/Msgcat.pm
@@ -61,7 +61,7 @@ sub _gettext {
return '' unless defined($msgcode) && length($msgcode) > 0;
my $locale = (@_ && shift)
- || $FS::CurrentUser::CurrentUser->option('locale')
+ || $FS::CurrentUser::CurrentUser->locale
|| $def_locale;
return $cache{$locale}->{$msgcode} if exists $cache{$locale}->{$msgcode};
diff --git a/FS/FS/access_user.pm b/FS/FS/access_user.pm
index ffbe7ac..761f592 100644
--- a/FS/FS/access_user.pm
+++ b/FS/FS/access_user.pm
@@ -748,6 +748,17 @@ sub sched_item {
qsearch( 'sched_item', { 'usernum' => $self->usernum } );
}
+=item locale
+
+=cut
+
+sub locale {
+ my $self = shift;
+ return $self->{_locale} if exists($self->{_locale});
+warn "access_user->locale called\n";
+ $self->{_locale} = $self->option('locale');
+}
+
=back
=head1 BUGS
diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm
index c9568c5..07dacfb 100644
--- a/FS/FS/part_pkg.pm
+++ b/FS/FS/part_pkg.pm
@@ -2,7 +2,9 @@ package FS::part_pkg;
use base qw( FS::m2m_Common FS::o2m_Common FS::option_Common );
use strict;
-use vars qw( %plans $DEBUG $setup_hack $skip_pkg_svc_hack );
+use vars qw( %plans $DEBUG $setup_hack $skip_pkg_svc_hack
+ $cache_enabled %cache_link %cache_pkg_svc
+ );
use Carp qw(carp cluck confess);
use Scalar::Util qw( blessed );
use DateTime;
@@ -30,9 +32,14 @@ use FS::part_pkg_usage;
use FS::part_pkg_vendor;
$DEBUG = 0;
+
$setup_hack = 0;
$skip_pkg_svc_hack = 0;
+$cache_enabled = 0;
+%cache_link = ();
+%cache_pkg_svc = ();
+
=head1 NAME
FS::part_pkg - Object methods for part_pkg objects
@@ -963,6 +970,9 @@ sub type_pkgs {
sub pkg_svc {
my $self = shift;
+ return @{ $cache_pkg_svc{$self->pkgpart} }
+ if $cache_enabled && $cache_pkg_svc{$self->pkgpart};
+
# #sort { $b->primary cmp $a->primary }
# grep { $_->quantity }
# qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } );
@@ -987,7 +997,11 @@ sub pkg_svc {
}
}
- values(%pkg_svc);
+ my @pkg_svc = values(%pkg_svc);
+
+ $cache_pkg_svc{$self->pkgpart} = \@pkg_svc if $cache_enabled;
+
+ @pkg_svc;
}
@@ -1273,8 +1287,7 @@ sub option {
return $self->hashref->{"_$opt"};
}
- cluck "$self -> option: searching for $opt"
- if $DEBUG;
+ cluck "$self -> option: searching for $opt" if $DEBUG;
my $part_pkg_option =
qsearchs('part_pkg_option', {
pkgpart => $self->pkgpart,
@@ -1354,14 +1367,25 @@ sub supp_part_pkg_link {
sub _part_pkg_link {
my( $self, $type ) = @_;
- qsearch({ table => 'part_pkg_link',
- hashref => { 'src_pkgpart' => $self->pkgpart,
- 'link_type' => $type,
- #protection against infinite recursive links
- 'dst_pkgpart' => { op=>'!=', value=> $self->pkgpart },
- },
- order_by => "ORDER BY hidden",
- });
+
+ return @{ $cache_link{$type}->{$self->pkgpart} }
+ if $cache_enabled && $cache_link{$type}->{$self->pkgpart};
+
+ cluck $type.'_part_pkg_link called' if $DEBUG;
+
+ my @ppl =
+ qsearch({ table => 'part_pkg_link',
+ hashref => { src_pkgpart => $self->pkgpart,
+ link_type => $type,
+ #protection against infinite recursive links
+ dst_pkgpart => { op=>'!=', value=> $self->pkgpart },
+ },
+ order_by => "ORDER BY hidden",
+ });
+
+ $cache_link{$type}->{$self->pkgpart} = \@ppl if $cache_enabled;
+
+ return @ppl;
}
sub self_and_bill_linked {
diff --git a/httemplate/search/cust_main.cgi b/httemplate/search/cust_main.cgi
index 7bcd5bf..b70bb9a 100755
--- a/httemplate/search/cust_main.cgi
+++ b/httemplate/search/cust_main.cgi
@@ -119,6 +119,7 @@
% foreach my $cust_pkg ( @{$all_pkgs{$custnum}} ) {
% my %cust_svc_by_svcpart;
% my $rows = 0;
+% local($FS::part_pkg::cache_enabled) = 1; #for $cust_pkg->part_svc
% foreach my $part_svc (
% $cust_pkg->part_svc( summarize_size=>$large_pkg_size )
% ) {