diff options
author | lpsolit%gmail.com <> | 2005-07-13 07:54:43 +0200 |
---|---|---|
committer | lpsolit%gmail.com <> | 2005-07-13 07:54:43 +0200 |
commit | 4b29000946fb102e2db7d8ac5c6c502c03387de1 (patch) | |
tree | d112a5323aecf27272a04f59a0e499a837e98092 /Bugzilla | |
parent | 6faf47b4e7dffd80f61bc731245d7bbafb74b9af (diff) | |
download | bugzilla-4b29000946fb102e2db7d8ac5c6c502c03387de1.tar.gz bugzilla-4b29000946fb102e2db7d8ac5c6c502c03387de1.tar.xz |
Bug 297098: Optimize multiple email searches - Patch by Joel Peshkin <bugreport@peshkin.net> r=myk,LpSolit a=myk
Diffstat (limited to 'Bugzilla')
-rw-r--r-- | Bugzilla/Search.pm | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 8e43353a3..710334049 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -25,6 +25,7 @@ # Myk Melez <myk@mozilla.org> # Michael Schindler <michael@compressconsult.com> # Max Kanat-Alexander <mkanat@bugzilla.org> +# Joel Peshkin <bugreport@peshkin.net> use strict; @@ -427,9 +428,14 @@ sub init { $term = "bugs.$f <> " . pronoun($1, $user); }, "^(assigned_to|reporter),(?!changed)" => sub { - push(@supptables, "INNER JOIN profiles AS map_$f " . - "ON bugs.$f = map_$f.userid"); - $f = "map_$f.login_name"; + my $list = $self->ListIDsForEmail($t, $v); + if ($list) { + $term = "bugs.$f IN ($list)"; + } else { + push(@supptables, "INNER JOIN profiles AS map_$f " . + "ON bugs.$f = map_$f.userid"); + $f = "map_$f.login_name"; + } }, "^qa_contact,(?!changed)" => sub { push(@supptables, "LEFT JOIN profiles AS map_qa_contact " . @@ -489,7 +495,7 @@ sub init { "AND cc_$chartseq.who = $match"); $term = "cc_$chartseq.who IS NULL"; }, - "^cc,(anyexact|substring)" => sub { + "^cc,(anyexact|substring|regexp)" => sub { my $list; $list = $self->ListIDsForEmail($t, $v); my $chartseq = $chartid; @@ -1450,8 +1456,8 @@ sub SqlifyDate { # ListIDsForEmail returns a string with a comma-joined list # of userids matching email addresses # according to the type specified. -# Currently, this only supports exact, anyexact, and substring matches. -# Substring matches will return up to 50 matching userids +# Currently, this only supports regexp, exact, anyexact, and substring matches. +# 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 { @@ -1480,7 +1486,18 @@ sub ListIDsForEmail { my ($id) = &::FetchSQLData(); push(@list, $id); } - if (@list < 50) { + if (scalar(@list) < 50) { + $list = join(',', @list); + } + } elsif ($type eq 'regexp') { + &::SendSQL("SELECT userid FROM profiles WHERE " . + "login_name " . $dbh->sql_regexp() . ::SqlQuote($email) . + " " . $dbh->sql_limit(51)); + while (&::MoreSQLData()) { + my ($id) = &::FetchSQLData(); + push(@list, $id); + } + if (scalar(@list) < 50) { $list = join(',', @list); } } |