groupstats.pl: Redo level (-l) query, gain speedup.
[usenet/newsstats.git] / groupstats.pl
index e6cf271..f758b8c 100755 (executable)
@@ -117,7 +117,7 @@ if (defined($Options{'t'})) {
 # according to setting of -s
 my $WhereClause = sprintf('month BETWEEN ? AND ? AND %s AND %s %s',$QueryGroupList,$QueryThreshold,&SQLHierarchies($Options{'s'}));
 
-# get lenght of longest newsgroup delivered by query for formatting purposes
+# get length of longest newsgroup delivered by query for formatting purposes
 # FIXME
 my $MaxLength = &GetMaxLenght($DBHandle,$Conf{'DBTableGrps'},'newsgroup',$WhereClause,$StartMonth,$EndMonth,(@GroupList,@Params));
 
@@ -134,7 +134,7 @@ if (!defined($Options{'b'}) and !defined($Options{'l'})) {
   $DBQuery = $DBHandle->prepare(sprintf("SELECT month,newsgroup,postings FROM %s.%s WHERE %s ORDER BY month,%s",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$OrderClause));
 } elsif ($Options{'b'}) {
   # -b is set (then -l can't be!)
-  # set sorting order (-i)
+  # set sorting order (-i): top or flop list?
   if ($Options{'i'}) {
     $OrderClause = 'postings';
   } else {
@@ -148,20 +148,24 @@ if (!defined($Options{'b'}) and !defined($Options{'l'})) {
   $DBQuery = $DBHandle->prepare(sprintf("SELECT newsgroup,SUM(postings) AS postings FROM %s.%s WHERE %s GROUP BY newsgroup ORDER BY %s,newsgroup LIMIT ?",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$OrderClause));
 } else {
   # -l must be set now, as all other cases have been taken care of
-  # set sorting order (-i)
+  # which kind of level (-i): more than -l x or less than -l x?
   my ($Level);
   if ($Options{'i'}) {
     $Level = '<';
   } else {
     $Level = '>';
   };
-  # push level and $StartMonth,$EndMonth - again - to Params
-  # FIXME -- together with the query (see below)
-  push @Params,$Options{'l'};
-  push @Params,$StartMonth,$EndMonth;
-  # prepare query: get number of postings per group from groups table for given months and 
-  # FIXME -- this query is ... in dire need of impromevent
-  $DBQuery = $DBHandle->prepare(sprintf("SELECT month,newsgroup,postings FROM %s.%s WHERE newsgroup IN (SELECT newsgroup FROM %s.%s WHERE %s GROUP BY newsgroup HAVING MAX(postings) %s ?) AND %s ORDER BY newsgroup,month",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$Level,$WhereClause));
+  # prepare and execute query: get list of newsgroups meeting level condition
+  $DBQuery = $DBHandle->prepare(sprintf("SELECT newsgroup FROM %s.%s WHERE %s GROUP BY newsgroup HAVING MAX(postings) %s ?",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$Level));
+  $DBQuery->execute($StartMonth,$EndMonth,@GroupList,$Options{'l'})
+    or die sprintf("$MySelf: E: Can't get groups data for %s to %s from %s.%s: %s\n",$StartMonth,$EndMonth,$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$DBI::errstr);
+  # add newsgroups to a comma-seperated list ready for IN(...) query
+  my $GroupList;
+  while (my ($Newsgroup) = $DBQuery->fetchrow_array) {
+    $GroupList .= ',' if (defined($GroupList) and $GroupList ne '');
+    $GroupList .= "'$Newsgroup'";
+  };
+  $DBQuery = $DBHandle->prepare(sprintf("SELECT month,newsgroup,postings FROM %s.%s WHERE newsgroup IN (%s) AND %s ORDER BY newsgroup,month",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$GroupList,$WhereClause));
 };
 
 # execute query
This page took 0.0111 seconds and 4 git commands to generate.