ParseFilter: with_objects merging bei Klassen mit Filtered Plugin
authorSven Schöling <s.schoeling@linet-services.de>
Mon, 15 Sep 2014 13:18:51 +0000 (15:18 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Mon, 15 Sep 2014 13:18:51 +0000 (15:18 +0200)
ParseFilter kennt 3 Quellen für with_objects Klauseln:

1. explizit übergebene
2. aus dem Filter inferierte
3. aus custom filtern gesetzte

Wenn nun ein Model das Custom Filter Plugin hat, muss bei jedem Filter
getestet werden, ob dieser Filter eigene with_objects setzt oder nicht.
Wenn der Filter aber auf eine normale Spalte zeigt, muss wie ohne Klasse
auch der Standardpfad als Include gesetzt werden. Das war aber nicht der
Fall.

SL/Controller/Helper/ParseFilter.pm
SL/DB/Helper/Filtered.pm
t/controllers/helpers/parse_filter.t

index 308952b..37b0673 100644 (file)
@@ -167,7 +167,7 @@ sub _dispatch_custom_filters {
   my $obj_prefix = join '.', @tokens, '';
 
   if ($manager->can('filter')) {
-    ($key, $value, my $obj) = $manager->filter($last_token, $value, $obj_prefix);
+    ($key, $value, my $obj) = $manager->filter($last_token, $value, $obj_prefix, $obj_path);
     _add_uniq($with_objects, $obj) if $obj;
   } else {
     _add_uniq($with_objects, $obj_path) if $obj_path;
index e95c01f..0b2b473 100644 (file)
@@ -10,11 +10,11 @@ our @EXPORT = qw (filter add_filter_specs);
 my %filter_spec;
 
 sub filter {
-  my ($class, $key, $value, $prefix) = @_;
+  my ($class, $key, $value, $prefix, $path) = @_;
 
   my $filters = _get_filters($class);
 
-  return ($prefix . $key, $value) unless $filters->{$key};
+  return ($prefix . $key, $value, $path) unless $filters->{$key};
 
   return $filters->{$key}->($key, $value, $prefix);
 }
index 0511346..583b26c 100644 (file)
@@ -291,7 +291,8 @@ test {
    'part.partnumber', {
      ilike => '%1%'
    }
- ]
+ ],
+ with_objects => [ 'part' ],
 }, 'Regression check: prefixing of fallback filtering in relation with custom filters', class => 'SL::DB::Manager::OrderItem';
 test {
   'description:substr:multi::ilike' => 'term1 term2',