--- db/prgsrc/db.cgi 2000/10/24 17:59:25 1.11 +++ db/prgsrc/db.cgi 2001/05/18 20:16:33 1.21 @@ -2,10 +2,12 @@ use DBI; use CGI ':all'; +use Text::Query; use strict; use Time::Local; use POSIX qw(locale_h); - +my $debug=1; #added by R7 +open STDERR, ">/tmp/errors" if $debug; my ($PWD) = `pwd`; chomp $PWD; my ($SRCPATH) = "$PWD/../dimrub/src"; @@ -105,37 +107,79 @@ sub GetTours { # Returns list of QuestionId's, that have the search string in them. sub Search { - my ($dbh, $sstr) = @_; + my ($dbh, $sstr, $metod) = @_; my (@arr, @Questions, @fields); - my (@sar, $i, $sth); + my (@sar, $i, $sth,$where); + my $btime=time; # push @fields, 'Question'; - foreach (qw/Question Answer Sources Authors Comments/) { + +###Simple and advanced query processing. Added by R7 + if ($metod eq 'simple' || $metod eq 'advanced') + { + foreach (qw/Question Answer Sources Authors Comments/) { if (param($_)) { - push @fields, "IFNULL($_, '')"; + push @fields, $_; } } - @sar = split " ", $sstr; - for $i (0 .. $#sar) { + @fields=(qw/Question Answer Sources Authors Comments/) unless scalar @fields; + my $fields=join ",", @fields; + my $q=new Text::Query($sstr, + -parse => 'Text::Query::'. + (($metod eq 'simple') ? 'ParseSimple':'ParseAdvanced'), + -solve => 'Text::Query::SolveSQL', + -build => 'Text::Query::BuildSQLMySQL', + -fields_searched => $fields); + + $where= $$q{'matchexp'}; + my $query= "SELECT Questionid FROM Questions + WHERE $where"; + 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]}%"); - } + } - my($f) = "CONCAT(" . join(',', @fields) . ")"; - if (param('all') eq 'yes') { + my($f) = "CONCAT(" . join(',', @fields) . ")"; + if (param('all') eq 'yes') { $sstr = join " AND $f LIKE ", @sar; - } else { + } else { $sstr = join " OR $f LIKE ", @sar; - } - - $sth = $dbh->prepare("SELECT QuestionId FROM Questions - WHERE $f LIKE $sstr ORDER BY QuestionId"); + } + +### Changed by R7 to prevent showing similar questions######### + + if (param('showequal') eq 'yes') { + $sth = $dbh->prepare("SELECT QuestionId FROM Questions + WHERE $f LIKE $sstr ORDER BY QuestionId"); + } else { + $sth = $dbh->prepare("SELECT QuestionId FROM Questions LEFT JOIN equalto + ON equalto.First=QuestionId WHERE (First IS NULL) AND + ($f LIKE $sstr) ORDER BY QuestionId"); + } + + + } #else -- processing old-style query (R7) $sth->execute; while (@arr = $sth->fetchrow) { push @Questions, $arr[0]; } - + print br, "Search time: ",time-$btime," sec",br if $debug; return @Questions; } @@ -155,8 +199,8 @@ sub NoCase { } sub PrintSearch { - my ($dbh, $sstr) = @_; - my (@Questions) = &Search($dbh, $sstr); + my ($dbh, $sstr, $metod) = @_; + my (@Questions) = &Search($dbh, $sstr,$metod); my ($output, $i, $suffix, $hits) = ('', 0, '', $#Questions + 1); if ($hits =~ /1.$/ || $hits =~ /[5-90]$/) { @@ -176,7 +220,7 @@ sub PrintSearch { $sstr =~ s/(.)/&NoCase($1)/ge; - my(@sar) = split(/\s/, $sstr); + my(@sar) = split(' ', $sstr); for ($i = 0; $i <= $#Questions; $i++) { $output = &PrintQuestion($dbh, $Questions[$i], 1, $i + 1, 1); foreach (@sar) { @@ -465,12 +509,18 @@ sub GetQNum { $sth->execute; return ($sth->fetchrow)[0]; } +sub GetMaxQId { + my ($dbh) = @_; + my ($sth) = $dbh->prepare("SELECT MAX(QuestionId) FROM Questions"); + $sth->execute; + return ($sth->fetchrow)[0]; +} # Returns Id's of 12 random questions sub Get12Random { my ($dbh, $type, $num) = @_; my ($i, @questions, $q, $t, $sth); - my ($qnum) = &GetQNum($dbh); + my ($qnum) = &GetMaxQId($dbh); my (%chosen); srand; @@ -629,7 +679,7 @@ EOT print &PrintRandom($dbh, $type, $qnum, $text); } } elsif (param('sstr')) { - &PrintSearch($dbh, param('sstr')); + &PrintSearch($dbh, param('sstr'), param('metod')); } elsif (param('all')) { print &PrintAll($dbh, 0); } elsif (param('from_year') && param('to_year')) {