filters for bre.{create|edit}_date
authorMike Rylander <mrylander@gmail.com>
Fri, 8 Mar 2013 20:13:11 +0000 (15:13 -0500)
committerMike Rylander <mrylander@gmail.com>
Fri, 8 Mar 2013 20:13:11 +0000 (15:13 -0500)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm

index f87260c..2a80d50 100644 (file)
@@ -4,6 +4,7 @@ use warnings;
 package OpenILS::Application::Storage::Driver::Pg::QueryParser;
 use OpenILS::Application::Storage::QueryParser;
 use base 'QueryParser';
+use OpenSRF::Utils qw/:datetime/;
 use OpenSRF::Utils::JSON;
 use OpenILS::Application::AppUtils;
 use OpenILS::Utils::CStoreEditor;
@@ -638,6 +639,8 @@ __PACKAGE__->add_search_filter( 'between' );
 __PACKAGE__->add_search_filter( 'during' );
 
 # various filters for limiting in various ways
+__PACKAGE__->add_search_filter( 'edit_date' );
+__PACKAGE__->add_search_filter( 'create_date' );
 __PACKAGE__->add_search_filter( 'statuses' );
 __PACKAGE__->add_search_filter( 'locations' );
 __PACKAGE__->add_search_filter( 'location_groups', sub { return __PACKAGE__->location_groups_callback(@_) } );
@@ -961,6 +964,53 @@ sub toSQL {
         $agg_record = 'CASE WHEN COUNT(DISTINCT m.source) = 1 THEN FIRST(m.source) ELSE NULL END AS record';
     }
 
+    # bre.create_date and bre.edit_date filtering
+    for my $datefilter ( qw/create_date edit_date/ ) {
+        my $cdate = $self->find_filter($datefilter);
+        if ($cdate && $cdate->args && scalar(@{$cdate->args}) > 0 && scalar(@{$cdate->args}) < 3) {
+            my ($cstart, $cend) = @{$cdate->args};
+            my $restarted = 0;
+
+            RESTART:
+
+            if (!$cstart and !$cend) {
+                # useless use of filter
+            } elsif (!$cstart or $cstart eq '-infinity') { # no start supplied
+                if ($cend eq 'infinity') {
+                    # useless use of filter
+                } else {
+                    # "before $cend"
+                    $cend = cleanse_ISO8601($cend);
+                    $limit_where .= <<"                    SQL";
+            AND bre.$datefilter <= \$_$$\$$cend\$_$$\$
+                    SQL
+                }
+    
+            } elsif (!$cend or $cend eq 'infinity') { # no end supplied
+                if ($cstart eq '-infinity') {
+                    # useless use of filter
+                } else { # "after $cstart"
+                    $cstart = cleanse_ISO8601($cstart);
+                    $limit_where .= <<"                    SQL";
+            AND bre.$datefilter >= \$_$$\$$cstart\$_$$\$
+                    SQL
+                }
+            } elsif (!$cend or $cend eq 'infinity') { # both supplied
+                if (!$restarted) {
+                    $cstart = cleanse_ISO8601($cstart);
+                    $cend = cleanse_ISO8601($cend);
+                    $restarted = 1;
+                    goto RESTART;
+                }
+                
+                # "between $cstart and $cend"
+                $limit_where .= <<"                SQL";
+            AND bre.$datefilter BETWEEN \$_$$\$$cstart\$_$$\$ AND \$_$$\$$cend\$_$$\$
+                SQL
+            }
+        }
+    }
+
     my $sql = <<SQL;
 WITH
 $with