[Rt-commit] r8433 - rt/branches/3.6-RELEASE/lib/RT

ruz at bestpractical.com ruz at bestpractical.com
Tue Aug 7 16:44:52 EDT 2007


Author: ruz
Date: Tue Aug  7 16:44:52 2007
New Revision: 8433

Modified:
   rt/branches/3.6-RELEASE/lib/RT/Tickets_Overlay.pm

Log:
* fix performance regression in searches by watchers joined
  with other conditions using OR

Modified: rt/branches/3.6-RELEASE/lib/RT/Tickets_Overlay.pm
==============================================================================
--- rt/branches/3.6-RELEASE/lib/RT/Tickets_Overlay.pm	(original)
+++ rt/branches/3.6-RELEASE/lib/RT/Tickets_Overlay.pm	Tue Aug  7 16:44:52 2007
@@ -854,6 +854,8 @@
     $self->_OpenParen;
     if ( $op =~ /^IS(?: NOT)?$/ ) {
         my $group_members = $self->_GroupMembersJoin( GroupsAlias => $groups );
+        # to avoid joining the table Users into the query, we just join GM
+        # and make sure we don't match records where group is member of itself
         $self->SUPER::Limit(
             LEFTJOIN   => $group_members,
             FIELD      => 'GroupId',
@@ -954,16 +956,26 @@
             );
         }
 
-        $self->_SQLLimit(
-            ALIAS         => $users,
-            FIELD         => $rest{SUBKEY},
-            VALUE         => $value,
-            OPERATOR      => $op,
-            CASESENSITIVE => 0,
+        # we join users table without adding some join condition between tables,
+        # the only conditions we have are conditions on the table iteslf,
+        # for example Users.EmailAddress = 'x'. We should add this condition to
+        # the top level of the query and bundle it with another similar conditions,
+        # for example "Users.EmailAddress = 'x' OR Users.EmailAddress = 'Y'".
+        # To achive this goal we use own SUBCLAUSE for conditions on the users table.
+        $self->SUPER::Limit(
             %rest,
-        );
+            SUBCLAUSE       => '_sql_u_watchers_'. $users,
+            ALIAS           => $users,
+            FIELD           => $rest{'SUBKEY'},
+            VALUE           => $value,
+            OPERATOR        => $op,
+            CASESENSITIVE   => 0,
+        );
+        # A condition which ties Users and Groups (role groups) is a left join condition
+        # of CachedGroupMembers table. To get correct results of the query we check
+        # if there are matches in CGM table or not using 'cgm.id IS NOT NULL'.
         $self->_SQLLimit(
-            ENTRYAGGREGATOR => 'AND',
+            %rest,
             ALIAS           => $group_members,
             FIELD           => 'id',
             OPERATOR        => 'IS NOT',


More information about the Rt-commit mailing list