зеркало из https://github.com/mozilla/gecko-dev.git
Bug 127200 Query for CC/longdesc/OR takes long time
r=gerv
This commit is contained in:
Родитель
85132aacd6
Коммит
bf2d2c35a9
|
@ -178,6 +178,11 @@ sub init {
|
|||
}
|
||||
}
|
||||
if ($params->param("emaillongdesc$id")) {
|
||||
if (my $list = $self->ListIDsForEmail($type, $email)) {
|
||||
my $table = "longdescs_";
|
||||
push(@supptables, "LEFT JOIN longdescs $table ON bugs.bug_id = $table.bug_id AND $table.who IN($list)");
|
||||
push(@clist, "$table.who",'isnotnull');
|
||||
} else {
|
||||
my $table = "longdescs_";
|
||||
push(@supptables, "longdescs $table");
|
||||
push(@wherepart, "$table.bug_id = bugs.bug_id");
|
||||
|
@ -186,6 +191,7 @@ sub init {
|
|||
push(@wherepart, "$table.who = $ptable.userid");
|
||||
push(@clist, "$ptable.login_name", $type, $email);
|
||||
}
|
||||
}
|
||||
if (@clist) {
|
||||
push(@specialchart, \@clist);
|
||||
} else {
|
||||
|
@ -291,6 +297,21 @@ sub init {
|
|||
$f = "map_$f.login_name";
|
||||
},
|
||||
|
||||
"^cc,(anyexact|substring)" => sub {
|
||||
my $list;
|
||||
$list = $self->ListIDsForEmail($t, $v);
|
||||
if ($list) {
|
||||
push(@supptables, "LEFT JOIN cc cc_$chartid ON bugs.bug_id = cc_$chartid.bug_id AND cc_$chartid.who IN($list)");
|
||||
$term = "cc_$chartid.who IS NOT NULL";
|
||||
} else {
|
||||
push(@supptables, "LEFT JOIN cc cc_$chartid ON bugs.bug_id = cc_$chartid.bug_id");
|
||||
|
||||
push(@supptables, "LEFT JOIN profiles map_cc_$chartid ON cc_$chartid.who = map_cc_$chartid.userid");
|
||||
$ff = $f = "map_cc_$chartid.login_name";
|
||||
my $ref = $funcsbykey{",anyexact"};
|
||||
&$ref;
|
||||
}
|
||||
},
|
||||
"^cc," => sub {
|
||||
push(@supptables, "LEFT JOIN cc cc_$chartid ON bugs.bug_id = cc_$chartid.bug_id");
|
||||
|
||||
|
@ -570,6 +591,9 @@ sub init {
|
|||
",lessthan" => sub {
|
||||
$term = "$ff < $q";
|
||||
},
|
||||
",isnotnull" => sub {
|
||||
$term = "$ff IS NOT NULL";
|
||||
},
|
||||
",greaterthan" => sub {
|
||||
$term = "$ff > $q";
|
||||
},
|
||||
|
@ -926,6 +950,45 @@ sub SqlifyDate {
|
|||
return time2str("%Y-%m-%d %H:%M:%S", $date);
|
||||
}
|
||||
|
||||
# ListIDsForEmail returns an string with a comma-joined list
|
||||
# of userids matching an email address
|
||||
# according to the type specified.
|
||||
# Currently, this only supports anyexact and substring matches.
|
||||
# Substring matches will return up to 50 matching userids
|
||||
# If a match type is unsupported or returns too many matches,
|
||||
# ListIDsForEmail returns an undef.
|
||||
sub ListIDsForEmail {
|
||||
my ($self, $type, $email) = (@_);
|
||||
my $old = $self->{"emailcache"}{"$type,$email"};
|
||||
return undef if ($old && $old eq "---");
|
||||
return $old if $old;
|
||||
my @list = ();
|
||||
my $list = "---";
|
||||
if ($type eq 'anyexact') {
|
||||
foreach my $w (split(/,/, $email)) {
|
||||
$w = trim($w);
|
||||
my $id = &::DBname_to_id($w);
|
||||
if ($id > 0) {
|
||||
push(@list,$id)
|
||||
}
|
||||
}
|
||||
$list = join(',', @list);
|
||||
} elsif ($type eq 'substring') {
|
||||
&::SendSQL("SELECT userid FROM profiles WHERE INSTR(login_name, " .
|
||||
&::SqlQuote($email) . ") LIMIT 51");
|
||||
while (&::MoreSQLData()) {
|
||||
my ($id) = &::FetchSQLData();
|
||||
push(@list, $id);
|
||||
}
|
||||
if (@list < 50) {
|
||||
$list = join(',', @list);
|
||||
}
|
||||
}
|
||||
$self->{"emailcache"}{"$type,$email"} = $list;
|
||||
return undef if ($list eq "---");
|
||||
return $list;
|
||||
}
|
||||
|
||||
sub GetByWordList {
|
||||
my ($field, $strs) = (@_);
|
||||
my @list;
|
||||
|
|
Загрузка…
Ссылка в новой задаче