X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Frun%2F23cache.tl;h=4be8fbd81e69276f800acbd3a76ab5fe46c355b4;hb=40db5831746a112e15dec9a3dbabac60e59b76b0;hp=a8cfffefa58304dd4d2fe51803ec88982012f3de;hpb=a86b1efe3def648c717752f383c32f346225008b;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/t/run/23cache.tl b/t/run/23cache.tl index a8cfffe..4be8fbd 100644 --- a/t/run/23cache.tl +++ b/t/run/23cache.tl @@ -3,17 +3,7 @@ my $schema = shift; eval "use DBD::SQLite"; plan skip_all => 'needs DBD::SQLite for testing' if $@; -plan tests => 12; - -warn " -This test WILL fail. That's because the has_many prefetch code is -only half re-written. However, it was utterly borken before, so -this is arguably an improvement. If you fancy having a go at making -_construct_object in resultset collapse multiple results into -appropriate nested structures for inflate_result, be my guest. - -- mst - -"; +plan tests => 23; my $rs = $schema->resultset("Artist")->search( { artistid => 1 } @@ -23,6 +13,64 @@ my $artist = $rs->first; is( scalar @{ $rs->get_cache }, 0, 'cache is not populated without cache attribute' ); +$rs = $schema->resultset('Artist')->search( undef, { cache => 1 } ); +my $artists = [ $rs->all ]; + +is( scalar @{$rs->get_cache}, 3, 'all() populates cache for search with cache attribute' ); + +$rs->clear_cache; + +is( scalar @{$rs->get_cache}, 0, 'clear_cache is functional' ); + +$rs->next; + +is( scalar @{$rs->get_cache}, 3, 'next() populates cache for search with cache attribute' ); + +pop( @$artists ); +$rs->set_cache( $artists ); + +is( scalar @{$rs->get_cache}, 2, 'set_cache() is functional' ); + +$cd = $schema->resultset('CD')->find(1); + +$rs->clear_cache; + +eval { + $rs->set_cache( [ $cd ] ); +}; + +is( scalar @{$rs->get_cache}, 0, 'set_cache() only accepts objects of correct type for the resultset' ); + +unlink 't/var/dbic.trace' if -e 't/var/dbic.trace'; +DBI->trace(1, 't/var/dbic.trace'); + +$rs = $schema->resultset('Artist')->search( undef, { cache => 1 } ); +while( $artist = $rs->next ) {} +$artist = $rs->first(); + +# count the SELECTs +DBI->trace(0, undef); +my $selects = 0; +$trace = IO::File->new('t/var/dbic.trace', '<') + or die "Unable to read trace file"; +while (<$trace>) { + $selects++ if /SELECT/; +} +$trace->close; +unlink 't/var/dbic.trace'; + +is( $selects, 1, 'revisiting a row does not issue a query when cache => 1' ); + +my @a = $schema->resultset("Artist")->search( + { }, + { + join => [ qw/ cds /], + prefetch => [qw/ cds /], + } +); + +is(scalar @a, 3, 'artist with cds: count parent objects'); + $rs = $schema->resultset("Artist")->search( { 'artistid' => 1 }, { @@ -57,7 +105,7 @@ is( $artist->count_related('cds'), 3, 'artist->count_related returns correct val # count the SELECTs DBI->trace(0, undef); -my $selects = 0; +$selects = 0; my $trace = IO::File->new('t/var/dbic.trace', '<') or die "Unable to read trace file"; while (<$trace>) { @@ -65,7 +113,7 @@ while (<$trace>) { } $trace->close; unlink 't/var/dbic.trace'; -is($selects, 2, 'only one SQL statement for each cached table'); +is($selects, 1, 'only one SQL statement executed'); # make sure related_resultset is deleted after object is updated $artist->set_column('name', 'New Name'); @@ -83,12 +131,22 @@ $rs = $schema->resultset("Artist")->search( }, } ); +{ +my $artist_count_before = $schema->resultset('Artist')->count; +$schema->resultset("Artist")->create({artistid=>4,name=>qq{Humoungous Hamsters}}); +is($schema->resultset('Artist')->count, $artist_count_before + 1, 'count() reflects new artist'); +my $artist = $schema->resultset("Artist")->search( + { artistid => 4 },{prefetch=>[qw/cds/]} +)->first; + +is($artist->cds, 0, 'No cds for this artist'); +} # SELECT count for nested has_many prefetch unlink 't/var/dbic.trace' if -e 't/var/dbic.trace'; DBI->trace(1, 't/var/dbic.trace'); -$artist = $rs->first; +$artist = ($rs->all)[0]; # count the SELECTs DBI->trace(0, undef); @@ -100,10 +158,10 @@ while (<$trace>) { } $trace->close; unlink 't/var/dbic.trace'; -is($selects, 3, 'one SQL statement for each cached table with nested prefetch'); +is($selects, 1, 'only one SQL statement executed'); my @objs; -$artist = $rs->find(1); +#$artist = $rs->find(1); unlink 't/var/dbic.trace' if -e 't/var/dbic.trace'; DBI->trace(1, 't/var/dbic.trace'); @@ -111,10 +169,10 @@ DBI->trace(1, 't/var/dbic.trace'); my $cds = $artist->cds; my $tags = $cds->next->tags; while( my $tag = $tags->next ) { - push @objs, $tag->tagid; #warn "tag:", $tag->ID; + push @objs, $tag->tagid; #warn "tag:", $tag->ID, " => ", $tag->tag; } -is_deeply( \@objs, [ 1 ], 'first cd has correct tags' ); +is_deeply( \@objs, [ 3 ], 'first cd has correct tags' ); $tags = $cds->next->tags; @objs = (); @@ -137,6 +195,45 @@ unlink 't/var/dbic.trace'; is( $selects, 0, 'no additional SQL statements while checking nested data' ); +# start test for prefetch SELECT count +unlink 't/var/dbic.trace' if -e 't/var/dbic.trace'; +DBI->trace(1, 't/var/dbic.trace'); + +$artist = $schema->resultset('Artist')->find(1, { prefetch => [qw/cds/] }); + +# count the SELECTs +DBI->trace(0, undef); +$selects = 0; +$trace = IO::File->new('t/var/dbic.trace', '<') + or die "Unable to read trace file"; +while (<$trace>) { + $selects++ if /SELECT/; +} +$trace->close; +unlink 't/var/dbic.trace'; + +is( $selects, 1, 'only one select statement on find with inline has_many prefetch' ); + +# start test for prefetch SELECT count +unlink 't/var/dbic.trace' if -e 't/var/dbic.trace'; +DBI->trace(1, 't/var/dbic.trace'); + +$rs = $schema->resultset('Artist')->search(undef, { prefetch => [qw/cds/] }); +$artist = $rs->find(1); + +# count the SELECTs +DBI->trace(0, undef); +$selects = 0; +$trace = IO::File->new('t/var/dbic.trace', '<') + or die "Unable to read trace file"; +while (<$trace>) { + $selects++ if /SELECT/; +} +$trace->close; +unlink 't/var/dbic.trace'; + +is( $selects, 1, 'only one select statement on find with has_many prefetch on resultset' ); + } 1;