diff options
author | bugreport%peshkin.net <> | 2004-07-12 08:08:39 +0200 |
---|---|---|
committer | bugreport%peshkin.net <> | 2004-07-12 08:08:39 +0200 |
commit | f5b60b13b9ebe135498421680b8d7b0166d6cb36 (patch) | |
tree | 305a5c0f7857f37f576b0969dc46f9ff2950b14a /Bugzilla | |
parent | 70d3f400e9ecb6d71ce127f1e799531a8d1f1358 (diff) | |
download | bugzilla-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')
-rw-r--r-- | Bugzilla/Search.pm | 20 |
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; |