groupstats.pl: Improve formatting of output.
[usenet/newsstats.git] / groupstats.pl
index a09c632..dbe7730 100755 (executable)
@@ -73,10 +73,15 @@ if ($Options{'l'}) {
 
 ### get time period
 my ($StartMonth,$EndMonth) = &GetTimePeriod($Options{'m'},$Options{'p'});
 
 ### get time period
 my ($StartMonth,$EndMonth) = &GetTimePeriod($Options{'m'},$Options{'p'});
-# reset to one month for 'dump' output type
+# if time period is more than one month: set output type to '-o pretty' or '-o dumpgroup'
 if ($Options{'o'} eq 'dump' and $Options{'p'}) {
 if ($Options{'o'} eq 'dump' and $Options{'p'}) {
-  warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o pretty'.\n");
-  $Options{'o'} = 'pretty';
+  if (defined($Options{'n'}) and $Options{'n'} !~ /:|\*/) {
+   warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o dumpgroup'.\n");
+   $Options{'o'} = 'dumpgroup';
+  } else {
+   warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o pretty'.\n");
+   $Options{'o'} = 'pretty';
+  }
 };
 
 ### init database
 };
 
 ### init database
@@ -84,38 +89,42 @@ my $DBHandle = InitDB(\%Conf,1);
 
 ### create report
 # get list of newsgroups (-n)
 
 ### create report
 # get list of newsgroups (-n)
-my ($QueryPart,@GroupList);
+my ($QueryGroupList,$QueryThreshold,@GroupList,@Params);
 my $Newsgroups = $Options{'n'};
 if ($Newsgroups) {
   # explode list of newsgroups for WHERE clause
 my $Newsgroups = $Options{'n'};
 if ($Newsgroups) {
   # explode list of newsgroups for WHERE clause
-  ($QueryPart,@GroupList) = &SQLGroupList($Newsgroups);
+  ($QueryGroupList,@GroupList) = &SQLGroupList($Newsgroups);
 } else {
   # set to dummy value (always true)
 } else {
   # set to dummy value (always true)
-  $QueryPart = 1;
+  $QueryGroupList = 1;
 };
 
 # manage thresholds
 if (defined($Options{'t'})) {
   if ($Options{'i'}) {
     # -i: list groups below threshold
 };
 
 # manage thresholds
 if (defined($Options{'t'})) {
   if ($Options{'i'}) {
     # -i: list groups below threshold
-    $QueryPart .= ' AND postings < ?';
+    $QueryThreshold .= ' postings < ?';
   } else {
     # default: list groups above threshold
   } else {
     # default: list groups above threshold
-    $QueryPart .= ' AND postings > ?';
+    $QueryThreshold .= ' postings > ?';
   };
   };
-  # push threshold to GroupList to match number of binding vars for DBQuery->execute
-  push @GroupList,$Options{'t'};
+  # push threshold to Params
+  push @Params,$Options{'t'};
+} else {
+  # set to dummy value (always true)
+  $QueryThreshold = 1;  
 }
 
 # construct WHERE clause
 }
 
 # construct WHERE clause
-# $QueryPart is "list of newsgroup" (or 1),
+# $QueryGroupList is "list of newsgroup" (or 1),
+# $QueryThreshold is threshold definition (or 1),
 # &SQLHierarchies() takes care of the exclusion of hierarchy levels (.ALL)
 # according to setting of -s
 # &SQLHierarchies() takes care of the exclusion of hierarchy levels (.ALL)
 # according to setting of -s
-my $WhereClause = sprintf('month BETWEEN ? AND ? AND %s %s',$QueryPart,&SQLHierarchies($Options{'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
 # FIXME
-my $MaxLength = &GetMaxLenght($DBHandle,$Conf{'DBTableGrps'},'newsgroup',$WhereClause,$StartMonth,$EndMonth,@GroupList);
+my $MaxLength = &GetMaxLenght($DBHandle,$Conf{'DBTableGrps'},'newsgroup',$WhereClause,$StartMonth,$EndMonth,(@GroupList,@Params));
 
 my ($OrderClause,$DBQuery);
 # -b (best of / top list) defined?
 
 my ($OrderClause,$DBQuery);
 # -b (best of / top list) defined?
@@ -130,7 +139,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!)
   $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 {
   if ($Options{'i'}) {
     $OrderClause = 'postings';
   } else {
@@ -138,35 +147,45 @@ if (!defined($Options{'b'}) and !defined($Options{'l'})) {
   };
   # set -b to 10 if < 1 (Top 10)
   $Options{'b'} = 10 if $Options{'b'} !~ /^\d*$/ or $Options{'b'} < 1;
   };
   # set -b to 10 if < 1 (Top 10)
   $Options{'b'} = 10 if $Options{'b'} !~ /^\d*$/ or $Options{'b'} < 1;
-  # push LIMIT to GroupList to match number of binding vars for DBQuery->execute
-  push @GroupList,$Options{'b'};
+  # push LIMIT to Params
+  push @Params,$Options{'b'};
   # prepare query: get sum of postings per group from groups table for given months and newsgroups with LIMIT
   $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
   # prepare query: get sum of postings per group from groups table for given months and newsgroups with LIMIT
   $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'}) {
   if ($Options{'i'}) {
-    $OrderClause = '<';
+    $Level = '<';
   } else {
   } else {
-    $OrderClause = '>';
+    $Level = '>';
   };
   };
-  # push level and $StartMonth,$EndMonth - again - to GroupList to match number of binding vars for DBQuery->execute
-  # FIXME -- together with the query (see below)
-  push @GroupList,$Options{'l'};
-  push @GroupList,$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,$OrderClause,$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
 };
 
 # execute query
-$DBQuery->execute($StartMonth,$EndMonth,@GroupList)
+$DBQuery->execute($StartMonth,$EndMonth,@GroupList,@Params)
   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);
 
 # output results
 # print caption (-c) with time period if -m or -p is set
   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);
 
 # output results
 # print caption (-c) with time period if -m or -p is set
-# FIXME - month or period should handled differently
-printf ("----- Report from %s to %s\n",$StartMonth,$EndMonth) if $Options{'c'} and ($Options{'m'} or $Options{'p'});
+if ($Options{'c'}) {
+  if ($Options{'p'}) {
+    printf ("----- Report from %s to %s\n",$StartMonth,$EndMonth);
+  } elsif ($Options{'m'}) {
+    printf ("----- Report for %s\n",$StartMonth);
+  };
+};
 # print caption (-c) with newsgroup list if -n is set
 printf ("----- Newsgroups: %s\n",join(',',split(/:/,$Newsgroups))) if $Options{'c'} and $Options{'n'};
 # print caption (-c) with threshold if -t is set, taking -i in account
 # print caption (-c) with newsgroup list if -n is set
 printf ("----- Newsgroups: %s\n",join(',',split(/:/,$Newsgroups))) if $Options{'c'} and $Options{'n'};
 # print caption (-c) with threshold if -t is set, taking -i in account
@@ -178,16 +197,16 @@ if (!defined($Options{'b'})  and !defined($Options{'l'})) {
   # -b is set (then -l can't be!)
   # we have to read in the query results ourselves, as they do not have standard layout
   while (my ($Newsgroup,$Postings) = $DBQuery->fetchrow_array) {
   # -b is set (then -l can't be!)
   # we have to read in the query results ourselves, as they do not have standard layout
   while (my ($Newsgroup,$Postings) = $DBQuery->fetchrow_array) {
-    # we just assign "top x" or "bottom x" instead of a month for the caption
-    # FIXME
-    print &FormatOutput($Options{'o'}, ($Options{'i'} ? 'Bottom ' : 'Top ').$Options{'b'}, $Newsgroup, $Postings, $MaxLength);
+    # we just assign "top x" or "bottom x" instead of a month for the caption and force an output type of pretty
+    print &FormatOutput('pretty', ($Options{'i'} ? 'Bottom ' : 'Top ').$Options{'b'}, $Newsgroup, $Postings, $MaxLength);
   };
 } else {
   # -l must be set now, as all other cases have been taken care of
   };
 } else {
   # -l must be set now, as all other cases have been taken care of
+  # print caption (-c) with level, taking -i in account
+  printf ("----- Newsgroups with %s than %u postings over the whole time period\n",$Options{'i'} ? 'less' : 'more',$Options{'l'}) if $Options{'c'};
   # we have to read in the query results ourselves, as they do not have standard layout
   while (my ($Month,$Newsgroup,$Postings) = $DBQuery->fetchrow_array) {
     # we just switch $Newsgroups and $Month for output generation
   # we have to read in the query results ourselves, as they do not have standard layout
   while (my ($Month,$Newsgroup,$Postings) = $DBQuery->fetchrow_array) {
     # we just switch $Newsgroups and $Month for output generation
-    # FIXME
     print &FormatOutput($Options{'o'}, $Newsgroup, $Month, $Postings, 7);
   };
 };
     print &FormatOutput($Options{'o'}, $Newsgroup, $Month, $Postings, 7);
   };
 };
This page took 0.013553 seconds and 4 git commands to generate.