Add a test proving how dumb I am
[dbsrgits/DBIx-Class.git] / t / search / subquery.t
CommitLineData
cbbd7939 1#!/usr/bin/perl
2
3use strict;
69989ea9 4use warnings;
cbbd7939 5
6use Data::Dumper;
7
8use Test::More;
d0a3e4e2 9
d0a3e4e2 10
cbbd7939 11use lib qw(t/lib);
12use DBICTest;
13use DBIC::SqlMakerTest;
14
cbbd7939 15my $schema = DBICTest->init_schema();
16my $art_rs = $schema->resultset('Artist');
17my $cdrs = $schema->resultset('CD');
18
69989ea9 19my @tests = (
20 {
21 rs => $cdrs,
f21e372a 22 search => \[ "title = ? AND year LIKE ?", 'buahaha', '20%' ],
23 attrs => { rows => 5 },
24 sqlbind => \[
25 "( SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE (title = ? AND year LIKE ?) LIMIT 5)",
26 'buahaha',
27 '20%',
28 ],
29 },
30
31 {
32 rs => $cdrs,
69989ea9 33 search => {
34 artist_id => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'id' )->as_query },
35 },
36 sqlbind => \[
37 "( SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE artist_id IN ( SELECT id FROM artist me LIMIT 1 ) )",
38 ],
39 },
cbbd7939 40
69989ea9 41 {
42 rs => $art_rs,
43 attrs => {
0a62f675 44 'select' => [
7f51e1c8 45 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
46 ],
0a62f675 47 },
69989ea9 48 sqlbind => \[
49 "( SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me )",
50 ],
51 },
0a62f675 52
69989ea9 53 {
54 rs => $art_rs,
55 attrs => {
0a62f675 56 '+select' => [
57 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
7f51e1c8 58 ],
59 },
69989ea9 60 sqlbind => \[
61 "( SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me )",
62 ],
63 },
7f51e1c8 64
69989ea9 65 {
66 rs => $cdrs,
67 attrs => {
7f51e1c8 68 alias => 'cd2',
69 from => [
70 { cd2 => $cdrs->search({ id => { '>' => 20 } })->as_query },
71 ],
72 },
69989ea9 73 sqlbind => \[
74 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE id > ?) cd2 )",
866557f9 75 [ 'id', 20 ]
76 ],
69989ea9 77 },
7f51e1c8 78
a3c8d695 79 {
69989ea9 80 rs => $art_rs,
81 attrs => {
82 from => [ { 'me' => 'artist' },
83 [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
84 { 'me.artistid' => 'cds_artist' } ] ]
85 },
86 sqlbind => \[
87 "( SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me JOIN (SELECT me.artist as cds_artist FROM cd me) cds ON me.artistid = cds_artist )"
88 ],
89 },
a3c8d695 90
69989ea9 91 {
92 rs => $cdrs,
93 attrs => {
d20198ab 94 alias => 'cd2',
95 from => [
96 { cd2 => $cdrs->search(
97 { id => { '>' => 20 } },
98 {
99 alias => 'cd3',
100 from => [
101 { cd3 => $cdrs->search( { id => { '<' => 40 } } )->as_query }
102 ],
103 }, )->as_query },
104 ],
105 },
69989ea9 106 sqlbind => \[
107 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track
108 FROM
109 (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track
110 FROM
111 (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track
112 FROM cd me WHERE id < ?) cd3
113 WHERE id > ?) cd2
114 )",
115 [ 'id', 40 ],
866557f9 116 [ 'id', 20 ]
117 ],
69989ea9 118 },
d20198ab 119
69989ea9 120 {
121 rs => $cdrs,
122 search => {
123 year => {
124 '=' => $cdrs->search(
125 { artistid => { '=' => \'me.artistid' } },
126 { alias => 'inner' }
127 )->get_column('year')->max_rs->as_query,
128 },
4fa7bc22 129 },
69989ea9 130 sqlbind => \[
131 "( SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE year = (SELECT MAX(inner.year) FROM cd inner WHERE artistid = me.artistid) )",
132 ],
133 },
4fa7bc22 134
69989ea9 135 {
136 rs => $cdrs,
137 attrs => {
8996a659 138 alias => 'cd2',
139 from => [
140 { cd2 => $cdrs->search({ title => 'Thriller' })->as_query },
141 ],
142 },
69989ea9 143 sqlbind => \[
144 "(SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE title = ?) cd2)",
828ceb09 145 [ 'title',
146 'Thriller'
147 ]
148 ],
69989ea9 149 },
150);
151
152
153plan tests => @tests * 2;
154
155for my $i (0 .. $#tests) {
156 my $t = $tests[$i];
157 for my $p (1, 2) { # repeat everything twice, make sure we do not clobber search arguments
158 is_same_sql_bind (
159 $t->{rs}->search ($t->{search}, $t->{attrs})->as_query,
160 $t->{sqlbind},
161 sprintf 'Testcase %d, pass %d', $i+1, $p,
162 );
163 }
8996a659 164}