We already depend on latest SQLA - remove all references to >= 1.50 - it will only...
[dbsrgits/DBIx-Class.git] / t / search / subquery.t
CommitLineData
cbbd7939 1#!/usr/bin/perl
2
3use strict;
4use warnings FATAL => 'all';
5
6use Data::Dumper;
7
8use Test::More;
d0a3e4e2 9
20ea616f 10plan ( tests => 7 );
d0a3e4e2 11
cbbd7939 12use lib qw(t/lib);
13use DBICTest;
14use DBIC::SqlMakerTest;
15
cbbd7939 16my $schema = DBICTest->init_schema();
17my $art_rs = $schema->resultset('Artist');
18my $cdrs = $schema->resultset('CD');
19
20{
21 my $cdrs2 = $cdrs->search({
22 artist_id => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'id' )->as_query },
23 });
24
25 my $arr = $cdrs2->as_query;
26 my ($query, @bind) = @{$$arr};
27 is_same_sql_bind(
28 $query, \@bind,
29 "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 )",
30 [],
31 );
32}
33
0a62f675 34{
7f51e1c8 35 my $rs = $art_rs->search(
36 {},
37 {
0a62f675 38 'select' => [
7f51e1c8 39 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
40 ],
0a62f675 41 },
42 );
43
44 my $arr = $rs->as_query;
45 my ($query, @bind) = @{$$arr};
46 is_same_sql_bind(
47 $query, \@bind,
48 "SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me",
49 [],
50 );
51}
52
53{
54 my $rs = $art_rs->search(
55 {},
56 {
57 '+select' => [
58 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
7f51e1c8 59 ],
60 },
61 );
62
63 my $arr = $rs->as_query;
64 my ($query, @bind) = @{$$arr};
7f51e1c8 65 is_same_sql_bind(
66 $query, \@bind,
0a62f675 67 "SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me",
7f51e1c8 68 [],
69 );
70}
71
d20198ab 72# simple from
73{
7f51e1c8 74 my $rs = $cdrs->search(
75 {},
76 {
77 alias => 'cd2',
78 from => [
79 { cd2 => $cdrs->search({ id => { '>' => 20 } })->as_query },
80 ],
81 },
82 );
83
84 my $arr = $rs->as_query;
85 my ($query, @bind) = @{$$arr};
86 is_same_sql_bind(
87 $query, \@bind,
d20198ab 88 "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 > 20) cd2",
7f51e1c8 89 [],
90 );
91}
92
a3c8d695 93# nested from
d20198ab 94{
a3c8d695 95 my $art_rs2 = $schema->resultset('Artist')->search({},
96 {
97 from => [ { 'me' => 'artist' },
98 [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
99 { 'me.artistid' => 'cds_artist' } ] ]
100 });
101
102 my $arr = $art_rs2->as_query;
103 my ($query, @bind) = @{$$arr};
104 is_same_sql_bind(
105 $query, \@bind,
106 "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", []
107 );
108
109
110}
111
d20198ab 112# nested subquery in from
113{
114 my $rs = $cdrs->search(
115 {},
116 {
117 alias => 'cd2',
118 from => [
119 { cd2 => $cdrs->search(
120 { id => { '>' => 20 } },
121 {
122 alias => 'cd3',
123 from => [
124 { cd3 => $cdrs->search( { id => { '<' => 40 } } )->as_query }
125 ],
126 }, )->as_query },
127 ],
128 },
129 );
130
131 my $arr = $rs->as_query;
132 my ($query, @bind) = @{$$arr};
133 is_same_sql_bind(
134 $query, \@bind,
135 "SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track
136 FROM
137 (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track
138 FROM
139 (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track
140 FROM cd me WHERE id < 40) cd3
141 WHERE id > 20) cd2",
142 [],
143 );
144
145}
146
496d9df9 147{
4fa7bc22 148 my $rs = $cdrs->search({
149 year => {
150 '=' => $cdrs->search(
151 { artistid => { '=' => \'me.artistid' } },
152 { alias => 'inner' }
153 )->get_column('year')->max_rs->as_query,
154 },
155 });
156 my $arr = $rs->as_query;
157 my ($query, @bind) = @{$$arr};
158 is_same_sql_bind(
159 $query, \@bind,
da0b073b 160 "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)",
4fa7bc22 161 [],
162 );
163}
164
cbbd7939 165__END__