From e6af0fa7e36b078552164603276041fdace5654b Mon Sep 17 00:00:00 2001 From: vfilippov Date: Tue, 3 Aug 2010 16:51:14 +0000 Subject: [PATCH] Bug 64855 - Matches relative to length git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@901 6955db30-a419-402b-8a0d-67ecbb4d7f56 --- Bugzilla/Config/UserMatch.pm | 2 +- Bugzilla/User.pm | 9 +++++---- template/en/default/admin/params/usermatch.html.tmpl | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Bugzilla/Config/UserMatch.pm b/Bugzilla/Config/UserMatch.pm index 032c2c620..fea36420d 100644 --- a/Bugzilla/Config/UserMatch.pm +++ b/Bugzilla/Config/UserMatch.pm @@ -69,7 +69,7 @@ sub get_param_list { name => 'levenshteinusermatch', type => 't', default => '0', - checker => \&check_numeric + checker => sub { $_[0] =~ /^\d+(\.\d+)?$/so ? "" : "must be a float or integer value" }, }, ); return @param_list; diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm index c18203656..689390a0b 100644 --- a/Bugzilla/User.pm +++ b/Bugzilla/User.pm @@ -1204,10 +1204,11 @@ sub match { { # CustIS Bug 64855 # try Levenshtein distance also, if enabled - $query .= " OR levenshtein(?, login_name) < ?"; - $query .= " OR (CASE WHEN INSTR(login_name, '\@') > 0 THEN levenshtein(?, SUBSTR(login_name, 1, INSTR(login_name, '\@')-1)) ELSE 0 END) < ?"; - push @bind, $str, Bugzilla->params->{levenshteinusermatch}; - push @bind, $str, Bugzilla->params->{levenshteinusermatch}; + my $n = Bugzilla->params->{levenshteinusermatch}; + $query .= " OR levenshtein(?, login_name) < ".($n < 1 ? "FLOOR(? * LENGTH(login_name))" : "?"); + $query .= " OR (CASE WHEN INSTR(login_name, '\@') > 0 THEN levenshtein(?, SUBSTR(login_name, 1, INSTR(login_name, '\@')-1)) ELSE NULL END) < ".($n < 1 ? "FLOOR(? * (INSTR(login_name, '\@')-1))" : "?"); + push @bind, $str, $n; + push @bind, $str, $n; } $query .= ") "; if (Bugzilla->params->{'usevisibilitygroups'}) { diff --git a/template/en/default/admin/params/usermatch.html.tmpl b/template/en/default/admin/params/usermatch.html.tmpl index 6eda917d5..4dff1cc10 100644 --- a/template/en/default/admin/params/usermatch.html.tmpl +++ b/template/en/default/admin/params/usermatch.html.tmpl @@ -40,11 +40,12 @@ emailin_autoregister => "Whether an unknown e-mail address should be converted into an " _ "automatically registered disabled user account when processing incoming emails by email_in.pl", - levenshteinusermatch => "If this option is set to a non-zero value (say N), $terms.Bugzilla will " _ + levenshteinusermatch => "If this option is set to a positive value (say N), $terms.Bugzilla will " _ "also offer you any user if Levenshtein distance between " _ - "his login name and the entered value is less than N.
" _ + "his login name and the entered value is less than N.
" _ "I.e. this option allows $terms.Bugzilla to automatically correct N-1 " _ "misprints in user fields.
" _ + "If N is not an integer value, it is treated relative to the length of compared string.
" _ "Levenshtein distance is calculated via MySQL User-Defined Function levenshtein(). " _ "This function is not available by default and must be installed into MySQL separately.", }