[Rt-devel] Date fields and 'not set' values
Michal Kouril
xmkouril at gmail.com
Sat May 23 14:00:10 EDT 2009
Hi,
First patch is to allow 'Not set' or 'NULL' entry into the date fields.
The second patch is connected with the 'not set' search on date
fields. I tried to setup a query through TicketSQL to compare date
fields against "not set" and it seemed the functionality was not
there. The patch will allow for queries such as Due = 'not set' or
Due != 'not set' to query for "not set" in the date fields.
If there is any other way to do the above please let me know.
Thanks,
Michal
--- rt-3.8.2/lib/RT/Interface/Web.pm 2009-01-06 20:15:34.000000000 -0500
+++ /opt/rt3/lib/RT/Interface/Web.pm 2009-05-23 13:25:33.000000000 -0400
@@ -1414,7 +1414,12 @@
and ( $DateObj->Unix != $Ticket->$obj()->Unix() ) )
{
my $method = "Set$field";
- my ( $code, $msg ) = $Ticket->$method( $DateObj->ISO );
+ if ( $ARGSRef->{ $field . '_Date' } =~ /^NULL$/i ||
+ $ARGSRef->{ $field . '_Date' } =~ /^not set$/i ) {
+ ( $code, $msg ) = $Ticket->$method( '0000-00-00
00:00:00' );
+ } else {
+ ( $code, $msg ) = $Ticket->$method( $DateObj->ISO );
+ }
push @results, "$msg";
}
}
--- rt-3.8.2/lib/RT/Tickets_Overlay.pm 2009-01-06 20:15:33.000000000
-0500
+++ /opt/rt3/lib/RT/Tickets_Overlay.pm 2009-05-23 13:53:19.000000000
-0400
@@ -505,7 +505,7 @@
my ( $sb, $field, $op, $value, @rest ) = @_;
die "Invalid Date Op: $op"
- unless $op =~ /^(=|>|<|>=|<=)$/;
+ unless $op =~ /^(=|>|<|>=|<=|!=)$/;
my $meta = $FIELD_METADATA{$field};
die "Incorrect Meta Data for $field"
@@ -516,33 +516,111 @@
if ( $op eq "=" ) {
- # if we're specifying =, that means we want everything on a
- # particular single day. in the database, we need to check
for >
- # and < the edges of that day.
+ if ( $value =~ /^NULL$/i ||
+ $value =~ /^not set$/i ) {
- $date->SetToMidnight( Timezone => 'server' );
- my $daystart = $date->ISO;
- $date->AddDay;
- my $dayend = $date->ISO;
+ $sb->_OpenParen;
- $sb->_OpenParen;
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => "is",
+ VALUE => "NULL",
+ @rest,
+ );
- $sb->_SQLLimit(
- FIELD => $meta->[1],
- OPERATOR => ">=",
- VALUE => $daystart,
- @rest,
- );
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => "=",
+ VALUE => "0000-00-00 00:00:00",
+ @rest,
+ ENTRYAGGREGATOR => 'OR',
+ );
- $sb->_SQLLimit(
- FIELD => $meta->[1],
- OPERATOR => "<=",
- VALUE => $dayend,
- @rest,
- ENTRYAGGREGATOR => 'AND',
- );
+ $sb->_CloseParen;
+ } else {
- $sb->_CloseParen;
+ # if we're specifying =, that means we want everything on a
+ # particular single day. in the database, we need to
check for >
+ # and < the edges of that day.
+
+ $date->SetToMidnight( Timezone => 'server' );
+ my $daystart = $date->ISO;
+ $date->AddDay;
+ my $dayend = $date->ISO;
+
+ $sb->_OpenParen;
+
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => ">=",
+ VALUE => $daystart,
+ @rest,
+ );
+
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => "<=",
+ VALUE => $dayend,
+ @rest,
+ ENTRYAGGREGATOR => 'AND',
+ );
+
+ $sb->_CloseParen;
+ }
+
+ } elsif ( $op eq "!=" ) {
+
+ if ( $value =~ /^NULL$/i ||
+ $value =~ /^not set$/i ) {
+
+ $sb->_OpenParen;
+
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => "is not",
+ VALUE => "NULL",
+ @rest,
+ );
+
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => "!=",
+ VALUE => "0000-00-00 00:00:00",
+ @rest,
+ ENTRYAGGREGATOR => 'AND',
+ );
+
+ $sb->_CloseParen;
+ } else {
+
+ # if we're specifying =, that means we want everything on a
+ # particular single day. in the database, we need to
check for >
+ # and < the edges of that day.
+
+ $date->SetToMidnight( Timezone => 'server' );
+ my $daystart = $date->ISO;
+ $date->AddDay;
+ my $dayend = $date->ISO;
+
+ $sb->_OpenParen;
+
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => "<",
+ VALUE => $daystart,
+ @rest,
+ );
+
+ $sb->_SQLLimit(
+ FIELD => $meta->[1],
+ OPERATOR => ">",
+ VALUE => $dayend,
+ @rest,
+ ENTRYAGGREGATOR => 'AND',
+ );
+
+ $sb->_CloseParen;
+ }
}
else {
More information about the Rt-devel
mailing list