summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Search.pm
diff options
context:
space:
mode:
authorbugreport%peshkin.net <>2004-07-12 08:08:39 +0200
committerbugreport%peshkin.net <>2004-07-12 08:08:39 +0200
commitf5b60b13b9ebe135498421680b8d7b0166d6cb36 (patch)
tree305a5c0f7857f37f576b0969dc46f9ff2950b14a /Bugzilla/Search.pm
parent70d3f400e9ecb6d71ce127f1e799531a8d1f1358 (diff)
downloadbugzilla-f5b60b13b9ebe135498421680b8d7b0166d6cb36.tar.gz
bugzilla-f5b60b13b9ebe135498421680b8d7b0166d6cb36.tar.xz
Bug 245158: Combine multiple redundant LEFT JOINs into a single LEFT JOIN in Search.pm
r=zach,justdave a=justdave
Diffstat (limited to 'Bugzilla/Search.pm')
-rw-r--r--Bugzilla/Search.pm20
1 files changed, 16 insertions, 4 deletions
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm
index 0ebf1e070..aeaf7b0d1 100644
--- a/Bugzilla/Search.pm
+++ b/Bugzilla/Search.pm
@@ -980,6 +980,8 @@ sub init {
# @supptables = Tables and/or table aliases used in query
# %suppseen = A hash used to store all the tables in supptables to weed
# out duplicates.
+# @supplist = A list used to accumulate all the JOIN clauses for each
+# chart to merge the ON sections of each.
# $suppstring = String which is pasted into query containing all table names
# get a list of field names to verify the user-submitted chart fields against
@@ -1061,15 +1063,25 @@ sub init {
}
my %suppseen = ("bugs" => 1);
my $suppstring = "bugs";
+ my @supplist = (" ");
foreach my $str (@supptables) {
if (!$suppseen{$str}) {
- if ($str !~ /^(LEFT|INNER) JOIN/i) {
- $suppstring .= ",";
+ if ($str =~ /^(LEFT|INNER) JOIN/i) {
+ $str =~ /^(.*?)\s+ON\s+(.*)$/i;
+ my ($leftside, $rightside) = ($1, $2);
+ if ($suppseen{$leftside}) {
+ $supplist[$suppseen{$leftside}] .= " AND ($rightside)";
+ } else {
+ $suppseen{$leftside} = scalar @supplist;
+ push @supplist, " $leftside ON ($rightside)";
+ }
+ } else {
+ $suppstring .= ", $str";
+ $suppseen{$str} = 1;
}
- $suppstring .= " $str";
- $suppseen{$str} = 1;
}
}
+ $suppstring .= join('', @supplist);
# Make sure we create a legal SQL query.
@andlist = ("1 = 1") if !@andlist;