summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2016-03-23 21:05:26 -0700
committerIvan Kohler <ivan@freeside.biz>2016-03-23 21:05:26 -0700
commitd73998881ef12f0fb2a6f71dc702bccc0c6e7bb4 (patch)
treef189848eb8765cd465d69c6d34e36b5b2da5f34c
parent0e8bb4e9d89852127652a3264fb2d91b145980f9 (diff)
optimize customer list, RT#20173
-rw-r--r--FS/FS/cust_main/Packages.pm7
-rw-r--r--FS/FS/cust_pkg.pm17
-rw-r--r--FS/FS/cust_svc.pm17
-rw-r--r--FS/FS/part_pkg.pm18
-rwxr-xr-xhttemplate/search/cust_main.cgi12
5 files changed, 48 insertions, 23 deletions
diff --git a/FS/FS/cust_main/Packages.pm b/FS/FS/cust_main/Packages.pm
index 4356c59..efd3c6c 100644
--- a/FS/FS/cust_main/Packages.pm
+++ b/FS/FS/cust_main/Packages.pm
@@ -10,6 +10,7 @@ use FS::contact; # for attach_pkgs
use FS::cust_location; #
our ($DEBUG, $me) = (0, '[FS::cust_main::Packages]');
+our $skip_label_sort = 0;
=head1 NAME
@@ -443,7 +444,9 @@ sub all_pkgs {
@cust_pkg = $self->_cust_pkg($extra_qsearch);
}
+ local($skip_label_sort) = 1 if $extra_qsearch->{skip_label_sort};
map { $_ } sort sort_packages @cust_pkg;
+
}
=item cust_pkg
@@ -492,6 +495,7 @@ sub ncancelled_pkgs {
}
+ local($skip_label_sort) = 1 if $extra_qsearch->{skip_label_sort};
sort sort_packages @cust_pkg;
}
@@ -534,7 +538,8 @@ sub sort_packages {
return 0 if !$a_num_cust_svc && !$b_num_cust_svc;
return -1 if $a_num_cust_svc && !$b_num_cust_svc;
return 1 if !$a_num_cust_svc && $b_num_cust_svc;
- return 0 if $a_num_cust_svc + $b_num_cust_svc > 20; #for perf, just give up
+ return 0 if $skip_label_sort
+ || $a_num_cust_svc + $b_num_cust_svc > 20; #for perf, just give up
my @a_cust_svc = $a->cust_svc_unsorted;
my @b_cust_svc = $b->cust_svc_unsorted;
return 0 if !scalar(@a_cust_svc) && !scalar(@b_cust_svc);
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index 6a10b71..f2bf644 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -3268,16 +3268,15 @@ sub cust_svc_unsorted_arrayref {
}
my %search = (
- 'table' => 'cust_svc',
- 'hashref' => { 'pkgnum' => $self->pkgnum },
+ 'select' => 'cust_svc.*, part_svc.*',
+ 'table' => 'cust_svc',
+ 'hashref' => { 'pkgnum' => $self->pkgnum },
+ 'addl_from' => 'LEFT JOIN part_svc USING ( svcpart )',
);
- if ( $opt{svcpart} ) {
- $search{hashref}->{svcpart} = $opt{'svcpart'};
- }
- if ( $opt{'svcdb'} ) {
- $search{addl_from} = ' LEFT JOIN part_svc USING ( svcpart ) ';
- $search{extra_sql} = ' AND svcdb = '. dbh->quote( $opt{'svcdb'} );
- }
+ $search{hashref}->{svcpart} = $opt{svcpart}
+ if $opt{svcpart};
+ $search{extra_sql} = ' AND svcdb = '. dbh->quote( $opt{svcdb} )
+ if $opt{svcdb};
[ qsearch(\%search) ];
diff --git a/FS/FS/cust_svc.pm b/FS/FS/cust_svc.pm
index d432747..d91fa0d 100644
--- a/FS/FS/cust_svc.pm
+++ b/FS/FS/cust_svc.pm
@@ -3,7 +3,7 @@ use base qw( FS::cust_main_Mixin FS::option_Common ); #FS::Record );
use strict;
use vars qw( $DEBUG $me $ignore_quantity $conf $ticket_system );
-use Carp;
+use Carp qw(cluck);
#use Scalar::Util qw( blessed );
use List::Util qw( max );
use FS::Conf;
@@ -32,6 +32,15 @@ FS::UID->install_callback( sub {
$ticket_system = $conf->config('ticket_system')
});
+our $cache_enabled = 0;
+
+sub _simplecache {
+ my( $self, $hashref ) = @_;
+ if ( $cache_enabled && $hashref->{'svc'} ) {
+ $self->{'_svcpart'} = FS::part_svc->new($hashref);
+ }
+}
+
sub _cache {
my $self = shift;
my ( $hashref, $cache ) = @_;
@@ -629,9 +638,9 @@ L<FS::part_svc>).
sub part_svc {
my $self = shift;
- $self->{'_svcpart'}
- ? $self->{'_svcpart'}
- : qsearchs( 'part_svc', { 'svcpart' => $self->svcpart } );
+ return $self->{_svcpart} if $self->{_svcpart};
+ cluck 'cust_svc->part_svc called' if $DEBUG;
+ qsearchs( 'part_svc', { 'svcpart' => $self->svcpart } );
}
=item cust_pkg
diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm
index 8f00304..9ed623f 100644
--- a/FS/FS/part_pkg.pm
+++ b/FS/FS/part_pkg.pm
@@ -1119,14 +1119,11 @@ sub pkg_svc {
# qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } );
my $opt = ref($_[0]) ? $_[0] : { @_ };
- my %pkg_svc = map { $_->svcpart => $_ }
- grep { $_->quantity }
- qsearch( 'pkg_svc', { 'pkgpart' => $self->pkgpart } );
+ my %pkg_svc = map { $_->svcpart => $_ } $self->_pkg_svc;
unless ( $opt->{disable_linked} ) {
foreach my $dst_pkg ( map $_->dst_pkg, $self->svc_part_pkg_link ) {
- my @pkg_svc = grep { $_->quantity }
- qsearch( 'pkg_svc', { pkgpart=>$dst_pkg->pkgpart } );
+ my @pkg_svc = $dst_pkg->_pkg_svc;
foreach my $pkg_svc ( @pkg_svc ) {
if ( $pkg_svc{$pkg_svc->svcpart} ) {
my $quantity = $pkg_svc{$pkg_svc->svcpart}->quantity;
@@ -1146,6 +1143,17 @@ sub pkg_svc {
}
+sub _pkg_svc {
+ my $self = shift;
+ grep { $_->quantity }
+ qsearch({
+ 'select' => 'pkg_svc.*, part_svc.*',
+ 'table' => 'pkg_svc',
+ 'addl_from' => 'LEFT JOIN part_svc USING ( svcpart )',
+ 'hashref' => { 'pkgpart' => $self->pkgpart },
+ });
+}
+
=item svcpart [ SVCDB ]
Returns the svcpart of the primary service definition (see L<FS::part_svc>)
diff --git a/httemplate/search/cust_main.cgi b/httemplate/search/cust_main.cgi
index 96f5af9..e6ab195 100755
--- a/httemplate/search/cust_main.cgi
+++ b/httemplate/search/cust_main.cgi
@@ -121,6 +121,8 @@
% my %cust_svc_by_svcpart;
% my $rows = 0;
% local($FS::part_pkg::cache_enabled) = 1; #for $cust_pkg->part_svc
+% local($FS::cust_svc::cache_enabled) = 1; #for $cust_svc->part_svc
+% local($FS::pkg_svc::cache_enabled) = 1; #for $pkg_svc->part_svc
% foreach my $part_svc (
% $cust_pkg->part_svc( summarize_size=>$large_pkg_size )
% ) {
@@ -281,12 +283,13 @@
% }
% elsif ( scalar @$these ) { # do not summarize
% foreach my $cust_svc ( @$these ) {
+% my $part_svc = $cust_svc->part_svc;
<% $n2 %>
<% $td %>
- <% FS::UI::Web::svc_link($m, $cust_svc->part_svc, $cust_svc) %>
+ <% FS::UI::Web::svc_link($m, $part_svc, $cust_svc) %>
</TD>
<% $td %>
- <% FS::UI::Web::svc_label_link($m, $cust_svc->part_svc, $cust_svc) %>
+ <% FS::UI::Web::svc_label_link($m, $part_svc, $cust_svc) %>
</TD>
% $n2="</TR><TR>";
% } #foreach $cust_svc
@@ -517,8 +520,9 @@ if ( scalar(@cust_main) > 1 || $cgi->param('referral_custnum') ) {
local($FS::cust_pkg::cache_enabled) = 1; #for $cust_pkg->part_pkg
%all_pkgs = map { $_->custnum =>
- [ $_->$pkgs_method({ select => $select,
- addl_from => $addl_from,
+ [ $_->$pkgs_method({ select => $select,
+ addl_from => $addl_from,
+ skip_label_sort => 1,
})
];
}