9 my $schema = DBICTest->init_schema(no_deploy => 1);
10 my $infmap = [qw/single_track.cd.artist.name year/];
13 $schema->source ('CD')->_mk_row_parser({
14 inflate_map => $infmap,
28 'Simple 1:1 descending non-collapsing parser',
32 single_track.cd.artist.artistid
34 single_track.cd.artist.cds.tracks.title
35 single_track.cd.artist.cds.cdid
40 $schema->source ('CD')->_mk_row_parser({
41 inflate_map => $infmap,
44 { artist => $_->[5], title => $_->[4], year => $_->[1] },
50 { artistid => $_->[0] },
61 '1:1 descending non-collapsing parser terminating with chained 1:M:M',
65 $schema->source('CD')->_resolve_collapse({map { $infmap->[$_] => $_ } 0 .. $#$infmap}),
69 -branch_id => [ 0, 2, 3, 4, 5 ],
74 -branch_id => [ 0, 2, 3, 4, 5],
81 -branch_id => [ 0, 2, 3, 4, 5 ],
87 -branch_id => [ 0, 2, 3 ],
93 -branch_id => [ 2, 3 ],
99 -branch_id => [ 2, 3 ],
107 'Correct collapse map for 1:1 descending chain terminating with chained 1:M:M'
111 $schema->source ('CD')->_mk_row_parser({
112 inflate_map => $infmap,
115 ' my($rows_pos, $result_pos, $cur_row, @cur_row_ids, @collapse_idx, $is_new_res) = (0, 0);
118 ( $rows_pos >= 0 and $_[0][$rows_pos++] ) or do { $rows_pos = -1; undef } )
120 ( $_[1] and $_[1]->() )
123 $cur_row_ids[$_] = defined $cur_row->[$_] ? $cur_row->[$_] : "\xFF\xFFN\xFFU\xFFL\xFFL\xFF\xFF"
126 # a present cref implies lazy prefetch, implies a supplied stash in $_[2]
127 $_[1] and $result_pos and unshift(@{$_[2]}, $cur_row) and last
128 if $is_new_res = ! $collapse_idx[1]{$cur_row_ids[4]}{$cur_row_ids[5]};
130 $collapse_idx[1]{$cur_row_ids[4]}{$cur_row_ids[5]} ||= [{ artist => $cur_row->[5], title => $cur_row->[4], year => $cur_row->[1] }];
131 $collapse_idx[1]{$cur_row_ids[4]}{$cur_row_ids[5]}[1]{single_track} ||= $collapse_idx[2]{$cur_row_ids[4]}{$cur_row_ids[5]};
132 $collapse_idx[2]{$cur_row_ids[4]}{$cur_row_ids[5]}[1]{cd} ||= $collapse_idx[3]{$cur_row_ids[4]}{$cur_row_ids[5]};
133 $collapse_idx[3]{$cur_row_ids[4]}{$cur_row_ids[5]}[1]{artist} ||= $collapse_idx[4]{$cur_row_ids[0]} ||= [{ artistid => $cur_row->[0] }];
135 $collapse_idx[4]{$cur_row_ids[0]}[1]{cds} ||= [];
136 push @{$collapse_idx[4]{$cur_row_ids[0]}[1]{cds}}, $collapse_idx[5]{$cur_row_ids[3]} ||= [{ cdid => $cur_row->[3] }]
137 unless $collapse_idx[5]{$cur_row_ids[3]};
139 $collapse_idx[5]{$cur_row_ids[3]}[1]{tracks} ||= [];
140 push @{$collapse_idx[5]{$cur_row_ids[3]}[1]{tracks}}, $collapse_idx[6]{$cur_row_ids[2]}{$cur_row_ids[3]} ||= [{ title => $cur_row->[2] }]
141 unless $collapse_idx[6]{$cur_row_ids[2]}{$cur_row_ids[3]};
143 $_[0][$result_pos++] = $collapse_idx[1]{$cur_row_ids[4]}{$cur_row_ids[5]}
146 splice @{$_[0]}, $result_pos;
148 'Same 1:1 descending terminating with chained 1:M:M but with collapse',
152 tracks.lyrics.lyric_versions.text
153 existing_single_track.cd.artist.artistid
154 existing_single_track.cd.artist.cds.year
158 existing_single_track.cd.artist.cds.cdid
160 existing_single_track.cd.artist.cds.tracks.title
161 existing_single_track.cd.artist.cds.genreid
165 $schema->source('CD')->_resolve_collapse({map { $infmap->[$_] => $_ } 0 .. $#$infmap}),
168 -node_id => [ 1 ], # existing_single_track.cd.artist.artistid
169 -branch_id => [ 0, 1, 5, 6, 8 ],
171 existing_single_track => {
173 -node_id => [ 1 ], # existing_single_track.cd.artist.artistid
174 -branch_id => [ 1, 6, 8 ],
179 -node_id => [ 1 ], # existing_single_track.cd.artist.artistid
180 -branch_id => [ 1, 6, 8 ],
185 -node_id => [ 1 ], # existing_single_track.cd.artist.artistid
186 -branch_id => [ 1, 6, 8 ],
191 -node_id => [ 6 ], # existing_single_track.cd.artist.cds.cdid
192 -branch_id => [ 6, 8 ],
197 -node_id => [ 6, 8 ], # existing_single_track.cd.artist.cds.cdid, existing_single_track.cd.artist.cds.tracks.title
198 -branch_id => [ 6, 8 ],
207 -node_id => [ 1, 5 ], # existing_single_track.cd.artist.artistid, tracks.title
208 -branch_id => [ 0, 1, 5 ],
213 -node_id => [ 1, 5 ], # existing_single_track.cd.artist.artistid, tracks.title
214 -branch_id => [ 0, 1, 5 ],
220 -node_id => [ 0, 1, 5 ], # tracks.lyrics.lyric_versions.text, existing_single_track.cd.artist.artistid, tracks.title
221 -branch_id => [ 0, 1, 5 ],
227 'Correct collapse map constructed',
231 $schema->source ('CD')->_mk_row_parser({
232 inflate_map => $infmap,
235 ' my ($rows_pos, $result_pos, $cur_row, @cur_row_ids, @collapse_idx, $is_new_res) = (0,0);
238 ( $rows_pos >= 0 and $_[0][$rows_pos++] ) or do { $rows_pos = -1; undef } )
240 ( $_[1] and $_[1]->() )
243 $cur_row_ids[$_] = defined $cur_row->[$_] ? $cur_row->[$_] : "\xFF\xFFN\xFFU\xFFL\xFFL\xFF\xFF"
246 $is_new_res = ! $collapse_idx[1]{$cur_row_ids[1]} and (
247 $_[1] and $result_pos and (unshift @{$_[2]}, $cur_row) and last
250 $collapse_idx[1]{$cur_row_ids[1]} ||= [{ latest_cd => $cur_row->[7], year => $cur_row->[3], genreid => $cur_row->[4] }];
252 $collapse_idx[1]{$cur_row_ids[1]}[1]{existing_single_track} ||= $collapse_idx[2]{$cur_row_ids[1]};
253 $collapse_idx[2]{$cur_row_ids[1]}[1]{cd} ||= $collapse_idx[3]{$cur_row_ids[1]};
254 $collapse_idx[3]{$cur_row_ids[1]}[1]{artist} ||= $collapse_idx[4]{$cur_row_ids[1]} ||= [{ artistid => $cur_row->[1] }];
256 $collapse_idx[4]{$cur_row_ids[1]}[1]{cds} ||= [];
257 push @{ $collapse_idx[4]{$cur_row_ids[1]}[1]{cds} }, $collapse_idx[5]{$cur_row_ids[6]} ||= [{ cdid => $cur_row->[6], genreid => $cur_row->[9], year => $cur_row->[2] }]
258 unless $collapse_idx[5]{$cur_row_ids[6]};
260 $collapse_idx[5]{$cur_row_ids[6]}[1]{tracks} ||= [];
261 push @{ $collapse_idx[5]{$cur_row_ids[6]}[1]{tracks} }, $collapse_idx[6]{$cur_row_ids[6]}{$cur_row_ids[8]} ||= [{ title => $cur_row->[8] }]
262 unless $collapse_idx[6]{$cur_row_ids[6]}{$cur_row_ids[8]};
264 $collapse_idx[1]{$cur_row_ids[1]}[1]{tracks} ||= [];
265 push @{ $collapse_idx[1]{$cur_row_ids[1]}[1]{tracks} }, $collapse_idx[7]{$cur_row_ids[1]}{$cur_row_ids[5]} ||= [{ title => $cur_row->[5] }]
266 unless $collapse_idx[7]{$cur_row_ids[1]}{$cur_row_ids[5]};
268 $collapse_idx[7]{$cur_row_ids[1]}{$cur_row_ids[5]}[1]{lyrics} ||= $collapse_idx[8]{$cur_row_ids[1]}{$cur_row_ids[5] };
270 $collapse_idx[8]{$cur_row_ids[1]}{$cur_row_ids[5]}[1]{lyric_versions} ||= [];
271 push @{ $collapse_idx[8]{$cur_row_ids[1]}{$cur_row_ids[5]}[1]{lyric_versions} }, $collapse_idx[9]{$cur_row_ids[0]}{$cur_row_ids[1]}{$cur_row_ids[5]} ||= [{ text => $cur_row->[0] }]
272 unless $collapse_idx[9]{$cur_row_ids[0]}{$cur_row_ids[1]}{$cur_row_ids[5]};
274 $_[0][$result_pos++] = $collapse_idx[1]{$cur_row_ids[1]}
278 splice @{$_[0]}, $result_pos;
280 'Multiple has_many on multiple branches torture test',
287 $deparser ||= B::Deparse->new;
288 local $Test::Builder::Level = $Test::Builder::Level + 1;
290 my ($got, $expect) = map {
291 my $cref = eval "sub { $_ }" or do {
292 fail "Coderef does not compile!\n\n$@\n\n$_";
295 $deparser->coderef2text($cref);
298 is ($got, $expect, $_[2]||() )
299 or note ("Originals source:\n\n$_[0]\n\n$_[1]\n");