summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Search.pm
diff options
context:
space:
mode:
authorlpsolit%gmail.com <>2005-07-13 07:54:43 +0200
committerlpsolit%gmail.com <>2005-07-13 07:54:43 +0200
commit4b29000946fb102e2db7d8ac5c6c502c03387de1 (patch)
treed112a5323aecf27272a04f59a0e499a837e98092 /Bugzilla/Search.pm
parent6faf47b4e7dffd80f61bc731245d7bbafb74b9af (diff)
downloadbugzilla-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/Search.pm')
-rw-r--r--Bugzilla/Search.pm31
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);
}
}