X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Frun%2F23cache.tl;h=74a6ae9299c0f781b9bd400b229145112c1f9172;hb=d52170d466537df84dc1d86c84d9cd5a8e58407a;hp=f0c80ac5d979191c5f01b6aca131d5afb44fac22;hpb=3c3c416e78658e3675e9e0ee51333a1465d440c8;p=dbsrgits%2FDBIx-Class.git diff --git a/t/run/23cache.tl b/t/run/23cache.tl index f0c80ac..74a6ae9 100644 --- a/t/run/23cache.tl +++ b/t/run/23cache.tl @@ -1,9 +1,12 @@ sub run_tests { my $schema = shift; +my $queries; +$schema->storage->debugcb( sub{ $queries++ } ); + eval "use DBD::SQLite"; plan skip_all => 'needs DBD::SQLite for testing' if $@; -plan tests => 12; +plan tests => 23; my $rs = $schema->resultset("Artist")->search( { artistid => 1 } @@ -13,20 +16,68 @@ 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' ); + +$queries = 0; +$schema->storage->debug(1); + +$rs = $schema->resultset('Artist')->search( undef, { cache => 1 } ); +while( $artist = $rs->next ) {} +$artist = $rs->first(); + +is( $queries, 1, 'revisiting a row does not issue a query when cache => 1' ); + +$schema->storage->debug(0); + +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 }, { join => [ qw/ cds /], prefetch => [qw/ cds /], - cache => 1, } ); use Data::Dumper; $Data::Dumper::Deparse = 1; # start test for prefetch SELECT count -unlink 't/var/dbic.trace' if -e 't/var/dbic.trace'; -DBI->trace(1, 't/var/dbic.trace'); +$queries = 0; +$schema->storage->debug(1); $artist = $rs->first; $rs->reset(); @@ -46,17 +97,9 @@ is( $artist->cds->count, 3, 'artist->cds->count returns correct value' ); # ensure that $artist->count_related('cds') returns correct value is( $artist->count_related('cds'), 3, 'artist->count_related returns correct value' ); -# count the SELECTs -DBI->trace(0, undef); -my $selects = 0; -my $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, 2, 'only one SQL statement for each cached table'); +is($queries, 1, 'only one SQL statement executed'); + +$schema->storage->debug(0); # make sure related_resultset is deleted after object is updated $artist->set_column('name', 'New Name'); @@ -72,41 +115,42 @@ $rs = $schema->resultset("Artist")->search( prefetch => { cds => 'tags' }, - cache => 1 } ); +{ +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'); +$queries = 0; +$schema->storage->debug(1); -$artist = $rs->first; +$artist = ($rs->all)[0]; -# 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, 3, 'one SQL statement for each cached table with nested prefetch'); +is($queries, 1, 'only one SQL statement executed'); + +$schema->storage->debug(0); 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'); +$queries = 0; +$schema->storage->debug(1); 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 = (); @@ -116,18 +160,24 @@ while( my $tag = $tags->next ) { is_deeply( \@objs, [ 2, 5, 8 ], 'second cd has correct tags' ); -# 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( $queries, 0, 'no additional SQL statements while checking nested data' ); + +# start test for prefetch SELECT count +$queries = 0; + +$artist = $schema->resultset('Artist')->find(1, { prefetch => [qw/cds/] }); + +is( $queries, 1, 'only one select statement on find with inline has_many prefetch' ); + +# start test for prefetch SELECT count +$queries = 0; + +$rs = $schema->resultset('Artist')->search(undef, { prefetch => [qw/cds/] }); +$artist = $rs->find(1); + +is( $queries, 1, 'only one select statement on find with has_many prefetch on resultset' ); -is( $selects, 0, 'no additional SQL statements while checking nested data' ); +$schema->storage->debug(0); }