From 51f251a618fc2cb35a8203d2b87de1e8958ff287 Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Fri, 8 Mar 2013 15:13:11 -0500 Subject: [PATCH] Two new QP filters: create_date and edit_date These filter on the fields of the same name in biblio.record_entry. e.g. create_date(,2013-02-01) => records created before 2013-02-01 create_date(2013-02-01) => records created since 2013-02-01 create_date(2013-02-01,2013-02-28) => records created in Feb 2013 create_date(yesterday) => records since created yesterday [LFW] Reviewed and added a single missing 'use' line; rewrote commit message; release note. Signed-off-by: Mike Rylander Signed-off-by: Lebbeous Fogle-Weekley Signed-off-by: Mike Rylander --- .../Storage/Driver/Pg/QueryParser.pm | 43 +++++++++++++++++++ .../search-record-date-filters.txt | 11 +++++ 2 files changed, 54 insertions(+) create mode 100644 docs/RELEASE_NOTES_NEXT/search-record-date-filters.txt 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 57558e5750..9d713e60a1 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(@_) } ); @@ -687,6 +690,7 @@ __PACKAGE__->add_search_modifier( 'metabib' ); package OpenILS::Application::Storage::Driver::Pg::QueryParser::query_plan; use base 'QueryParser::query_plan'; use OpenSRF::Utils::Logger qw($logger); +use OpenSRF::Utils qw/:datetime/; use Data::Dumper; use OpenILS::Application::AppUtils; use OpenILS::Utils::CStoreEditor; @@ -954,6 +958,45 @@ 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}; + + 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 + } + } else { # both supplied + # "between $cstart and $cend" + $cstart = cleanse_ISO8601($cstart); + $cend = cleanse_ISO8601($cend); + $limit_where .= <<" SQL"; + AND bre.$datefilter BETWEEN \$_$$\$$cstart\$_$$\$ AND \$_$$\$$cend\$_$$\$ + SQL + } + } + } + my $sql = < records created before 2013-02-01 + * create_date(2013-02-01) => records created since 2013-02-01 + * create_date(2013-02-01,2013-02-28) => records created in Feb 2013 + * create_date(yesterday) => records since created yesterday + -- 2.43.2