From b95653cb87e90baca8767fe0bdff7b67c4355b52 Mon Sep 17 00:00:00 2001 From: "bugreport%peshkin.net" Date: Sun, 11 Jul 2004 23:08:39 +0000 Subject: [PATCH] Bug 245158: Combine multiple redundant LEFT JOINs into a single LEFT JOIN in Search.pm r=zach,justdave a=justdave git-svn-id: svn://10.0.0.236/trunk@159036 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/webtools/bugzilla/Bugzilla/Search.pm | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/mozilla/webtools/bugzilla/Bugzilla/Search.pm b/mozilla/webtools/bugzilla/Bugzilla/Search.pm index 0ebf1e07010..aeaf7b0d17c 100644 --- a/mozilla/webtools/bugzilla/Bugzilla/Search.pm +++ b/mozilla/webtools/bugzilla/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;