added replication as an optional feature to make installing it easier
[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,
22 search => {
23 artist_id => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'id' )->as_query },
24 },
25 sqlbind => \[
26 "( 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 ) )",
27 ],
28 },
cbbd7939 29
69989ea9 30 {
31 rs => $art_rs,
32 attrs => {
0a62f675 33 'select' => [
7f51e1c8 34 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
35 ],
0a62f675 36 },
69989ea9 37 sqlbind => \[
38 "( SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me )",
39 ],
40 },
0a62f675 41
69989ea9 42 {
43 rs => $art_rs,
44 attrs => {
0a62f675 45 '+select' => [
46 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
7f51e1c8 47 ],
48 },
69989ea9 49 sqlbind => \[
50 "( SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me )",
51 ],
52 },
7f51e1c8 53
69989ea9 54 {
55 rs => $cdrs,
56 attrs => {
7f51e1c8 57 alias => 'cd2',
58 from => [
59 { cd2 => $cdrs->search({ id => { '>' => 20 } })->as_query },
60 ],
61 },
69989ea9 62 sqlbind => \[
63 "( 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 64 [ 'id', 20 ]
65 ],
69989ea9 66 },
7f51e1c8 67
a3c8d695 68 {
69989ea9 69 rs => $art_rs,
70 attrs => {
71 from => [ { 'me' => 'artist' },
72 [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
73 { 'me.artistid' => 'cds_artist' } ] ]
74 },
75 sqlbind => \[
76 "( 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 )"
77 ],
78 },
a3c8d695 79
69989ea9 80 {
81 rs => $cdrs,
82 attrs => {
d20198ab 83 alias => 'cd2',
84 from => [
85 { cd2 => $cdrs->search(
86 { id => { '>' => 20 } },
87 {
88 alias => 'cd3',
89 from => [
90 { cd3 => $cdrs->search( { id => { '<' => 40 } } )->as_query }
91 ],
92 }, )->as_query },
93 ],
94 },
69989ea9 95 sqlbind => \[
96 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track
97 FROM
98 (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track
99 FROM
100 (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track
101 FROM cd me WHERE id < ?) cd3
102 WHERE id > ?) cd2
103 )",
104 [ 'id', 40 ],
866557f9 105 [ 'id', 20 ]
106 ],
69989ea9 107 },
d20198ab 108
69989ea9 109 {
110 rs => $cdrs,
111 search => {
112 year => {
113 '=' => $cdrs->search(
114 { artistid => { '=' => \'me.artistid' } },
115 { alias => 'inner' }
116 )->get_column('year')->max_rs->as_query,
117 },
4fa7bc22 118 },
69989ea9 119 sqlbind => \[
120 "( 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) )",
121 ],
122 },
4fa7bc22 123
69989ea9 124 {
125 rs => $cdrs,
126 attrs => {
8996a659 127 alias => 'cd2',
128 from => [
129 { cd2 => $cdrs->search({ title => 'Thriller' })->as_query },
130 ],
131 },
69989ea9 132 sqlbind => \[
133 "(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 134 [ 'title',
135 'Thriller'
136 ]
137 ],
69989ea9 138 },
139);
140
141
142plan tests => @tests * 2;
143
144for my $i (0 .. $#tests) {
145 my $t = $tests[$i];
146 for my $p (1, 2) { # repeat everything twice, make sure we do not clobber search arguments
147 is_same_sql_bind (
148 $t->{rs}->search ($t->{search}, $t->{attrs})->as_query,
149 $t->{sqlbind},
150 sprintf 'Testcase %d, pass %d', $i+1, $p,
151 );
152 }
8996a659 153}