Added solution, though no fix
[dbsrgits/DBIx-Class.git] / t / 98rows_prefetch.t
CommitLineData
a04af85f 1# Test to ensure we get a consistent result set wether or not we use the
2# prefetch option in combination rows (LIMIT).
3use strict;
4use warnings;
5
6use Test::More;
7use lib qw(t/lib);
8use DBICTest;
9
10plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 2);
11
12my $schema = DBICTest->init_schema();
ff57f45b 13$schema->storage->debug(1);
a04af85f 14my $no_prefetch = $schema->resultset('Artist')->search(
25cac750 15 undef,
16 { rows => 3 }
a04af85f 17);
18
19my $use_prefetch = $schema->resultset('Artist')->search(
25cac750 20 undef,
21 {
22 prefetch => 'cds',
23 rows => 3
24 }
a04af85f 25);
26
27my $no_prefetch_count = 0;
28my $use_prefetch_count = 0;
29
30is($no_prefetch->count, $use_prefetch->count, '$no_prefetch->count == $use_prefetch->count');
31
32TODO: {
25cac750 33 local $TODO = "This is a difficult bug to fix, workaround is not to use prefetch with rows";
34 $no_prefetch_count++ while $no_prefetch->next;
35 $use_prefetch_count++ while $use_prefetch->next;
36 is(
37 $no_prefetch_count,
38 $use_prefetch_count,
39 "manual row count confirms consistency"
40 . " (\$no_prefetch_count == $no_prefetch_count, "
41 . " \$use_prefetch_count == $use_prefetch_count)"
42 );
a04af85f 43}
25cac750 44
45__END__
46The fix is to, when using prefetch, take the query and put it into a subquery
47joined to the tables we're prefetching from. This might result in the same
48table being joined once in the main subquery and once in the main query. This
49may actually resolve other, unknown edgecase bugs. It is also the right way
50to do prefetching. Optimizations can come later.
51
52This means that:
53 $foo_rs->search(
54 { ... },
55 {
56 prefetch => 'bar',
57 ...
58 },
59 );
60
61becomes:
62 my $temp = $foo_rs->search(
63 { ... },
64 {
65 join => 'bar',
66 ...
67 },
68 );
69 $foo_rs->storage->schema->resultset('foo')->search(
70 undef,
71 {
72 from => [
73 { me => $temp->as_query },
74 ],
75 prefetch => 'bar',
76 },
77 );
78
79Problem:
80 * The prefetch->join change needs to happen ONLY IF there are conditions
81 that depend on bar being joined.