[Rt-commit] r10731 - rt/branches/3.7-RTIR-RELENG/lib/RT

ruz at bestpractical.com ruz at bestpractical.com
Tue Feb 5 16:20:57 EST 2008


Author: ruz
Date: Tue Feb  5 16:20:45 2008
New Revision: 10731

Modified:
   rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm

Log:
* fix searches by link
* replace queries with more robust variants when search uses OR

Modified: rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm
==============================================================================
--- rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm	(original)
+++ rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm	Tue Feb  5 16:20:45 2008
@@ -338,6 +338,11 @@
     my $meta = $FIELD_METADATA{$field};
     die "Invalid Operator $op for $field" unless $op =~ /^(=|!=|IS|IS NOT)$/io;
 
+    my $is_negative = 0;
+    if ( $op eq '!=' || $op =~ /\bNOT\b/i ) {
+        $is_negative = 1;
+    }
+
     my $direction = $meta->[1] || '';
     my ($matchfield, $linkfield) = ('', '');
     if ( $direction eq 'To' ) {
@@ -348,6 +353,15 @@
     }
     elsif ( $direction ) {
         die "Invalid link direction '$direction' for $field\n";
+    } else {
+        $sb->_OpenParen;
+        $sb->_LinkLimit( 'LinkedTo', $op, $value, @rest );
+        $sb->_LinkLimit(
+            'LinkedFrom', $op, $value, @rest,
+            ENTRYAGGREGATOR => $is_negative? 'OR': 'AND'
+        );
+        $sb->_CloseParen;
+        return;
     }
 
     my ($is_local, $is_null) = (1, 0);
@@ -360,12 +374,6 @@
     }
     $matchfield = "Local$matchfield" if $is_local;
 
-    my $is_negative = 0;
-    if ( $op eq '!=' ) {
-        $is_negative = 1;
-        $op = '=';
-    }
-
 #For doing a left join to find "unlinked tickets" we want to generate a query that looks like this
 #    SELECT main.* FROM Tickets main
 #        LEFT JOIN Links Links_1 ON (     (Links_1.Type = 'MemberOf')
@@ -395,7 +403,7 @@
             QUOTEVALUE => 0,
         );
     }
-    elsif ( $is_negative ) {
+    else {
         my $linkalias = $sb->Join(
             TYPE   => 'LEFT',
             ALIAS1 => 'main',
@@ -412,83 +420,18 @@
         $sb->SUPER::Limit(
             LEFTJOIN => $linkalias,
             FIELD    => $matchfield,
-            OPERATOR => $op,
+            OPERATOR => '=',
             VALUE    => $value,
         );
         $sb->_SQLLimit(
             @rest,
             ALIAS      => $linkalias,
             FIELD      => $matchfield,
-            OPERATOR   => 'IS',
+            OPERATOR   => $is_negative? 'IS': 'IS NOT',
             VALUE      => 'NULL',
             QUOTEVALUE => 0,
         );
     }
-    else {
-        my $linkalias = $sb->NewAlias('Links');
-        $sb->_OpenParen;
-
-        $sb->_SQLLimit(
-            @rest,
-            ALIAS    => $linkalias,
-            FIELD    => 'Type',
-            OPERATOR => '=',
-            VALUE    => $meta->[2],
-        ) if $meta->[2];
-
-        $sb->_OpenParen;
-        if ( $direction ) {
-            $sb->_SQLLimit(
-                ALIAS           => $linkalias,
-                FIELD           => 'Local' . $linkfield,
-                OPERATOR        => '=',
-                VALUE           => 'main.id',
-                QUOTEVALUE      => 0,
-                ENTRYAGGREGATOR => 'AND',
-            );
-            $sb->_SQLLimit(
-                ALIAS           => $linkalias,
-                FIELD           => $matchfield,
-                OPERATOR        => '=',
-                VALUE           => $value,
-                ENTRYAGGREGATOR => 'AND',
-            );
-        } else {
-            $sb->_OpenParen;
-            $sb->_SQLLimit(
-                ALIAS           => $linkalias,
-                FIELD           => 'LocalBase',
-                VALUE           => 'main.id',
-                QUOTEVALUE      => 0,
-                ENTRYAGGREGATOR => 'AND',
-            );
-            $sb->_SQLLimit(
-                ALIAS           => $linkalias,
-                FIELD           => $matchfield .'Target',
-                VALUE           => $value,
-                ENTRYAGGREGATOR => 'AND',
-            );
-            $sb->_CloseParen;
-
-            $sb->_OpenParen;
-            $sb->_SQLLimit(
-                ALIAS           => $linkalias,
-                FIELD           => 'LocalTarget',
-                VALUE           => 'main.id',
-                QUOTEVALUE      => 0,
-                ENTRYAGGREGATOR => 'OR',
-            );
-            $sb->_SQLLimit(
-                ALIAS           => $linkalias,
-                FIELD           => $matchfield .'Base',
-                VALUE           => $value,
-                ENTRYAGGREGATOR => 'AND',
-            );
-            $sb->_CloseParen;
-        }
-        $sb->_CloseParen;
-        $sb->_CloseParen;
-    }
 }
 
 =head2 _DateLimit


More information about the Rt-commit mailing list