From 140a7c83cde5952fac56e5e7d794f691dcff175e Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 6 Jan 2014 14:07:59 +0100 Subject: [PATCH] =?utf8?q?Filtered-Helfer:=20bei=20Typ=20'date'=20und=20Op?= =?utf8?q?erator=20'le'=20Wert=20auf=20n=C3=A4chsten=20Tag=20=C3=A4ndern?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Ist die Datenbankspalte vom Typ 'timestamp', so sind die Timestamps am gleichen Tag wie das zu vergleichende Argument allesamt größer als das vergleichende Argument. Der Benutzer erwartet aufgrund von <= aber, dass die alle mit einbezogen werden. Workaround: für Vergleichsoperation <= bei Feldtyp 'date' einfach das Datum auf 'Anfang des nächsten Tages' erhöhen und den Vergleich auf < ändern. Das funktioniert sowohl bei Datenbankspalten mit Typ 'date' als auch bei denjenigen mit Typ 'timestamp'. Behebt #2404. --- SL/Controller/Helper/ParseFilter.pm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/SL/Controller/Helper/ParseFilter.pm b/SL/Controller/Helper/ParseFilter.pm index afe9b7b51..9b5eb516e 100644 --- a/SL/Controller/Helper/ParseFilter.pm +++ b/SL/Controller/Helper/ParseFilter.pm @@ -101,16 +101,31 @@ sub _parse_filter { my @result; for (my $i = 0; $i < scalar @$flattened; $i += 2) { my ($key, $value) = ($flattened->[$i], $flattened->[$i+1]); + my ($type, $op) = $key =~ m{:(.+)::(.+)}; ($key, $value) = _apply_all($key, $value, qr/\b:(\w+)/, { %filters, %{ $params{filters} || {} } }); ($key, $value) = _apply_all($key, $value, qr/\b::(\w+)/, { %methods, %{ $params{methods} || {} } }); ($key, $value) = _dispatch_custom_filters($params{class}, $with_objects, $key, $value) if $params{class}; + ($key, $value) = _apply_value_filters($key, $value, $type, $op); push @result, $key, $value if defined $key; } return \@result; } +sub _apply_value_filters { + my ($key, $value, $type, $op) = @_; + + return ($key, $value) unless $key && $value && $type && $op && (ref($value) eq 'HASH'); + + if (($type eq 'date') && ($op eq 'le')) { + my $date = delete $value->{le}; + $value->{lt} = $date->add(days => 1); + } + + return ($key, $value); +} + sub _dispatch_custom_filters { my ($class, $with_objects, $key, $value) = @_; -- 2.20.1