import of rt 3.0.4
[freeside.git] / rt / docs / design_docs / cf_search
1 find all tickets where:
2
3
4         CF Foo 
5                 Has values (talk or read) AND
6                 Has values (bar and baz) AND 
7                 doesn't have values (bing or bong) 
8
9
10 LimitCustomFieldValues {
11         my %args = ( CustomField => undef, 
12                      ClauseId => 'CustomFields',
13                      OPERATOR => undef,
14                      ENTRYAGGREGATOR => undef,
15                      VALUES => undef,
16                      @_) ;
17
18         unless ( $self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField'} ) {
19         $self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField'} = $self->NewAlias('CustomFields');
20         $self->Join(TABLE1 =>$self->{'TicketAliases'}{$args{'ClauseId'}}{'CustomField' },  
21                     FIELD1 => 'QueueId',
22                     TABLE2 => 'main', FIELD2 => 'QueueId');
23
24         if ($args{'OPERATOR'} =~ /!=|IS/i) {
25         }
26         else {
27         }
28
29 }
30         # {{{ if it's a keyword
31         elsif ( $TYPES{ $restriction->{'FIELD'} } eq 'CUSTOMFIELD' ) {
32
33             my $null_columns_ok;
34             my $TicketCFs = $self->Join( TYPE   => 'left',
35                                                 ALIAS1 => 'main',
36                                                 FIELD1 => 'id',
37                                                 TABLE2 => 'TicketCustomFieldValues',
38                                                 FIELD2 => 'Ticket' );
39
40             foreach my $value ( @{ $restriction->{'VALUES'} } ) {
41                 $self->SUPER::Limit( ALIAS      => $TicketCFs,
42                                      FIELD      => 'Content',
43                                      OPERATOR   => $restriction->{'OPERATOR'},
44                                      VALUE      => $value,
45                                      QUOTEVALUE => $restriction->{'QUOTEVALUE'},
46                                      ENTRYAGGREGATOR => 'AND', );
47             }
48             if (    ( $restriction->{'OPERATOR'} =~ /^IS$/i ) or ( $restriction->{'OPERATOR'} eq '!=' ) ) {
49                 $null_columns_ok = 1;
50             }
51
52             #If we're trying to find tickets where the keyword isn't somethng, also check ones where it _IS_ null
53             if ( $restriction->{'OPERATOR'} eq '!=' ) {
54                 $self->SUPER::Limit( ALIAS           => $TicketCFs,
55                                      FIELD           => 'Content',
56                                      OPERATOR        => 'IS',
57                                      VALUE           => 'NULL',
58                                      QUOTEVALUE      => 0,
59                                      ENTRYAGGREGATOR => 'OR', );
60             }
61
62             $self->SUPER::Limit( LEFTJOIN => $TicketCFs,
63                                  FIELD    => 'CustomField',
64                                  VALUE    => $restriction->{'CUSTOMFIELD'},
65                                  ENTRYAGGREGATOR => 'OR' );
66
67         }
68
69         # }}}
70
71     }
72