Bug 64855 - Matches relative to length

git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@901 6955db30-a419-402b-8a0d-67ecbb4d7f56
master
vfilippov 2010-08-03 16:51:14 +00:00
parent 66d33dc1a9
commit e6af0fa7e3
3 changed files with 9 additions and 7 deletions

View File

@ -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;

View File

@ -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'}) {

View File

@ -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.<br>" _
"his login name and the entered value is less than N. <br>" _
"I.e. this option allows $terms.Bugzilla to automatically correct N-1 " _
"misprints in user fields.<br>" _
"If N is not an integer value, it is treated relative to the length of compared string. <br>" _
"Levenshtein distance is calculated via MySQL User-Defined Function levenshtein(). " _
"This function is not available by default and must be installed into MySQL separately.",
}