diff options
-rwxr-xr-x | buglist.cgi | 37 | ||||
-rwxr-xr-x | query.cgi | 2 |
2 files changed, 34 insertions, 5 deletions
diff --git a/buglist.cgi b/buglist.cgi index 7b53b9a15..6f791a6df 100755 --- a/buglist.cgi +++ b/buglist.cgi @@ -475,13 +475,36 @@ if (defined $ref && 0 < @$ref) { } } +sub GetByWordList { + my ($field, $strs, $verb) = (@_); + my @list; + + foreach my $w (split(/[\s,]+/, $strs)) { + my $word = $w; + if ($word ne "") { + $word =~ tr/A-Z/a-z/; + $word = SqlQuote(quotemeta($word)); + $word =~ s/^'//; + $word =~ s/'$//; + $word = '(^|[^a-z0-9])' . $word . '($|[^a-z0-9])'; + push(@list, "lower($field) regexp '$word'"); + } + } + + if (0 == @list) { + return ""; + } + + return "and (" . join(" $verb ", @list) . ")\n"; +} + foreach my $f ("short_desc", "long_desc", "bug_file_loc", "status_whiteboard") { if (defined $::FORM{$f}) { my $s = trim($::FORM{$f}); if ($s ne "") { my $n = $f; - $s = SqlQuote($s); + my $q = SqlQuote($s); my $type = $::FORM{$f . "_type"}; if ($f eq "long_desc") { # Patch in the longdescs table. @@ -490,13 +513,17 @@ foreach my $f ("short_desc", "long_desc", "bug_file_loc", $n = "longdescs.thetext"; } if ($type eq "regexp") { - $query .= "and $n regexp $s\n"; + $query .= "and $n regexp $q\n"; } elsif ($type eq "notregexp") { - $query .= "and $n not regexp $s\n"; + $query .= "and $n not regexp $q\n"; } elsif ($type eq "casesubstring") { - $query .= "and instr($n, $s)\n"; + $query .= "and instr($n, $q)\n"; + } elsif ($type eq "allwords") { + $query .= GetByWordList($f, $s, "and"); + } elsif ($type eq "anywords") { + $query .= GetByWordList($f, $s, "or"); } else { - $query .= "and instr(lower($n), lower($s))\n"; + $query .= "and instr(lower($n), lower($q))\n"; } } } @@ -511,6 +511,8 @@ sub StringSearch { } foreach my $i (["substring", "case-insensitive substring"], ["casesubstring", "case-sensitive substring"], + ["allwords", "all words"], + ["anywords", "any words"], ["regexp", "regular expression"], ["notregexp", "not ( regular expression )"]) { my ($n, $d) = (@$i); |