Commit | Line | Data |
5fc1d686 |
1 | use strict; |
2 | use warnings; |
3 | |
4 | use Test::More; |
5 | use Test::Exception; |
6 | |
7 | use lib qw(t/lib); |
8 | use DBICTest; |
9 | |
10 | my $schema = DBICTest->init_schema(); |
11 | |
e711f316 |
12 | lives_ok ( sub { |
13 | my $no_prefetch = $schema->resultset('Track')->search_related(cd => |
14 | { |
15 | 'cd.year' => "2000", |
16 | }, |
17 | { |
18 | join => 'tags', |
19 | order_by => 'me.trackid', |
20 | rows => 1, |
21 | } |
22 | ); |
23 | |
24 | my $use_prefetch = $no_prefetch->search( |
25 | {}, |
26 | { |
27 | prefetch => 'tags', |
28 | } |
29 | ); |
30 | |
31 | is($use_prefetch->count, $no_prefetch->count, 'counts with and without prefetch match'); |
32 | is( |
33 | scalar ($use_prefetch->all), |
34 | scalar ($no_prefetch->all), |
35 | "Amount of returned rows is right" |
36 | ); |
37 | |
38 | }, 'search_related prefetch with order_by works'); |
39 | |
40 | |
5fc1d686 |
41 | lives_ok (sub { |
42 | my $rs = $schema->resultset("Artwork")->search(undef, {distinct => 1}) |
43 | ->search_related('artwork_to_artist')->search_related('artist', |
44 | undef, |
45 | { prefetch => 'cds' }, |
46 | ); |
47 | is($rs->all, 0, 'prefetch without WHERE (objects)'); |
48 | is($rs->count, 0, 'prefetch without WHERE (count)'); |
49 | |
50 | $rs = $schema->resultset("Artwork")->search(undef, {distinct => 1}) |
51 | ->search_related('artwork_to_artist')->search_related('artist', |
52 | { 'cds.title' => 'foo' }, |
53 | { prefetch => 'cds' }, |
54 | ); |
55 | is($rs->all, 0, 'prefetch with WHERE (objects)'); |
56 | is($rs->count, 0, 'prefetch with WHERE (count)'); |
57 | |
58 | |
59 | # test where conditions at the root of the related chain |
5e8cb53c |
60 | my $artist_rs = $schema->resultset("Artist")->search({artistid => 2}); |
61 | my $artist = $artist_rs->next; |
62 | $artist->create_related ('cds', $_) for ( |
63 | { |
64 | year => 1999, title => 'vague cd', genre => { name => 'vague genre' } |
65 | }, |
66 | { |
67 | year => 1999, title => 'vague cd2', genre => { name => 'vague genre' } |
68 | }, |
69 | ); |
5fc1d686 |
70 | |
71 | $rs = $artist_rs->search_related('cds')->search_related('genre', |
5e8cb53c |
72 | { 'genre.name' => 'vague genre' }, |
5fc1d686 |
73 | { prefetch => 'cds' }, |
74 | ); |
5e8cb53c |
75 | is($rs->all, 1, 'base without distinct (objects)'); |
76 | is($rs->count, 1, 'base without distinct (count)'); |
77 | # artist -> 2 cds -> 2 genres -> 2 cds for each genre = 4 |
78 | is($rs->search_related('cds')->all, 4, 'prefetch without distinct (objects)'); |
79 | is($rs->search_related('cds')->count, 4, 'prefetch without distinct (count)'); |
5fc1d686 |
80 | |
81 | |
82 | $rs = $artist_rs->search(undef, {distinct => 1}) |
83 | ->search_related('cds')->search_related('genre', |
5e8cb53c |
84 | { 'genre.name' => 'vague genre' }, |
5fc1d686 |
85 | ); |
5e8cb53c |
86 | is($rs->all, 1, 'distinct without prefetch (objects)'); |
87 | is($rs->count, 1, 'distinct without prefetch (count)'); |
5fc1d686 |
88 | |
89 | |
90 | $rs = $artist_rs->search({}, {distinct => 1}) |
91 | ->search_related('cds')->search_related('genre', |
5e8cb53c |
92 | { 'genre.name' => 'vague genre' }, |
5fc1d686 |
93 | { prefetch => 'cds' }, |
94 | ); |
5e8cb53c |
95 | is($rs->all, 1, 'distinct with prefetch (objects)'); |
96 | is($rs->count, 1, 'distinct with prefetch (count)'); |
97 | # artist -> 2 cds -> 2 genres -> 2 cds for each genre + distinct = 2 |
98 | is($rs->search_related('cds')->all, 2, 'prefetched distinct with prefetch (objects)'); |
99 | is($rs->search_related('cds')->count, 2, 'prefetched distinct with prefetch (count)'); |
5fc1d686 |
100 | |
101 | |
102 | |
e711f316 |
103 | }, 'distinct generally works with prefetch on deep search_related chains'); |
5fc1d686 |
104 | |
105 | done_testing; |