From f5b60b13b9ebe135498421680b8d7b0166d6cb36 Mon Sep 17 00:00:00 2001 From: "bugreport%peshkin.net" <> Date: Mon, 12 Jul 2004 06:08:39 +0000 Subject: Bug 245158: Combine multiple redundant LEFT JOINs into a single LEFT JOIN in Search.pm r=zach,justdave a=justdave --- Bugzilla/Search.pm | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'Bugzilla/Search.pm') 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; -- cgit v1.2.3-24-g4f1b