diff options
author | ivan <ivan> | 2005-10-15 09:11:20 +0000 |
---|---|---|
committer | ivan <ivan> | 2005-10-15 09:11:20 +0000 |
commit | d4d0590bef31071e8809ec046717444b95b3f30a (patch) | |
tree | ee1236da50578390d2642114f28eaed99a5efb18 /rt/lib/RT/SearchBuilder.pm | |
parent | d39d52aac8f38ea9115628039f0df5aa3ac826de (diff) |
import rt 3.4.4
Diffstat (limited to 'rt/lib/RT/SearchBuilder.pm')
-rw-r--r-- | rt/lib/RT/SearchBuilder.pm | 136 |
1 files changed, 114 insertions, 22 deletions
diff --git a/rt/lib/RT/SearchBuilder.pm b/rt/lib/RT/SearchBuilder.pm index 615f19726..3de9fc265 100644 --- a/rt/lib/RT/SearchBuilder.pm +++ b/rt/lib/RT/SearchBuilder.pm @@ -1,8 +1,8 @@ -# {{{ BEGIN BPS TAGGED BLOCK +# BEGIN BPS TAGGED BLOCK {{{ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -42,7 +42,8 @@ # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. # -# }}} END BPS TAGGED BLOCK +# END BPS TAGGED BLOCK }}} + =head1 NAME RT::SearchBuilder - a baseclass for RT collection objects @@ -131,14 +132,42 @@ sub LimitToDeleted { Takes NAME, OPERATOR and VALUE to find records that has the matching Attribute. +If EMPTY is set, also select rows with an empty string as +Attribute's Content. + +If NULL is set, also select rows without the named Attribute. + =cut +my %Negate = qw( + = != + != = + > <= + < >= + >= < + <= > + LIKE NOT LIKE + NOT LIKE LIKE + IS IS NOT + IS NOT IS +); + sub LimitAttribute { my ($self, %args) = @_; + my $clause = 'ALIAS'; + my $operator = ($args{OPERATOR} || '='); + + if ($args{NULL} and exists $args{VALUE}) { + $clause = 'LEFTJOIN'; + $operator = $Negate{$operator}; + } + elsif ($args{NEGATE}) { + $operator = $Negate{$operator}; + } my $alias = $self->Join( TYPE => 'left', - ALIAS1 => 'main', + ALIAS1 => $args{ALIAS} || 'main', FIELD1 => 'id', TABLE2 => 'Attributes', FIELD2 => 'ObjectId' @@ -148,13 +177,13 @@ sub LimitAttribute { $type =~ s/(?:s|Collection)$//; # XXX - Hack! $self->Limit( - ALIAS => $alias, + $clause => $alias, FIELD => 'ObjectType', OPERATOR => '=', VALUE => $type, ); $self->Limit( - ALIAS => $alias, + $clause => $alias, FIELD => 'Name', OPERATOR => '=', VALUE => $args{NAME}, @@ -163,27 +192,90 @@ sub LimitAttribute { return unless exists $args{VALUE}; $self->Limit( - ALIAS => $alias, + $clause => $alias, FIELD => 'Content', - OPERATOR => ($args{OPERATOR} || '='), + OPERATOR => $operator, VALUE => $args{VALUE}, - ENTRYAGGREGATOR => 'OR', ); - if ($args{EMPTY}) { - # Capture rows without the attribute defined by testing IS NULL. - $self->Limit( - ALIAS => $alias, - FIELD => $_, - OPERATOR => 'IS', - VALUE => 'NULL', - ENTRYAGGREGATOR => 'OR', - ) for qw( ObjectType Name Content ); - } + # Capture rows with the attribute defined as an empty string. + $self->Limit( + $clause => $alias, + FIELD => 'Content', + OPERATOR => '=', + VALUE => '', + ENTRYAGGREGATOR => $args{NULL} ? 'AND' : 'OR', + ) if $args{EMPTY}; + + # Capture rows without the attribute defined + $self->Limit( + %args, + ALIAS => $alias, + FIELD => 'id', + OPERATOR => ($args{NEGATE} ? 'IS NOT' : 'IS'), + VALUE => 'NULL', + ) if $args{NULL}; } # }}} -1; +# {{{ sub LimitCustomField + +=head2 LimitCustomField + +Takes a paramhash of key/value pairs with the following keys: + +=over 4 + +=item CUSTOMFIELD - CustomField id. Optional + +=item OPERATOR - The usual Limit operators + +=item VALUE - The value to compare against + +=back + +=cut + +sub _SingularClass { + my $self = shift; + my $class = ref($self); + $class =~ s/s$// or die "Cannot deduce SingularClass for $class"; + return $class; +} + +sub LimitCustomField { + my $self = shift; + my %args = ( VALUE => undef, + CUSTOMFIELD => undef, + OPERATOR => '=', + @_ ); + + my $alias = $self->Join( + TYPE => 'left', + ALIAS1 => 'main', + FIELD1 => 'id', + TABLE2 => 'ObjectCustomFieldValues', + FIELD2 => 'ObjectId' + ); + $self->Limit( + ALIAS => $alias, + FIELD => 'CustomField', + OPERATOR => '=', + VALUE => $args{'CUSTOMFIELD'}, + ) if ($args{'CUSTOMFIELD'}); + $self->Limit( + ALIAS => $alias, + FIELD => 'ObjectType', + OPERATOR => '=', + VALUE => $self->_SingularClass, + ); + $self->Limit( + ALIAS => $alias, + FIELD => 'Content', + OPERATOR => $args{'OPERATOR'}, + VALUE => $args{'VALUE'}, + ); +} # {{{ sub FindAllRows @@ -219,7 +311,7 @@ sub Limit { # {{{ sub ItemsOrderBy -=item ItemsOrderBy +=head2 ItemsOrderBy If it has a SortOrder attribute, sort the array by SortOrder. Otherwise, if it has a "Name" attribute, sort alphabetically by Name @@ -246,7 +338,7 @@ sub ItemsOrderBy { # {{{ sub ItemsArrayRef -=item ItemsArrayRef +=head2 ItemsArrayRef Return this object's ItemsArray, in the order that ItemsOrderBy sorts it. |