use Test::Exception;
use lib qw(t/lib);
use DBICTest;
-
-plan tests => 9;
+use DBIC::SqlMakerTest;
my $schema = DBICTest->init_schema();
my $no_prefetch = $schema->resultset('Artist')->search(
- undef,
- { rows => 3 }
-);
-
-my $use_prefetch = $schema->resultset('Artist')->search(
[ # search deliberately contrived
{ 'artwork.cd_id' => undef },
{ 'tracks.title' => { '!=' => 'blah-blah-1234568' }}
],
+ { rows => 3, join => { cds => [qw/artwork tracks/] },
+ }
+);
+
+my $use_prefetch = $no_prefetch->search(
+ {},
{
+ select => ['me.artistid', 'me.name'],
+ as => ['artistid', 'name'],
prefetch => 'cds',
- join => { cds => [qw/artwork tracks/] },
- rows => 3,
order_by => { -desc => 'name' },
}
);
'single() with multiprefetch is illegal',
);
+throws_ok (
+ sub {
+ $use_prefetch->search(
+ {'tracks.title' => { '!=' => 'foo' }},
+ { order_by => \ 'some oddball literal sql', join => { cds => 'tracks' } }
+ )->next
+ }, qr/A required group_by clause could not be constructed automatically/,
+);
+
my $artist = $use_prefetch->search({'cds.title' => $artist_many_cds->cds->first->title })->next;
is($artist->cds->count, 1, "count on search limiting prefetched has_many");
my $artist2 = $use_prefetch->search({'cds.title' => { '!=' => $artist_many_cds->cds->first->title } })->slice (0,0)->next;
is($artist2->cds->count, 2, "count on search limiting prefetched has_many");
+# make sure 1:1 joins do not force a subquery (no point to exercise the optimizer, if at all available)
+# get cd's that have any tracks and their artists
+my $single_prefetch_rs = $schema->resultset ('CD')->search (
+ { 'me.year' => 2010, 'artist.name' => 'foo' },
+ { prefetch => ['tracks', 'artist'], rows => 15 },
+);
+is_same_sql_bind (
+ $single_prefetch_rs->as_query,
+ '(
+ SELECT
+ me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track,
+ tracks.trackid, tracks.cd, tracks.position, tracks.title, tracks.last_updated_on, tracks.last_updated_at,
+ artist.artistid, artist.name, artist.rank, artist.charfield
+ FROM (
+ SELECT
+ me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
+ FROM cd me
+ JOIN artist artist ON artist.artistid = me.artist
+ WHERE ( ( artist.name = ? AND me.year = ? ) )
+ LIMIT 15
+ ) me
+ LEFT JOIN track tracks
+ ON tracks.cd = me.cdid
+ JOIN artist artist
+ ON artist.artistid = me.artist
+ WHERE ( ( artist.name = ? AND me.year = ? ) )
+ ORDER BY tracks.cd
+ )',
+ [
+ [ 'artist.name' => 'foo' ],
+ [ 'me.year' => 2010 ],
+ [ 'artist.name' => 'foo' ],
+ [ 'me.year' => 2010 ],
+ ],
+ 'No grouping of non-multiplying resultsets',
+);
+
+done_testing;