[Rt-commit] rt branch, googleish-refactor, updated. rt-3.8.5-211-gae8837c

Kevin Falcone falcone at bestpractical.com
Sun Oct 25 14:12:23 EDT 2009


The branch, googleish-refactor has been updated
       via  ae8837c21cb0b14df6b2c788256cabef5c9a8d85 (commit)
       via  aa892ca4e0003a6405137e4e7961550d3d1273ec (commit)
      from  381bfc0811d942f6cc1a49dca8d2134d13d86a30 (commit)

Summary of changes:
 lib/RT/Search/Googleish.pm |  166 ++++++++++++++++----------------------------
 1 files changed, 59 insertions(+), 107 deletions(-)

- Log -----------------------------------------------------------------
commit aa892ca4e0003a6405137e4e7961550d3d1273ec
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Sat Oct 24 21:31:25 2009 -0400

    Don't call this twice

diff --git a/lib/RT/Search/Googleish.pm b/lib/RT/Search/Googleish.pm
index 186a0e5..467a4c2 100644
--- a/lib/RT/Search/Googleish.pm
+++ b/lib/RT/Search/Googleish.pm
@@ -138,17 +138,6 @@ sub QueryToSQL {
         final     => \@tql_clauses,
     );
 
-    $self->ProcessAfterTranslate(
-        key_value => \@keyvalue_clauses,
-        number    => \@number_clauses,
-        user      => \@user_clauses,
-        status    => \@status_clauses,
-        queue     => \@queue_clauses,
-        owner     => \@owner_clauses,
-        other     => \@others_clauses,
-        final     => \@tql_clauses,
-    );
-
     $self->CallbackAfterProcess(
         key_value => \@keyvalue_clauses,
         number    => \@number_clauses,

commit ae8837c21cb0b14df6b2c788256cabef5c9a8d85
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Sat Oct 24 23:09:46 2009 -0400

    Refactor so we return matched clauses rather than passing arrayrefs
    
    Also break out the status clause handling and internal queue handling
    into more than one function.
    
    Make the custom translator run first so if you want to parse a keyword
    you get to it before anyone else.

diff --git a/lib/RT/Search/Googleish.pm b/lib/RT/Search/Googleish.pm
index 467a4c2..00fb57c 100644
--- a/lib/RT/Search/Googleish.pm
+++ b/lib/RT/Search/Googleish.pm
@@ -98,65 +98,36 @@ sub QueryToSQL {
     my @keywords = grep length, map { s/^\s+//; s/\s+$//; $_ }
       split /((?:fulltext:)?$re_delim|\s+)/o, $query;
 
-    my (
-        @keyvalue_clauses, @number_clauses, @status_clauses,
-        @queue_clauses,    @user_clauses,   @owner_clauses,
-        @others_clauses,   @tql_clauses
-    );
-
-    my %map = (
-        KeyValue => \@keyvalue_clauses,
-        Number   => \@number_clauses,
-        Status   => \@status_clauses,
-        Queue    => \@queue_clauses,
-        User     => \@user_clauses,
-        Owner    => \@owner_clauses,
-        Others   => \@others_clauses
-    );
-
-  KEYWORD:
+    my (@keyvalue_clauses, @status_clauses, @other_clauses);
+
     for my $keyword (@keywords) {
-        for my $action (qw/KeyValue Number User Status Queue Owner Others/) {
+        my @clauses;
+        if ( ( @clauses = $self->TranslateCustom($keyword) ) ||
+             ( @clauses = $self->TranslateKeyValue($keyword) ) ) {
+            push @keyvalue_clauses, @clauses;
+            next;
+        } elsif ( @clauses = $self->TranslateStatus($keyword) ) {
+            push @status_clauses, @clauses;
+            next;
+        }
+
+        for my $action (qw/Number User Queue Owner Others/) {
             my $translate = 'Translate' . $action;
-            my $clause    = $map{$action};
-            my @clauses   = $self->$translate($keyword);
-            if (@clauses) {
-                push @{$clause}, @clauses;
-                next KEYWORD;
+            if ( my @clauses = $self->$translate($keyword) ) {
+                push @other_clauses, @clauses;
+                next;
             }
         }
     }
 
-    $self->ProcessAfterTranslate(
-        key_value => \@keyvalue_clauses,
-        number    => \@number_clauses,
-        user      => \@user_clauses,
-        status    => \@status_clauses,
-        queue     => \@queue_clauses,
-        owner     => \@owner_clauses,
-        other     => \@others_clauses,
-        final     => \@tql_clauses,
-    );
-
-    $self->CallbackAfterProcess(
-        key_value => \@keyvalue_clauses,
-        number    => \@number_clauses,
-        user      => \@user_clauses,
-        status    => \@status_clauses,
-        queue     => \@queue_clauses,
-        owner     => \@owner_clauses,
-        other     => \@others_clauses,
-        final     => \@tql_clauses,
-    );
-
-    push @tql_clauses, join( " AND ", sort @keyvalue_clauses );    # Yes, AND!
-
-    push @tql_clauses, join( " OR ", sort @number_clauses );
-    push @tql_clauses, join( " OR ", sort @owner_clauses );
-    push @tql_clauses, join( " OR ", sort @user_clauses );
-    push @tql_clauses, join( " OR ", sort @queue_clauses );
+    push @other_clauses, $self->ProcessExtraQueues;
+    unless (@status_clauses) {
+        push @status_clauses, $self->ProcessExtraStatus;
+    }
+
+    my @tql_clauses = join( " AND ", sort @keyvalue_clauses );    # Yes, AND!
     push @tql_clauses, join( " OR ", sort @status_clauses );
-    push @tql_clauses, join( " OR ", sort @others_clauses );
+    push @tql_clauses, join( " OR ", sort @other_clauses );
     @tql_clauses = grep { $_ ? $_ = "( $_ )" : undef } @tql_clauses;
     return join " AND ", sort @tql_clauses;
 }
@@ -179,131 +150,123 @@ sub Prepare {
 sub TranslateKeyValue {
     my $self = shift;
     my $key  = shift;
-    my @clauses;
-    if ( $key =~
-/(subject|cf\.(?:[^:]*?)|content|requestor|id|status|owner|queue|fulltext):(['"]?)(.+)\2/i
-      )
+
+    if ( $key =~ /(subject|cf\.(?:[^:]*?)|content|requestor|id|status|owner|queue|fulltext):(['"]?)(.+)\2/i )
     {
         my $field = $1;
         my $value = $3;
         $value =~ s/(['"])/\\$1/g;
 
         if ( $field =~ /id|status|owner|queue/i ) {
-            push @clauses, "$field = '$value'";
+            return "$field = '$value'";
         }
         elsif ( $field =~ /fulltext/i ) {
-            push @clauses, "Content LIKE '$value'";
+            return "Content LIKE '$value'";
         }
         else {
-            push @clauses, "$field LIKE '$value'";
+            return "$field LIKE '$value'";
         }
     }
-    return @clauses;
+    return;
 }
 
 sub TranslateNumber {
     my $self = shift;
     my $key  = shift;
-    my @clauses;
+
     if ( $key =~ /^\d+$/ ) {
-        push @clauses, "id = '$key'", "Subject LIKE '$key'";
+        return ("id = '$key'", "Subject LIKE '$key'");
     }
-    return @clauses;
+    return;
 }
 
 sub TranslateStatus {
     my $self = shift;
     my $key  = shift;
-    my @clauses;
+
     my $Queue = RT::Queue->new( $self->TicketsObj->CurrentUser );
     if ( $Queue->IsValidStatus($key) ) {
-        push @clauses, "Status = '$key'";
+        return "Status = '$key'";
     }
-    return @clauses;
+    return;
 }
 
 sub TranslateQueue {
     my $self = shift;
     my $key  = shift;
-    my @clauses;
+
     my $Queue = RT::Queue->new( $self->TicketsObj->CurrentUser );
     my ( $ret ) = $Queue->Load($key);
     if ( $ret && $Queue->Id ) {
         my $quoted_queue = $Queue->Name;
         $quoted_queue =~ s/'/\\'/g;
-        push @clauses, "Queue = '$quoted_queue'";
+        return "Queue = '$quoted_queue'";
     }
-    return @clauses;
+    return;
 }
 
 sub TranslateUser {
     my $self = shift;
     my $key  = shift;
-    my @clauses;
+
     if ( $key =~ /\w+\@\w+/ ) {
         $key =~ s/(['"])/\\$1/g;
-        push @clauses, "Requestor LIKE '$key'";
+        return "Requestor LIKE '$key'";
     }
-    return @clauses;
+    return;
 }
 
 sub TranslateOwner {
     my $self = shift;
     my $key  = shift;
-    my @clauses;
+
     my $User = RT::User->new( $self->TicketsObj->CurrentUser );
     my ( $ret ) = $User->Load($key);
     if ( $ret && $User->Privileged ) {
         my $name = $User->Name;
         $name =~ s/(['"])/\\$1/g;
-        push @clauses, "Owner = '" . $name . "'";
+        return "Owner = '" . $name . "'";
     }
-    return @clauses;
+    return;
 }
 
 sub TranslateOthers {
     my $self = shift;
     my $key  = shift;
-    my @clauses;
+
     $key =~ s{^(['"])(.*)\1$}{$2};    # 'foo' => foo
     $key =~ s/(['"])/\\$1/g;          # foo'bar => foo\'bar
 
-    push @clauses, "Subject LIKE '$key'";
-    return @clauses;
+    return "Subject LIKE '$key'";
 }
 
-sub ProcessAfterTranslate {
+sub ProcessExtraQueues {
     my $self           = shift;
     my %args           = @_;
-    my $queue_clauses  = $args{queue};
-    my $status_clauses = $args{status};
 
     # restrict to any queues requested by the caller
+    my @clauses;
     for my $queue ( @{ $self->{'Queues'} } ) {
         my $QueueObj = RT::Queue->new( $self->TicketsObj->CurrentUser );
-        my ( $ret ) = $QueueObj->Load($queue);
-        next unless $ret;
+        next unless $QueueObj->Load($queue);
         my $quoted_queue = $QueueObj->Name;
         $quoted_queue =~ s/'/\\'/g;
-        push @$queue_clauses, "Queue = '$quoted_queue'";
+        push @clauses, "Queue = '$quoted_queue'";
     }
+    return @clauses;
+}
 
-    if (
-        !@$status_clauses
-        && RT::Config->Get(
-            'OnlySearchActiveTicketsInSimpleSearch',
-            $self->TicketsObj->CurrentUser
-        )
-      )
-    {
-        push @$status_clauses,
-          join( " OR ", map "Status = '$_'", RT::Queue->ActiveStatusArray() );
+sub ProcessExtraStatus {
+    my $self = shift;
+
+    if ( RT::Config->Get('OnlySearchActiveTicketsInSimpleSearch',$self->TicketsObj->CurrentUser) ) {
+          return join( " OR ", map "Status = '$_'", RT::Queue->ActiveStatusArray() );
     }
 }
 
-sub CallbackAfterProcess {
+sub TranslateCustom {
     my $self = shift;
-
+    return;
 }
 
 eval "require RT::Search::Googleish_Vendor";

-----------------------------------------------------------------------


More information about the Rt-commit mailing list