Make more stuff work with HashAST
[dbsrgits/SQL-Abstract-2.0-ish.git] / t / 100_where_basic.t
CommitLineData
0bf8a8c4 1use strict;
2use warnings;
3
4use Test::More tests => 12;
5use Test::Differences;
6
7use_ok('SQL::Abstract') or BAIL_OUT( "$@" );
8
9my $sqla = SQL::Abstract->create(1);
10
11is $sqla->dispatch(
1b85673a 12 { -type => 'expr',
13 op => '>',
14 args => [
15 {-type => name => args => [qw/me id/] },
16 { -type => 'value', value => 500 }
17 ]
18 }
19), "me.id > ?",
0bf8a8c4 20 "simple where clause";
a464be15 21
0bf8a8c4 22is $sqla->dispatch(
a464be15 23 { -type => 'expr', op => 'in', args => [ ] }
0bf8a8c4 24), "0 = 1", "emtpy -in";
25
26is $sqla->dispatch(
a464be15 27 { -type => 'expr',
28 op => 'in',
29 args => [ { -type => 'name', args => ['foo'] } ],
30 }
31), "0 = 1", "emtpy -in";
0bf8a8c4 32
a464be15 33is $sqla->dispatch(
34 { -type => 'expr',
35 op => '>',
36 args => [
37 {-type => 'name', args => [qw/me id/]},
38 {-type => 'value', value => 500 }
0bf8a8c4 39 ]
a464be15 40 }
41), "me.id > ?",
42 "simple expr clause";
43
e7996b3a 44my $cols = [
45 { -type => 'expr',
46 op => '>',
47 args => [
48 {-type => 'name', args => [qw/me id/]},
49 {-type => 'value', value => 500 }
50 ]
51 },
52 { -type => 'expr',
53 op => '==',
54 args => [
55 {-type => 'name', args => [qw/me name/]},
56 {-type => 'value', value => '200' }
57 ]
58 },
59];
60
a464be15 61eq_or_diff( [ SQL::Abstract->generate(
62 { -ast_version => 1,
63 -type => 'expr',
64 op => 'and',
e7996b3a 65 args => $cols,
a464be15 66 }
0bf8a8c4 67 ) ],
a464be15 68 [ "me.id > ? AND me.name = ?",
0bf8a8c4 69 [ 500,
70 '200'
71 ]
72 ],
73 "Where with binds"
74);
75
76
77is $sqla->dispatch(
e7996b3a 78 { -type => 'expr', op => 'or', args => $cols }
79), "me.id > ? OR me.name = ?",
0bf8a8c4 80 "where clause (simple or)";
81
82
83is $sqla->dispatch(
e7996b3a 84 { -type => 'expr', op => 'or',
85 args => [
86 { -type => 'expr', op => '==',
87 args => [ {-type => 'name', args => [qw/me name/] }, {-type => 'value', value => 500 } ]
88 },
89 { -type => 'expr', op => 'or', args => $cols }
90 ]
91 }
92), "me.name = ? OR me.id > ? OR me.name = ?",
0bf8a8c4 93 "where clause (nested or)";
94
95is $sqla->dispatch(
e7996b3a 96 { -type => 'expr', op => 'or',
97 args => [
98 { -type => 'expr', op => '==',
99 args => [ {-type => 'name', args => [qw/me name/] }, {-type => 'value', value => 500 } ]
100 },
101 { -type => 'expr', op => 'and', args => $cols }
102 ]
103 }
104), "me.name = ? OR me.id > ? AND me.name = ?",
0bf8a8c4 105 "where clause (inner and)";
106
e7996b3a 107__END__
0bf8a8c4 108is $sqla->dispatch(
109 [ -where => -and =>
110 [ '==', [-name => qw/me id/], [-value => 500 ] ],
111 [ -and =>
112 [ '>', [-name => qw/me name/], [-value => '200' ] ],
113 [ '<', [-name => qw/me name/], [-value => '100' ] ]
114 ]
115 ]
116), "WHERE me.id = ? AND me.name > ? AND me.name < ?",
117 "where clause (nested and)";
118
119
120is $sqla->dispatch(
121 [ -where => -and =>
122 [ '==', [-name => qw/me id/], [-value => 500 ] ],
123 [ -or =>
124 [ '>', [-name => qw/me name/], [-value => '200' ] ],
125 [ '<', [-name => qw/me name/], [-value => '100' ] ]
126 ]
127 ]
128), "WHERE me.id = ? AND (me.name > ? OR me.name < ?)",
129 "where clause (inner or)";
130
131eq_or_diff(
132 [SQL::Abstract->generate(
133 [ -ast_version => 1,
134 -where =>
135 [ -in =>
136 [-name => qw/me id/],
137 [-value => '100' ],
138 [-value => '200' ],
139 [-value => '300' ],
140 ]
141 ]
142 ) ],
143
144 [ "WHERE me.id IN (?, ?, ?)",
145 [ qw/100 200 300/]
146 ],
147
148 "where IN clause");
149
150
151eq_or_diff(
152 [SQL::Abstract->generate(
153 [ -ast_version => 1,
154 -where =>
155 [ -not_in =>
156 [-name => qw/me id/],
157 [-value => '100' ],
158 [-value => '200' ],
159 [-value => '300' ],
160 ]
161 ]
162 ) ],
163
164 [ "WHERE me.id NOT IN (?, ?, ?)",
165 [ qw/100 200 300/]
166 ],
167
168 "where NOT IN clause");