[Rt-commit] [svn] r913 - in rt/trunk: . lib/RT lib/t

jesse at pallas.eruditorum.org jesse at pallas.eruditorum.org
Mon May 17 16:05:26 EDT 2004


Author: jesse
Date: Mon May 17 16:05:25 2004
New Revision: 913

Modified:
   rt/trunk/   (props changed)
   rt/trunk/lib/RT/Tickets_Overlay.pm
   rt/trunk/lib/RT/Tickets_Overlay_SQL.pm
   rt/trunk/lib/t/04_send_email.pl.in
Log:
Backported ticket searching fixes from 3.1; fixed a bug in email address testing code

Modified: rt/trunk/lib/RT/Tickets_Overlay.pm
==============================================================================
--- rt/trunk/lib/RT/Tickets_Overlay.pm	(original)
+++ rt/trunk/lib/RT/Tickets_Overlay.pm	Mon May 17 16:05:25 2004
@@ -293,12 +293,13 @@
   die "Incorrect Meta Data for $field"
     unless (defined $meta->[1] and defined $meta->[2]);
 
-  my $LinkAlias = $sb->NewAlias ('Links');
+  $sb->{_sql_linkalias} = $sb->NewAlias ('Links')
+    unless defined $sb->{_sql_linkalias};
 
   $sb->_OpenParen();
 
   $sb->_SQLLimit(
-	     ALIAS => $LinkAlias,
+	     ALIAS => $sb->{_sql_linkalias},
 	     FIELD =>   'Type',
 	     OPERATOR => '=',
 	     VALUE => $meta->[2],
@@ -309,7 +310,7 @@
     my $matchfield = ( $value  =~ /^(\d+)$/ ? "LocalTarget" : "Target" );
 
     $sb->_SQLLimit(
-	       ALIAS => $LinkAlias,
+	       ALIAS => $sb->{_sql_linkalias},
 	       ENTRYAGGREGATOR => 'AND',
 	       FIELD =>   $matchfield,
 	       OPERATOR => '=',
@@ -317,14 +318,14 @@
 	      );
 
     #If we're searching on target, join the base to ticket.id
-    $sb->Join( ALIAS1 => 'main', FIELD1 => $sb->{'primary_key'},
-	       ALIAS2 => $LinkAlias,	 FIELD2 => 'LocalBase');
+    $sb->_SQLJoin( ALIAS1 => 'main', FIELD1 => $sb->{'primary_key'},
+	       ALIAS2 => $sb->{_sql_linkalias},	 FIELD2 => 'LocalBase');
 
   } elsif ( $meta->[1] eq "From" ) {
     my $matchfield = ( $value  =~ /^(\d+)$/ ? "LocalBase" : "Base" );
 
     $sb->_SQLLimit(
-	       ALIAS => $LinkAlias,
+	       ALIAS => $sb->{_sql_linkalias},
 	       ENTRYAGGREGATOR => 'AND',
 	       FIELD =>   $matchfield,
 	       OPERATOR => '=',
@@ -332,8 +333,8 @@
 	      );
 
     #If we're searching on base, join the target to ticket.id
-    $sb->Join( ALIAS1 => 'main',     FIELD1 => $sb->{'primary_key'},
-	       ALIAS2 => $LinkAlias, FIELD2 => 'LocalTarget');
+    $sb->_SQLJoin( ALIAS1 => 'main',     FIELD1 => $sb->{'primary_key'},
+	       ALIAS2 => $sb->{_sql_linkalias}, FIELD2 => 'LocalTarget');
 
   } else {
     die "Invalid link direction '$meta->[1]' for $field\n";
@@ -462,11 +463,11 @@
   $sb->_OpenParen;
 
   # Join Transactions To Attachments
-  $sb->Join( ALIAS1 => $sb->{_sql_trattachalias}, FIELD1 => 'TransactionId',
+  $sb->_SQLJoin( ALIAS1 => $sb->{_sql_trattachalias}, FIELD1 => 'TransactionId',
 	     ALIAS2 => $sb->{_sql_transalias}, FIELD2 => 'id');
 
   # Join Transactions to Tickets
-  $sb->Join( ALIAS1 => 'main', FIELD1 => $sb->{'primary_key'}, # UGH!
+  $sb->_SQLJoin( ALIAS1 => 'main', FIELD1 => $sb->{'primary_key'}, # UGH!
 	     ALIAS2 => $sb->{_sql_transalias}, FIELD2 => 'Ticket');
 
   my $d = new RT::Date( $sb->CurrentUser );
@@ -536,7 +537,6 @@
 
   $sb->_OpenParen;
 
-
   #Search for the right field
   $sb->_SQLLimit(ALIAS => $sb->{_sql_trattachalias},
 		 FIELD =>    $field,
@@ -616,7 +616,7 @@
 		   VALUE => 'RT::Ticket-Role',
 		   ENTRYAGGREGATOR => 'AND');
 
-  $self->Join(ALIAS1 => $groups, FIELD1 => 'Instance',
+  $self->_SQLJoin(ALIAS1 => $groups, FIELD1 => 'Instance',
 	      ALIAS2 => 'main',   FIELD2 => 'id');
   # }}}
 
@@ -631,10 +631,10 @@
 		     ENTRYAGGREGATOR => 'AND');
   }
 
-  $self->Join (ALIAS1 => $groups,  FIELD1 => 'id',
+  $self->_SQLJoin (ALIAS1 => $groups,  FIELD1 => 'id',
 	       ALIAS2 => $groupmembers, FIELD2 => 'GroupId');
 
-  $self->Join( ALIAS1 => $groupmembers, FIELD1 => 'MemberId',
+  $self->_SQLJoin( ALIAS1 => $groupmembers, FIELD1 => 'MemberId',
 	       ALIAS2 => $users, FIELD2 => 'id');
 
  $self->_CloseParen;
@@ -671,7 +671,7 @@
 			OPERATOR => '=',
 			VALUE =>    $restriction->{'TARGET'} );
     #If we're searching on target, join the base to ticket.id
-    $self->Join( ALIAS1 => 'main', FIELD1 => $self->{'primary_key'},
+    $self->_SQLJoin( ALIAS1 => 'main', FIELD1 => $self->{'primary_key'},
 		 ALIAS2 => $LinkAlias,
 		 FIELD2 => 'LocalBase');
   }
@@ -692,7 +692,7 @@
 			OPERATOR => '=',
 			VALUE =>    $restriction->{'BASE'} );
     #If we're searching on base, join the target to ticket.id
-    $self->Join( ALIAS1 => 'main', FIELD1 => $self->{'primary_key'},
+    $self->_SQLJoin( ALIAS1 => 'main', FIELD1 => $self->{'primary_key'},
 		 ALIAS2 => $LinkAlias,
 		 FIELD2 => 'LocalTarget')
   }
@@ -760,7 +760,7 @@
     $TicketCFs = $self->{_sql_keywordalias}{$cfid};
   } else {
     $TicketCFs = $self->{_sql_keywordalias}{$cfid} =
-      $self->Join( TYPE   => 'left',
+      $self->_SQLJoin( TYPE   => 'left',
 		   ALIAS1 => 'main',
 		   FIELD1 => 'id',
 		   TABLE2 => 'TicketCustomFieldValues',
@@ -862,14 +862,20 @@
 Returns a frozen string suitable for handing back to ThawLimits.
 
 =cut
+
+sub _FreezeThawKeys {
+    'TicketRestrictions',
+    'restriction_index',
+    'looking_at_effective_id',
+    'looking_at_type'
+}
+
 # {{{ sub FreezeLimits
 
 sub FreezeLimits {
 	my $self = shift;
 	require FreezeThaw;
-	return (FreezeThaw::freeze($self->{'TicketRestrictions'},
-				   $self->{'restriction_index'}
-				  ));
+	return (FreezeThaw::freeze(@{$self}{$self->_FreezeThawKeys}));
 }
 
 # }}}
@@ -896,9 +902,7 @@
 	#We don't need to die if the thaw fails.
 	
 	eval {
-		($self->{'TicketRestrictions'},
-		$self->{'restriction_index'}
-		) = FreezeThaw::thaw($in);
+		@{$self}{$self->_FreezeThawKeys} = FreezeThaw::thaw($in);
 	};
 	$RT::Logger->error( $@ ) if $@;
 
@@ -1752,6 +1756,7 @@
     $self->{'primary_key'} = "id";
     delete $self->{'items_array'};
     delete $self->{'item_map'};
+    delete $self->{'columns_to_display'};
     $self->SUPER::_Init(@_);
 
     $self->_InitSQL;

Modified: rt/trunk/lib/RT/Tickets_Overlay_SQL.pm
==============================================================================
--- rt/trunk/lib/RT/Tickets_Overlay_SQL.pm	(original)
+++ rt/trunk/lib/RT/Tickets_Overlay_SQL.pm	Mon May 17 16:05:25 2004
@@ -24,6 +24,8 @@
 use strict;
 use warnings;
 
+use RT::Tickets;
+
 # Import configuration data from the lexcial scope of __PACKAGE__ (or
 # at least where those two Subroutines are defined.)
 
@@ -46,6 +48,7 @@
   $self->{'_sql_subclause'}     = "a";
   $self->{'_sql_first'}         = 0;
   $self->{'_sql_opstack'}       = [''];
+  $self->{'_sql_linkalias'}    = undef;
   $self->{'_sql_transalias'}    = undef;
   $self->{'_sql_trattachalias'} = undef;
   $self->{'_sql_keywordalias'}  = undef;
@@ -53,6 +56,7 @@
   $self->{'_sql_localdepth'}    = 0;
   $self->{'_sql_query'}         = '';
   $self->{'_sql_looking_at'}    = {};
+  $self->{'_sql_columns_to_display'} = [];
 
 }
 
@@ -60,10 +64,20 @@
   # All SQL stuff goes into one SB subclause so we can deal with all
   # the aggregation
   my $this = shift;
+
   $this->SUPER::Limit(@_,
                       SUBCLAUSE => 'ticketsql');
 }
 
+sub _SQLJoin {
+  # All SQL stuff goes into one SB subclause so we can deal with all
+  # the aggregation
+  my $this = shift;
+
+  $this->SUPER::Join(@_,
+		     SUBCLAUSE => 'ticketsql');
+}
+
 # Helpers
 sub _OpenParen {
   $_[0]->SUPER::_OpenParen( 'ticketsql' );
@@ -169,6 +183,10 @@
   # because it has spaces in it.  otherwise "NOT LIKE" might be parsed
   # as a keyword or value.
 
+
+
+
+
   while ($string =~ /(
                       $re_aggreg
                       |$re_op
@@ -180,12 +198,13 @@
     my $current = 0;
 
     # Highest priority is last
-    $current = OP      if _match($re_op,$val);
+    $current = OP      if _match($re_op,$val) ;
     $current = VALUE   if _match($re_value,$val);
     $current = KEYWORD if _match($re_keyword,$val) && ($want & KEYWORD);
     $current = AGGREG  if _match($re_aggreg,$val);
     $current = PAREN   if _match($re_paren,$val);
 
+
     unless ($current && $want & $current) {
       # Error
       # FIXME: I will only print out the highest $want value
@@ -194,6 +213,8 @@
 
     # State Machine:
 
+    #$RT::Logger->debug("We've just found a '$current' called '$val'");
+
     # Parens are highest priority
     if ($current & PAREN) {
       if ($val eq "(") {
@@ -209,6 +230,7 @@
 
       $want = KEYWORD | PAREN | AGGREG;
     }
+
     elsif ( $current & AGGREG ) {
       $ea = $val;
       $want = KEYWORD | PAREN;
@@ -234,7 +256,7 @@
         substr($val,0,1) = "";
         substr($val,-1,1) = "";
       }
-      # Unescape escaped characters                                            
+      # Unescape escaped characters
       $key =~ s!\\(.)!$1!g;                                                    
       $val =~ s!\\(.)!$1!g;     
       #    print "$ea Key=[$key] op=[$op]  val=[$val]\n";
@@ -349,6 +371,72 @@
 Returns (1, 'Status message') on success and (0, 'Error Message') on
 failure.
 
+
+=begin testing
+
+use RT::Tickets;
+
+
+
+my $tix = RT::Tickets->new($RT::SystemUser);
+
+my $query = "Status = 'open'";
+my ($id, $msg)  = $tix->FromSQL($query);
+
+ok ($id, $msg);
+
+
+my (@ids, @expectedids);
+
+my $t = RT::Ticket->new($RT::SystemUser);
+
+my $string = 'subject/content SQL test';
+ok( $t->Create(Queue => 'General', Subject => $string), "Ticket Created");
+
+push @ids, $t->Id;
+
+my $Message = MIME::Entity->build(
+			     Subject     => 'this is my subject',
+			     From        => 'jesse at example.com',
+			     Data        => [ $string ],
+        );
+
+ok( $t->Create(Queue => 'General', Subject => 'another ticket', MIMEObj => $Message, MemberOf => $ids[0]), "Ticket Created");
+
+push @ids, $t->Id;
+
+$query = ("Subject LIKE '$string' OR Content LIKE '$string'");
+
+my ($id, $msg) = $tix->FromSQL($query);
+
+ok ($id, $msg);
+
+is ($tix->Count, scalar @ids, "number of returned tickets same as entered");
+
+while (my $tick = $tix->Next) {
+    push @expectedids, $tick->Id;
+}
+
+ok (eq_array(\@ids, \@expectedids), "returned expected tickets");
+
+$query = ("id = $ids[0] OR MemberOf = $ids[0]");
+
+my ($id, $msg) = $tix->FromSQL($query);
+
+ok ($id, $msg);
+
+is ($tix->Count, scalar @ids, "number of returned tickets same as entered");
+
+ at expectedids = ();
+while (my $tick = $tix->Next) {
+    push @expectedids, $tick->Id;
+}
+
+ok (eq_array(\@ids, \@expectedids), "returned expected tickets");
+
+=end testing
+
+
 =cut
 
 sub FromSQL {
@@ -356,13 +444,15 @@
 
   $self->CleanSlate;
   $self->_InitSQL();
-  return (1,"No Query") unless $query;
+
+  return (1,$self->loc("No Query")) unless $query;
 
   $self->{_sql_query} = $query;
   eval { $self->_parser( $query ); };
-  $RT::Logger->error( $@ ) if $@;
-  return(0,$@) if $@;
-
+    if ($@) {
+        $RT::Logger->error( $@ );
+        return(0,$@);
+    }
   # We only want to look at EffectiveId's (mostly) for these searches.
   unless (exists $self->{_sql_looking_at}{'effectiveid'}) {
   $self->SUPER::Limit( FIELD           => 'EffectiveId',
@@ -386,9 +476,7 @@
   # Unless we've explicitly asked to look at a specific Type, we need
   # to limit to it.
   unless ($self->{looking_at_type}) {
-    $self->SUPER::Limit( FIELD => 'Type',
-                         OPERATOR => '=',
-                         VALUE => 'ticket');
+    $self->SUPER::Limit( FIELD => 'Type', OPERATOR => '=', VALUE => 'ticket');
   }
 
   # We never ever want to show deleted tickets
@@ -399,10 +487,22 @@
   $self->{'must_redo_search'} = 1;
   $self->{'RecalcTicketLimits'} = 0;                                           
 
-  return (1,"Good Query");
+  return (1,$self->loc("Valid Query"));
 
 }
 
+=head2 Query
+
+Returns the query that this object was initialized with
+
+=cut
+
+sub Query {
+    my $self = shift;
+    return ($self->{_sql_query}); 
+}
+
+
 
 1;
 

Modified: rt/trunk/lib/t/04_send_email.pl.in
==============================================================================
--- rt/trunk/lib/t/04_send_email.pl.in	(original)
+++ rt/trunk/lib/t/04_send_email.pl.in	Mon May 17 16:05:25 2004
@@ -476,6 +476,31 @@
 
 # }}}
 
+# {{{ test a multi-line RT-Send-CC header
+
+my $content =  `cat @RT_LIB_PATH@/t/data/rt-send-cc` || die "couldn't find new content";
+
+$parser->ParseMIMEEntityFromScalar($content);
+
+
+
+my %args =        (message => $content, queue => 1, action => 'correspond');
+ RT::Interface::Email::Gateway(\%args);
+my $tickets = RT::Tickets->new($RT::SystemUser);
+$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC');
+$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0');
+my $tick = $tickets->First();
+ok ($tick->Id, "found ticket ".$tick->Id);
+
+my $cc = $tick->Transactions->First->Attachments->First->GetHeader('RT-Send-Cc');
+ok ($cc =~ /test1/, "Found test 1");
+ok ($cc =~ /test2/, "Found test 2");
+ok ($cc =~ /test3/, "Found test 3");
+ok ($cc =~ /test4/, "Found test 4");
+ok ($cc =~ /test5/, "Found test 5");
+
+# }}}
+
 # Don't taint the environment
 $everyone->PrincipalObj->RevokeRight(Right =>'SuperUser');
 1;


More information about the Rt-commit mailing list