]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 245158: Combine multiple redundant LEFT JOINs into a single LEFT JOIN in Search.pm
authorbugreport%peshkin.net <>
Mon, 12 Jul 2004 06:08:39 +0000 (06:08 +0000)
committerbugreport%peshkin.net <>
Mon, 12 Jul 2004 06:08:39 +0000 (06:08 +0000)
r=zach,justdave
a=justdave

Bugzilla/Search.pm

index 0ebf1e070105557b6221754c9f9001fcfcbd1ae7..aeaf7b0d17c0a050fd2bd9478f66ed30c8ef40b6 100644 (file)
@@ -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;