X-Git-Url: https://code.th-h.de/?p=usenet%2Fnewsstats.git;a=blobdiff_plain;f=groupstats.pl;h=dbe7730c49e7a70688f0752e96fc05df5f7c2a02;hp=a09c632890e36296796b01a663eb6ed23bd9028f;hb=b2e0fd244430635e295c8c32b1727331924fdae6;hpb=d8695b1c044f9a99f06a7943f88fe2191e6cc52a diff --git a/groupstats.pl b/groupstats.pl index a09c632..dbe7730 100755 --- a/groupstats.pl +++ b/groupstats.pl @@ -73,10 +73,15 @@ if ($Options{'l'}) { ### 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'}) { - 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 @@ -84,38 +89,42 @@ my $DBHandle = InitDB(\%Conf,1); ### 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 - ($QueryPart,@GroupList) = &SQLGroupList($Newsgroups); + ($QueryGroupList,@GroupList) = &SQLGroupList($Newsgroups); } 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 - $QueryPart .= ' AND postings < ?'; + $QueryThreshold .= ' postings < ?'; } 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 -# $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 -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 -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? @@ -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!) - # set sorting order (-i) + # set sorting order (-i): top or flop list? 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; - # 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 - # set sorting order (-i) + # which kind of level (-i): more than -l x or less than -l x? + my ($Level); if ($Options{'i'}) { - $OrderClause = '<'; + $Level = '<'; } 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 -$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 -# 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 @@ -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) { - # 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 + # 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 - # FIXME print &FormatOutput($Options{'o'}, $Newsgroup, $Month, $Postings, 7); }; };