From e70718140b9a747e487db90edebec217eb1ccde5 Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Fri, 8 Mar 2013 15:13:11 -0500 Subject: [PATCH] filters for bre.{create|edit}_date Signed-off-by: Mike Rylander --- .../Application/Storage/Driver/Pg/QueryParser.pm | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm index f87260c4a7..2a80d50ed1 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm @@ -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 = <