--- db/prgsrc/db.cgi 2001/10/23 00:01:03 1.28 +++ db/prgsrc/db.cgi 2001/11/19 00:59:44 1.29 @@ -1,4 +1,4 @@ -#!/usr/local/bin/perl -w +#!/usr/bin/perl -w use DBI; use CGI ':all'; @@ -8,7 +8,8 @@ use Time::Local; use POSIX qw(locale_h); use locale; open STDERR, ">errors"; -my $printqueries=0; +my $printqueries=1; +my $debug=1; #added by R7 my %fieldname= (0,'Question', 1, 'Answer', 2, 'Comments', 3, 'Authors', 4, 'Sources'); my %searchin; @@ -22,7 +23,6 @@ $searchin{'answer'}=param('Answer'); $searchin{'comment'}=param('Comment'); $searchin{'authors'}=param('Authors'); $searchin{'sources'}=param('Sources'); -$printqueries||=param('debug'); my $all=param('all'); $all=0 if lc $all eq 'no'; my ($PWD) = `pwd`; @@ -159,6 +159,7 @@ print "$query",br if $printqueries; } } + my @bad=grep {!$nf[$_]} 0..$#w; # @bad -- номера словоформ, # которых нет в словаре @@ -175,9 +176,10 @@ print "$query",br if $printqueries; } return () if ($all && @verybad); + my $kvo=0; push @$allnf, @{$_} foreach @nf; -print "allnf=@$allnf\n".br if $printqueries; +print "nf=@$allnf"; foreach $i (0..$#w) #запросы в базу... { @@ -232,7 +234,6 @@ print "$query\n",br if $printqueries; - if (@blob < 4) { $tasksof{$i}=undef; @@ -254,7 +255,6 @@ print "$query\n",br if $printqueries; $field=$fieldname{$field}; if ($searchin{lc $field}) { - push @{$tasksof{$i}{$number}}, $wordnumber; # дополнили в хэше, висящем на # словоформе $i в %tasksof список @@ -270,9 +270,9 @@ print "$query\n",br if $printqueries; } } #foreach $i -print "keys tasksof", keys %tasksof if $printqueries; +#print "keys tasksof", join ' ', keys %{$tasksof{0}}; #Ищем пересечение или объединение списков вопросов (значений %tasksof) - foreach $sf (keys %tasksof) + foreach $sf (keys %tasksof) { $count{$_}++ foreach keys %{$tasksof{$sf}}; } @@ -280,7 +280,7 @@ print "keys tasksof", keys %tasksof if $ keys %count) ; -#print "\n\$#tasks=",$#tasks,br; +print "\n\$#tasks=",$#tasks,br if $printqueries; ############ Сортировка найденных вопросов foreach (keys %wordsof) @@ -293,7 +293,7 @@ foreach (keys %wordsof) ############ -print "tasks=@tasks" if $printqueries;; +print "tasks=@tasks"; #print "$_ $relevance{$_} | " foreach @tasks; #print br; @@ -364,12 +364,11 @@ sub Search { ###Simple and advanced query processing. Added by R7 if ($metod eq 'simple' || $metod eq 'advanced') { - foreach (qw/Question Answer Sources Authors Comments/) { + foreach (qw/Question Answer Sources Authors Comments/) { if (param($_)) { push @fields, $_; } - } - + } @fields=(qw/Question Answer Sources Authors Comments/) unless scalar @fields; my $fields=join ",", @fields; @@ -383,20 +382,18 @@ sub Search { $where= $$q{'matchexp'}; my $query= "SELECT Questionid FROM Questions WHERE $where"; - print br."Query is: $query".br if $printqueries; + print br."Query is: $query".br if $debug; $sth = $dbh->prepare($query); } else ###### { - foreach (qw/Question Answer Sources Authors Comments/) { if (param($_)) { push @fields, "IFNULL($_, '')"; } } - @sar = split " ", $sstr; for $i (0 .. $#sar) { $sar[$i] = $dbh->quote("%${sar[$i]}%"); @@ -447,7 +444,6 @@ sub PrintSearch { my $shablon; - if ($metod eq 'rus') { my $where='0'; @@ -723,6 +719,7 @@ sub PrintField { $value =~ s/^\s+/
    /mg; $value =~ s/^\|([^\n]*)/
$1<\/pre>/mg;
 	}
+
 	return $text ? "$header:\n$value\n\n" : 
 		strong("$header: ") . $value . p . "\n";
 }
@@ -760,7 +757,32 @@ sub PrintQuestion {
 			&PrintField("Ответ", $Question{'Answer'}, $text);
 
 		if ($Question{'Authors'}) {
-			$output .= &PrintField("Автор(ы)", $Question{'Authors'}, $text);
+                      my $q=$Question{'Authors'};
+
+		      my $sth=$dbh->prepare("select Authors.Id,Name, Surname, Nicks from Authors, A2Q
+                                 where Authors.Id=Author And Question=$Id");
+                      $sth->execute;
+                      my ($AuthorId,$Name, $Surname,$other,$Nicks);
+
+                      while ((($AuthorId,$Name, $Surname,$Nicks)=$sth->fetchrow),$AuthorId)
+                      {
+                        my ($firstletter)=$Name=~m/^./g;
+#		        $other.=a({href=>url."?qofauthor=$AuthorId"},"$Name $Surname").". ";
+                          my $sha="(?:$Name\\s+$Surname)|(?:$Surname\\s+$Name)|(?:$firstletter\\.\\s*$Surname)|(?:$Surname\\s+$firstletter\\.)|(?:$Surname)|(?:$Name)";
+                          $Nicks=~s/^\|//;
+                          foreach (split /\|/, $Nicks)
+                          {
+                              s/ /\\s+/;
+                              if (s/>$//) {$sha="$sha|(?:$_)"}
+                              else        {$sha="(?:$_)|$sha"}
+                          }
+#$output.=br."sha=$sha".br;
+                          $q=~s/($sha)/a({href=>url."?qofauthor=$AuthorId"},$1)/ei;
+                      }
+
+			$output .= &PrintField("Автор(ы)", $q, $text);
+
+#                        $output.= &PrintField("Другие вопросы", $other);
 		}
 
 		if ($Question{'Sources'}) {
@@ -899,6 +921,86 @@ sub PrintDates {
 	return $output;
 }
 
+sub PrintQOfAuthor
+{
+    my ($dbh, $id) = @_;
+   $id=$dbh->quote($id);
+    my $sth =  $dbh->prepare("SELECT  Name, Surname FROM Authors WHERE Id=$id");    
+    $sth->execute;
+    my ($name,$surname)=$sth->fetchrow;
+
+    $sth =  $dbh->prepare("SELECT Question FROM A2Q WHERE Author=$id");    
+    $sth->execute;
+    my $q;
+    my @Questions;	
+    while (($q)=$sth->fetchrow,$q)
+     {push @Questions,$q;}
+
+    my ($output, $i, $suffix, $hits) = ('', 0, '', $#Questions + 1);
+
+    if ($hits =~ /1.$/  || $hits =~ /[5-90]$/) {
+		$suffix = 'й';
+	} elsif ($hits =~ /1$/) {
+		$suffix = 'е';
+	} else {
+		$suffix = 'я'; 
+	}
+	
+	print p({align=>"center"}, "Автор ".strong("$name $surname. ") 
+	. " : $hits попадани$suffix.");
+
+
+	for ($i = 0; $i <= $#Questions; $i++) {
+		$output = &PrintQuestion($dbh, $Questions[$i], 1, $i + 1, 1);
+		print $output;
+	}
+}
+
+
+sub PrintAuthors
+{
+     my ($dbh,$sort)=@_;
+     my($output,$out1,@array,$sth);
+     if ($sort eq 'surname') 
+     {
+        $sth = 
+             $dbh->prepare("SELECT Id, Name, Surname, QNumber FROM Authors order by Surname");
+        
+        $output.="";
+     }
+     else
+     {
+        $sth = 
+             $dbh->prepare("SELECT Id, Name, Surname, QNumber FROM Authors Order by QNumber DESC");      
+        $output.="
Алфавитный список авторов
"; + } + + $sth->execute; + $output.=Tr(th["Фамилия, имя", "Количество вопросов"]); + + $out1=''; + + my $ar=$sth->fetchall_arrayref; + + + + foreach my $arr(@$ar) + { + + my ($id,$name,$surname,$kvo)=@$arr; + if (!$name || !$surname) {print "Opanki at $id\n"} else + { + my $add=Tr(td([a({href=>"/cgi-bin/db.cgi?qofauthor=$id"},'[Q] ')."$name $surname", $kvo]))."\n"; + print STDERR $add; + $output.=$add; + } + } + $output.="
"; + return $output; +} + + + MAIN: { setlocale(LC_CTYPE,'russian'); @@ -960,7 +1062,14 @@ EOT } else { print &PrintRandom($dbh, $type, $qnum, $text); } - } elsif (param('sstr')) { + } + elsif (param('authors')){ + print &PrintAuthors($dbh,param('authors')); + } + elsif (param('qofauthor')){ + &PrintQOfAuthor($dbh,param('qofauthor')); + } + elsif (param('sstr')) { &PrintSearch($dbh, param('sstr'), param('metod')); } elsif (param('all')) { print &PrintAll($dbh, 0);