use Bugzilla::Error;
use Bugzilla::DB::Schema::Mysql;
-use List::Util qw(max any);
+use List::Util qw(max any all);
use Text::ParseWords;
use Carp;
return "GROUP BY $needed_columns";
}
+sub sql_prefix_match_fulltext {
+ my ($self, $column, $prefix) = @_;
+ my @words = split(/\s+/, $prefix);
+ if (all { /^\w+$/ } @words) {
+ $words[-1] .= '*';
+ return sprintf(
+ 'MATCH(%s) AGAINST (%s IN BOOLEAN MODE)',
+ $column,
+ $self->quote(join(' ', map { "+$_" } @words))
+ );
+ } else {
+ return sprintf('MATCH(%s) AGAINST (%s)', $column, $self->quote($prefix));
+ }
+}
+
sub bz_explain {
my ($self, $sql) = @_;
my $sth = $self->prepare("EXPLAIN $sql");
}
else {
if ($have_mysql && ( $s =~ /[[:space:]]/ || $s =~ /[^[:ascii:]]/ ) ) {
- my $match = sprintf 'MATCH(realname) AGAINST (%s) ', $dbh->quote($s);
+ my $match = $dbh->sql_prefix_match_fulltext('realname', $s);
push @select, "$match AS relevance";
$order = 'relevance DESC';
$where = $match;
}
elsif ($have_mysql && $s =~ /^[[:upper:]]/) {
- my $match = sprintf 'MATCH(realname) AGAINST (%s) ', $dbh->quote($s);
+ my $match = $dbh->sql_prefix_match_fulltext('realname', $s);
$where = join ' OR ',
$match,
$dbh->sql_prefix_match( nickname => $s ),