[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