optimize customer list, RT#30173
authorIvan Kohler <ivan@freeside.biz>
Tue, 29 Mar 2016 00:29:35 +0000 (17:29 -0700)
committerIvan Kohler <ivan@freeside.biz>
Tue, 29 Mar 2016 00:29:35 +0000 (17:29 -0700)
FS/FS/cust_main.pm
httemplate/search/cust_main.cgi

index 4e305fc..38edd04 100644 (file)
@@ -3803,13 +3803,17 @@ sub status { shift->cust_status(@_); }
 
 sub cust_status {
   my $self = shift;
+  return $self->hashref->{cust_status} if $self->hashref->{cust_status};
   for my $status ( FS::cust_main->statuses() ) {
     my $method = $status.'_sql';
     my $numnum = ( my $sql = $self->$method() ) =~ s/cust_main\.custnum/?/g;
     my $sth = dbh->prepare("SELECT $sql") or die dbh->errstr;
     $sth->execute( ($self->custnum) x $numnum )
       or die "Error executing 'SELECT $sql': ". $sth->errstr;
-    return $status if $sth->fetchrow_arrayref->[0];
+    if ( $sth->fetchrow_arrayref->[0] ) {
+      $self->hashref->{cust_status} = $status;
+      return $status;
+    }
   }
 }
 
index e6ab195..c501c50 100755 (executable)
 %    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
+%      #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
+%      #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 )
+%        #$cust_pkg->part_svc( summarize_size=>$large_pkg_size )
+%        qsearch({
+%          'select'      => 'part_svc.*, COUNT(*) AS num_cust_svc',
+%          'table'       => 'part_svc', 
+%          'addl_from'   => 'LEFT JOIN cust_svc USING ( svcpart )',
+%          'extra_sql'   => 'WHERE pkgnum = ? GROUP BY part_svc.svcpart',
+%          'extra_param' => [ [$cust_pkg->pkgnum,'int'] ],
+%        })
 %      ) {
 %        my $svcpart = $part_svc->svcpart;
 %        my $num_cust_svc = $part_svc->num_cust_svc;
 %          $rows += 2;
 %        }
 %        elsif ( $num_cust_svc ) {
-%          $cust_svc_by_svcpart{$svcpart} = $part_svc->cust_pkg_svc;
+%          #$cust_svc_by_svcpart{$svcpart} = $part_svc->cust_pkg_svc;
+%          #further optimization opportunities: don't need to re-pull in another $part_svc object, sorting this is expensive, etc.
+%          $cust_svc_by_svcpart{$svcpart} = [ $cust_pkg->cust_svc($part_svc->svcpart) ];
 %          $rows += $num_cust_svc;
 %        } #if summarize
 %      } #foreach $part_svc
 
 %    my $n1 = '';
 %    foreach ( @{$all_pkgs{$custnum}} ) {
+%      local($FS::cust_svc::cache_enabled) = 1; #for $cust_svc->part_svc
 %      my $pkgnum = $_->pkgnum;
 %      my $part_pkg = $_->part_pkg;
 %