Massive rewrite of bind handling, and overall simplification of ::Storage::DBI
[dbsrgits/DBIx-Class.git] / t / prefetch / count.t
CommitLineData
5eb45f82 1use strict;
2use warnings;
3
4use Test::More;
5use lib qw(t/lib);
6use DBICTest;
f7f14dc8 7use DBIC::SqlMakerTest;
5eb45f82 8
f7f14dc8 9plan tests => 23;
5eb45f82 10
11my $schema = DBICTest->init_schema();
12
13my $cd_rs = $schema->resultset('CD')->search (
14 { 'tracks.cd' => { '!=', undef } },
15 { prefetch => ['tracks', 'artist'] },
16);
17
18
19is($cd_rs->count, 5, 'CDs with tracks count');
20is($cd_rs->search_related('tracks')->count, 15, 'Tracks associated with CDs count (before SELECT()ing)');
21
22is($cd_rs->all, 5, 'Amount of CD objects with tracks');
23is($cd_rs->search_related('tracks')->count, 15, 'Tracks associated with CDs count (after SELECT()ing)');
24
25is($cd_rs->search_related ('tracks')->all, 15, 'Track objects associated with CDs (after SELECT()ing)');
1ec6e7c2 26
610e8c98 27my $artist = $schema->resultset('Artist')->create({name => 'xxx'});
28
29my $artist_rs = $schema->resultset('Artist')->search(
30 {artistid => $artist->id},
31 {prefetch=>'cds', join => 'twokeys' }
32);
33
a7daf36a 34is($artist_rs->count, 1, "New artist found with prefetch turned on");
35is(scalar($artist_rs->all), 1, "New artist fetched with prefetch turned on");
36is($artist_rs->related_resultset('cds')->count, 0, "No CDs counted on a brand new artist");
37is(scalar($artist_rs->related_resultset('cds')->all), 0, "No CDs fetched on a brand new artist (count == fetch)");
1ec6e7c2 38
610e8c98 39# create a cd, and make sure the non-existing join does not skew the count
40$artist->create_related ('cds', { title => 'yyy', year => '1999' });
41is($artist_rs->related_resultset('cds')->count, 1, "1 CDs counted on a brand new artist");
42is(scalar($artist_rs->related_resultset('cds')->all), 1, "1 CDs prefetched on a brand new artist (count == fetch)");
43
f7f14dc8 44# Really fuck shit up with one more cd and some insanity
45# this doesn't quite work as there are the prefetch gets lost
46# on search_related. This however is too esoteric to fix right
47# now
48
49my $cd2 = $artist->create_related ('cds', {
50 title => 'zzz',
51 year => '1999',
52 tracks => [{ title => 'ping' }, { title => 'pong' }],
53});
54
55my $cds = $cd2->search_related ('artist', {}, { join => 'twokeys' })
56 ->search_related ('cds');
57my $tracks = $cds->search_related ('tracks');
58
59is($tracks->count, 2, "2 Tracks counted on cd via artist via one of the cds");
60is(scalar($tracks->all), 2, "2 Track objects on cd via artist via one of the cds");
61
62is($cds->count, 2, "2 CDs counted on artist via one of the cds");
63is(scalar($cds->all), 2, "2 CD objectson artist via one of the cds");
64
65# make sure the join collapses all the way
66is_same_sql_bind (
67 $tracks->count_rs->as_query,
68 '(
69 SELECT COUNT( * )
70 FROM artist me
71 LEFT JOIN twokeys twokeys ON twokeys.artist = me.artistid
72 JOIN cd cds ON cds.artist = me.artistid
73 JOIN track tracks ON tracks.cd = cds.cdid
74 WHERE ( me.artistid = ? )
75 )',
0e773352 76 [ [ { sqlt_datatype => 'integer', dbic_colname => 'me.artistid' }
77 => 4 ] ],
f7f14dc8 78);
79
80
81TODO: {
82 local $TODO = "Chaining with prefetch is fundamentally broken";
83
84 my $queries;
85 $schema->storage->debugcb ( sub { $queries++ } );
86 $schema->storage->debug (1);
87
88 my $cds = $cd2->search_related ('artist', {}, { prefetch => { cds => 'tracks' }, join => 'twokeys' })
89 ->search_related ('cds');
90
91 my $tracks = $cds->search_related ('tracks');
92
93 is($tracks->count, 2, "2 Tracks counted on cd via artist via one of the cds");
94 is(scalar($tracks->all), 2, "2 Tracks prefetched on cd via artist via one of the cds");
95 is($tracks->count, 2, "Cached 2 Tracks counted on cd via artist via one of the cds");
96
97 is($cds->count, 2, "2 CDs counted on artist via one of the cds");
98 is(scalar($cds->all), 2, "2 CDs prefetched on artist via one of the cds");
99 is($cds->count, 2, "Cached 2 CDs counted on artist via one of the cds");
100
101 is ($queries, 3, '2 counts + 1 prefetch?');
102}