no filter and inflate column
Arthur Axel "fREW" Schmidt [Fri, 7 May 2010 02:27:18 +0000 (02:27 +0000)]
lib/DBIx/Class/FilterColumn.pm
lib/DBIx/Class/InflateColumn.pm
t/row/filter_column.t

index 9bea8a3..a6bda53 100644 (file)
@@ -7,6 +7,10 @@ use base qw/DBIx::Class::Row/;
 sub filter_column {
   my ($self, $col, $attrs) = @_;
 
+  $self->throw_exception("FilterColumn does not work with InflateColumn")
+    if $self->isa('DBIx::Class::InflateColumn') &&
+      defined $self->column_info($col)->{_inflate_info};
+
   $self->throw_exception("No such column $col to filter")
     unless $self->has_column($col);
 
@@ -30,7 +34,7 @@ sub _column_from_storage {
   return $value unless exists $info->{_filter_info};
 
   my $filter = $info->{_filter_info}{filter_from_storage};
-  $self->throw_exception("No inflator for $col") unless defined $filter;
+  $self->throw_exception("No filter for $col") unless defined $filter;
 
   return $self->$filter($value);
 }
index 5d9c19d..292cabe 100644 (file)
@@ -74,6 +74,11 @@ used in the database layer.
 
 sub inflate_column {
   my ($self, $col, $attrs) = @_;
+
+  $self->throw_exception("InflateColumn does not work with FilterColumn")
+    if $self->isa('DBIx::Class::FilterColumn') &&
+      defined $self->column_info($col)->{_filter_info};
+
   $self->throw_exception("No such column $col to inflate")
     unless $self->has_column($col);
   $self->throw_exception("inflate_column needs attr hashref")
index a844962..ef2b880 100644 (file)
@@ -2,13 +2,14 @@ use strict;
 use warnings;
 
 use Test::More;
+use Test::Exception;
 use lib qw(t/lib);
 use DBICTest;
 
 my $from_storage_ran = 0;
 my $to_storage_ran = 0;
 my $schema = DBICTest->init_schema();
-DBICTest::Schema::Artist->load_components('FilterColumn');
+DBICTest::Schema::Artist->load_components(qw(FilterColumn InflateColumn));
 DBICTest::Schema::Artist->filter_column(rank => {
   filter_from_storage => sub { $from_storage_ran++; $_[1] * 2 },
   filter_to_storage   => sub { $to_storage_ran++; $_[1] / 2 },
@@ -68,66 +69,87 @@ MC: {
    is $cd->artist->rank, 20, 'artist rank gets correctly filtered w/ MC';
 }
 
-my $expected_from = $from_storage_ran;
-my $expected_to   = $to_storage_ran;
-
-# ensure we are creating a fresh obj
-$artist = $schema->resultset('Artist')->single($artist->ident_condition);
-
-is $from_storage_ran, $expected_from, 'from has not run yet';
-is $to_storage_ran, $expected_to, 'to has not run yet';
-
-$artist->rank;
-cmp_ok (
-  $artist->get_filtered_column('rank'),
-    '!=',
-  $artist->get_column('rank'),
-  'filter/unfilter differ'
-);
-is $from_storage_ran, ++$expected_from, 'from ran once, therefor caches';
-is $to_storage_ran, $expected_to,  'to did not run';
-
-$artist->rank(6);
-is $from_storage_ran, $expected_from, 'from did not run';
-is $to_storage_ran, ++$expected_to,  'to ran once';
-
-ok ($artist->is_column_changed ('rank'), 'Column marked as dirty');
-
-$artist->rank;
-is $from_storage_ran, ++$expected_from, 'from ran once';
-is $to_storage_ran, $expected_to,  'to did not run';
-
-$artist->rank;
-is $from_storage_ran, $expected_from, 'from did not run';
-is $to_storage_ran, $expected_to,  'to did not run';
-
-$artist->update;
+CACHE_TEST: {
+  my $expected_from = $from_storage_ran;
+  my $expected_to   = $to_storage_ran;
+
+  # ensure we are creating a fresh obj
+  $artist = $schema->resultset('Artist')->single($artist->ident_condition);
+
+  is $from_storage_ran, $expected_from, 'from has not run yet';
+  is $to_storage_ran, $expected_to, 'to has not run yet';
+
+  $artist->rank;
+  cmp_ok (
+    $artist->get_filtered_column('rank'),
+      '!=',
+    $artist->get_column('rank'),
+    'filter/unfilter differ'
+  );
+  is $from_storage_ran, ++$expected_from, 'from ran once, therefor caches';
+  is $to_storage_ran, $expected_to,  'to did not run';
+
+  $artist->rank(6);
+  is $from_storage_ran, $expected_from, 'from did not run';
+  is $to_storage_ran, ++$expected_to,  'to ran once';
+
+  ok ($artist->is_column_changed ('rank'), 'Column marked as dirty');
+
+  $artist->rank;
+  is $from_storage_ran, ++$expected_from, 'from ran once';
+  is $to_storage_ran, $expected_to,  'to did not run';
+
+  $artist->rank;
+  is $from_storage_ran, $expected_from, 'from did not run';
+  is $to_storage_ran, $expected_to,  'to did not run';
+
+  $artist->update;
+
+  $artist->set_column(rank => 3);
+  ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on same set_column value');
+  is ($artist->rank, '6', 'Column set properly (cache blown)');
+  is $from_storage_ran, ++$expected_from, 'from ran once (set_column blew cache)';
+  is $to_storage_ran, $expected_to,  'to did not run';
+
+  $artist->rank(6);
+  ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on same accessor-set value');
+  is ($artist->rank, '6', 'Column set properly');
+  is $from_storage_ran, $expected_from, 'from did not run';
+  is $to_storage_ran, $expected_to,  'to did not run';
+
+  $artist->store_column(rank => 4);
+  ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on differing store_column value');
+  is ($artist->rank, '6', 'Filtered column still contains old value (cache not blown)');
+  is $from_storage_ran, $expected_from, 'from did not run';
+  is $to_storage_ran, $expected_to,  'to did not run';
+
+  $artist->set_column(rank => 4);
+  TODO: {
+    local $TODO = 'There seems to be no way around that much wizardry... which is ok';
+    ok ($artist->is_column_changed ('rank'), 'Column marked as dirty on out-of-sync set_column value');
+  }
+  is ($artist->rank, '8', 'Column set properly (cache blown)');
+  is $from_storage_ran, ++$expected_from, 'from ran once (set_column blew cache)';
+  is $to_storage_ran, $expected_to,  'to did not run';
+}
 
-$artist->set_column(rank => 3);
-ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on same set_column value');
-is ($artist->rank, '6', 'Column set properly (cache blown)');
-is $from_storage_ran, ++$expected_from, 'from ran once (set_column blew cache)';
-is $to_storage_ran, $expected_to,  'to did not run';
-
-$artist->rank(6);
-ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on same accessor-set value');
-is ($artist->rank, '6', 'Column set properly');
-is $from_storage_ran, $expected_from, 'from did not run';
-is $to_storage_ran, $expected_to,  'to did not run';
-
-$artist->store_column(rank => 4);
-ok (! $artist->is_column_changed ('rank'), 'Column not marked as dirty on differing store_column value');
-is ($artist->rank, '6', 'Filtered column still contains old value (cache not blown)');
-is $from_storage_ran, $expected_from, 'from did not run';
-is $to_storage_ran, $expected_to,  'to did not run';
-
-$artist->set_column(rank => 4);
-TODO: {
-  local $TODO = 'There seems to be no way around that much wizardry... which is ok';
-  ok ($artist->is_column_changed ('rank'), 'Column marked as dirty on out-of-sync set_column value');
+IC_DIE: {
+  dies_ok {
+     DBICTest::Schema::Artist->inflate_column(rank =>
+        { inflate => sub {}, deflate => sub {} }
+     );
+  } q(Can't inflate column after filter column);
+
+  DBICTest::Schema::Artist->inflate_column(name =>
+     { inflate => sub {}, deflate => sub {} }
+  );
+
+  dies_ok {
+     DBICTest::Schema::Artist->filter_column(name => {
+        filter_to_storage => sub {},
+        filter_from_storage => sub {}
+     });
+  } q(Can't filter column after inflate column);
 }
-is ($artist->rank, '8', 'Column set properly (cache blown)');
-is $from_storage_ran, ++$expected_from, 'from ran once (set_column blew cache)';
-is $to_storage_ran, $expected_to,  'to did not run';
 
 done_testing;