Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Request Tracker: Devel

Date fields and 'not set' values

 

 

Request Tracker devel RSS feed   Index | Next | Previous | View Threaded


xmkouril at gmail

May 23, 2009, 11:00 AM

Post #1 of 2 (396 views)
Permalink
Date fields and 'not set' values

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 {

_______________________________________________
List info: http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel


jesse at bestpractical

May 26, 2009, 6:10 AM

Post #2 of 2 (353 views)
Permalink
Re: Date fields and 'not set' values [In reply to]

I've bounced this into a ticket for review (probably by ruslan)


On Sat, May 23, 2009 at 02:00:10PM -0400, Michal Kouril wrote:
> 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 {
>
> _______________________________________________
> List info: http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel
>

--
_______________________________________________
List info: http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel

Request Tracker devel RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact lists@gossamer-threads.com
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.