Fix left-join chaining
[dbsrgits/DBIx-Class.git] / t / prefetch / diamond.t
1 # Test if prefetch and join in diamond relationship fetching the correct rows
2 use strict;
3 use warnings;
4
5 use Test::More;
6 use lib qw(t/lib);
7 use DBICTest;
8
9 my $schema = DBICTest->init_schema();
10
11 $schema->populate('Artwork', [
12     [ qw/cd_id/ ],
13     [ 1 ],
14 ]);
15
16 $schema->populate('Artwork_to_Artist', [
17     [ qw/artwork_cd_id artist_id/ ],
18     [ 1, 2 ],
19 ]);
20
21 my $ars = $schema->resultset ('Artwork');
22
23 # The relationship diagram here is:
24 #
25 #  $ars --> artwork_to_artist
26 #   |              |
27 #   |              |
28 #   V              V
29 #   cd  ------>  artist
30 #
31 # The current artwork belongs to a cd by artist1
32 # but the artwork itself is painted by artist2
33 #
34 # What we try is all possible permutations of join/prefetch 
35 # combinations in both directions, while always expecting to
36 # arrive at the specific artist at the end of each path.
37
38
39 my $cd_paths = {
40   'no cd' => [],
41   'cd' => ['cd'],
42   'cd->artist1' => [{'cd' => 'artist'}]
43 };
44 my $a2a_paths = {
45   'no a2a' => [],
46   'a2a' => ['artwork_to_artist'],
47   'a2a->artist2' => [{'artwork_to_artist' => 'artist'}]
48 };
49
50 my %tests;
51
52 foreach my $cd_path (keys %$cd_paths) {
53
54   foreach my $a2a_path (keys %$a2a_paths) {
55
56
57     $tests{sprintf "join %s, %s", $cd_path, $a2a_path} = $ars->search({}, {
58       'join' => [
59         @{ $cd_paths->{$cd_path} },
60         @{ $a2a_paths->{$a2a_path} },
61       ],
62       'prefetch' => [
63       ],
64     });
65
66
67     $tests{sprintf "prefetch %s, %s", $cd_path, $a2a_path} = $ars->search({}, {
68       'join' => [
69       ],
70       'prefetch' => [
71         @{ $cd_paths->{$cd_path} },
72         @{ $a2a_paths->{$a2a_path} },
73       ],
74     });
75
76
77     $tests{sprintf "join %s, prefetch %s", $cd_path, $a2a_path} = $ars->search({}, {
78       'join' => [
79         @{ $cd_paths->{$cd_path} },
80       ],
81       'prefetch' => [
82         @{ $a2a_paths->{$a2a_path} },
83       ],
84     });
85
86
87     $tests{sprintf "join %s, prefetch %s", $a2a_path, $cd_path} = $ars->search({}, {
88       'join' => [
89         @{ $a2a_paths->{$a2a_path} },
90       ],
91       'prefetch' => [
92         @{ $cd_paths->{$cd_path} },
93       ],
94     });
95
96   }
97 }
98
99 plan tests => (scalar (keys %tests) * 3);
100
101 foreach my $name (keys %tests) {
102   foreach my $artwork ($tests{$name}->all()) {
103     is($artwork->id, 1, $name . ', correct artwork');
104     is($artwork->cd->artist->artistid, 1, $name . ', correct artist_id over cd');
105     is($artwork->artwork_to_artist->first->artist->artistid, 2, $name . ', correct artist_id over A2A');
106   }
107 }