-
Notifications
You must be signed in to change notification settings - Fork 151
/
88result_set_column.t
156 lines (126 loc) · 4.55 KB
/
88result_set_column.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
use strict;
use warnings;
use Test::More;
use Test::Warn;
use Test::Exception;
use lib qw(t/lib);
use DBICTest;
use DBIC::SqlMakerTest;
my $schema = DBICTest->init_schema();
my $rs = $schema->resultset("CD");
cmp_ok (
$rs->count,
'!=',
$rs->search ({}, {columns => ['year'], distinct => 1})->count,
'At least one year is the same in rs'
);
my $rs_title = $rs->get_column('title');
my $rs_year = $rs->get_column('year');
my $max_year = $rs->get_column(\'MAX (year)');
is($rs_title->next, 'Spoonful of bees', "next okay");
is_deeply( [ sort $rs_year->func('DISTINCT') ], [ 1997, 1998, 1999, 2001 ], "wantarray context okay");
ok ($max_year->next == $rs_year->max, q/get_column (\'FUNC') ok/);
my @all = $rs_title->all;
cmp_ok(scalar @all, '==', 5, "five titles returned");
cmp_ok($rs_year->max, '==', 2001, "max okay for year");
is($rs_title->min, 'Caterwaulin\' Blues', "min okay for title");
cmp_ok($rs_year->sum, '==', 9996, "three artists returned");
$rs_year->reset;
is($rs_year->next, 1999, "reset okay");
is($rs_year->first, 1999, "first okay");
warnings_exist (sub {
is($rs_year->single, 1999, "single okay");
}, qr/Query returned more than one row/, 'single warned');
# test distinct propagation
is_deeply (
[$rs->search ({}, { distinct => 1 })->get_column ('year')->all],
[$rs_year->func('distinct')],
'distinct => 1 is passed through properly',
);
# test +select/+as for single column
my $psrs = $schema->resultset('CD')->search({},
{
'+select' => \'MAX(year)',
'+as' => 'last_year'
}
);
lives_ok(sub { $psrs->get_column('last_year')->next }, '+select/+as additional column "last_year" present (scalar)');
dies_ok(sub { $psrs->get_column('noSuchColumn')->next }, '+select/+as nonexistent column throws exception');
# test +select/+as for overriding a column
$psrs = $schema->resultset('CD')->search({},
{
'select' => \"'The Final Countdown'",
'as' => 'title'
}
);
is($psrs->get_column('title')->next, 'The Final Countdown', '+select/+as overridden column "title"');
# test +select/+as for multiple columns
$psrs = $schema->resultset('CD')->search({},
{
'+select' => [ \'LENGTH(title) AS title_length', 'title' ],
'+as' => [ 'tlength', 'addedtitle' ]
}
);
lives_ok(sub { $psrs->get_column('tlength')->next }, '+select/+as multiple additional columns, "tlength" column present');
lives_ok(sub { $psrs->get_column('addedtitle')->next }, '+select/+as multiple additional columns, "addedtitle" column present');
# test that +select/+as specs do not leak
is_same_sql_bind (
$psrs->get_column('year')->as_query,
'(SELECT me.year FROM cd me)',
[],
'Correct SQL for get_column/as'
);
is_same_sql_bind (
$psrs->get_column('addedtitle')->as_query,
'(SELECT me.title FROM cd me)',
[],
'Correct SQL for get_column/+as col'
);
is_same_sql_bind (
$psrs->get_column('tlength')->as_query,
'(SELECT LENGTH(title) AS title_length FROM cd me)',
[],
'Correct SQL for get_column/+as func'
);
# test that order_by over a function forces a subquery
lives_ok ( sub {
is_deeply (
[ $psrs->search ({}, { order_by => { -desc => 'title_length' } })->get_column ('title')->all ],
[
"Generic Manufactured Singles",
"Come Be Depressed With Us",
"Caterwaulin' Blues",
"Spoonful of bees",
"Forkful of bees",
],
'Subquery count induced by aliased ordering function',
);
});
# test for prefetch not leaking
{
my $rs = $schema->resultset("CD")->search({}, { prefetch => 'artist' });
my $rsc = $rs->get_column('year');
is( $rsc->{_parent_resultset}->{attrs}->{prefetch}, undef, 'prefetch wiped' );
}
# test sum()
is ($schema->resultset('BooksInLibrary')->get_column ('price')->sum, 125, 'Sum of a resultset works correctly');
# test sum over search_related
my $owner = $schema->resultset('Owners')->find ({ name => 'Newton' });
ok ($owner->books->count > 1, 'Owner Newton has multiple books');
is ($owner->search_related ('books')->get_column ('price')->sum, 60, 'Correctly calculated price of all owned books');
# make sure joined/prefetched get_column of a PK dtrt
$rs->reset;
my $j_rs = $rs->search ({}, { join => 'tracks' })->get_column ('cdid');
is_deeply (
[ $j_rs->all ],
[ map { my $c = $rs->next; ( ($c->id) x $c->tracks->count ) } (1 .. $rs->count) ],
'join properly explodes amount of rows from get_column',
);
$rs->reset;
my $p_rs = $rs->search ({}, { prefetch => 'tracks' })->get_column ('cdid');
is_deeply (
[ $p_rs->all ],
[ $rs->get_column ('cdid')->all ],
'prefetch properly collapses amount of rows from get_column',
);
done_testing;