]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1510427 - improve fulltext completion for real names
authorDylan William Hardison <dylan@hardison.net>
Tue, 27 Nov 2018 20:58:03 +0000 (15:58 -0500)
committerGitHub <noreply@github.com>
Tue, 27 Nov 2018 20:58:03 +0000 (15:58 -0500)
Bugzilla/DB/Mysql.pm
Bugzilla/WebService/User.pm

index 4dd2620d3aa37ad81c198b97925df7d8578e8d53..79c898d9480f4248bc0c8066e4ce978c7e275747 100644 (file)
@@ -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");
index 758baf0f95e62120b2b8dbd9e01c307071737396..53c4b70c42fb9f564c6e668a47806c6548b6f5c7 100644 (file)
@@ -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 ),