From: Arthur Axel "fREW" Schmidt Date: Fri, 7 May 2010 02:27:18 +0000 (+0000) Subject: no filter and inflate column X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c227b29575255c89a20ebd528dd2be0229c5f2da;p=dbsrgits%2FDBIx-Class-Historic.git no filter and inflate column --- diff --git a/lib/DBIx/Class/FilterColumn.pm b/lib/DBIx/Class/FilterColumn.pm index 9bea8a3..a6bda53 100644 --- a/lib/DBIx/Class/FilterColumn.pm +++ b/lib/DBIx/Class/FilterColumn.pm @@ -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); } diff --git a/lib/DBIx/Class/InflateColumn.pm b/lib/DBIx/Class/InflateColumn.pm index 5d9c19d..292cabe 100644 --- a/lib/DBIx/Class/InflateColumn.pm +++ b/lib/DBIx/Class/InflateColumn.pm @@ -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") diff --git a/t/row/filter_column.t b/t/row/filter_column.t index a844962..ef2b880 100644 --- a/t/row/filter_column.t +++ b/t/row/filter_column.t @@ -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;