From: Dylan William Hardison Date: Tue, 27 Nov 2018 20:58:03 +0000 (-0500) Subject: Bug 1510427 - improve fulltext completion for real names X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12ad788f13453932dbba164fb0b66eef107ecb0a;p=thirdparty%2Fbugzilla.git Bug 1510427 - improve fulltext completion for real names --- diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index 4dd2620d3..79c898d94 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -32,7 +32,7 @@ use Bugzilla::Util; 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; @@ -234,6 +234,21 @@ sub sql_group_by { 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"); diff --git a/Bugzilla/WebService/User.pm b/Bugzilla/WebService/User.pm index 758baf0f9..53c4b70c4 100644 --- a/Bugzilla/WebService/User.pm +++ b/Bugzilla/WebService/User.pm @@ -167,13 +167,13 @@ sub suggest { } 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 ),