Refactor more things to fully hash based AST
[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
44eq_or_diff( [ SQL::Abstract->generate(
45 { -ast_version => 1,
46 -type => 'expr',
47 op => 'and',
48 args => [
49 { -type => 'expr',
50 op => '>',
51 args => [
52 {-type => 'name', args => [qw/me id/]},
53 {-type => 'value', value => 500 }
54 ]
55 },
56 { -type => 'expr',
57 op => '==',
58 args => [
59 {-type => 'name', args => [qw/me name/]},
60 {-type => 'value', value => '200' }
61 ]
62 },
63 ]
64 }
0bf8a8c4 65 ) ],
a464be15 66 [ "me.id > ? AND me.name = ?",
0bf8a8c4 67 [ 500,
68 '200'
69 ]
70 ],
71 "Where with binds"
72);
a464be15 73__END__
0bf8a8c4 74
75
76is $sqla->dispatch(
77 [ -where => -or =>
78 [ '>', [-name => qw/me id/], [-value => 500 ] ],
79 [ '==', [-name => qw/me name/], [-value => '200' ] ],
80 ]
81), "WHERE me.id > ? OR me.name = ?",
82 "where clause (simple or)";
83
84
85is $sqla->dispatch(
86 [ -where => -or =>
87 [ '>', [-name => qw/me id/], [-value => 500 ] ],
88 [ -or =>
89 [ '==', [-name => qw/me name/], [-value => '200' ] ],
90 [ '==', [-name => qw/me name/], [-value => '100' ] ]
91 ]
92 ]
93), "WHERE me.id > ? OR me.name = ? OR me.name = ?",
94 "where clause (nested or)";
95
96is $sqla->dispatch(
97 [ -where => -or =>
98 [ '==', [-name => qw/me id/], [-value => 500 ] ],
99 [ -and =>
100 [ '>', [-name => qw/me name/], [-value => '200' ] ],
101 [ '<', [-name => qw/me name/], [-value => '100' ] ]
102 ]
103 ]
104), "WHERE me.id = ? OR me.name > ? AND me.name < ?",
105 "where clause (inner and)";
106
107is $sqla->dispatch(
108 [ -where => -and =>
109 [ '==', [-name => qw/me id/], [-value => 500 ] ],
110 [ -and =>
111 [ '>', [-name => qw/me name/], [-value => '200' ] ],
112 [ '<', [-name => qw/me name/], [-value => '100' ] ]
113 ]
114 ]
115), "WHERE me.id = ? AND me.name > ? AND me.name < ?",
116 "where clause (nested and)";
117
118
119is $sqla->dispatch(
120 [ -where => -and =>
121 [ '==', [-name => qw/me id/], [-value => 500 ] ],
122 [ -or =>
123 [ '>', [-name => qw/me name/], [-value => '200' ] ],
124 [ '<', [-name => qw/me name/], [-value => '100' ] ]
125 ]
126 ]
127), "WHERE me.id = ? AND (me.name > ? OR me.name < ?)",
128 "where clause (inner or)";
129
130eq_or_diff(
131 [SQL::Abstract->generate(
132 [ -ast_version => 1,
133 -where =>
134 [ -in =>
135 [-name => qw/me id/],
136 [-value => '100' ],
137 [-value => '200' ],
138 [-value => '300' ],
139 ]
140 ]
141 ) ],
142
143 [ "WHERE me.id IN (?, ?, ?)",
144 [ qw/100 200 300/]
145 ],
146
147 "where IN clause");
148
149
150eq_or_diff(
151 [SQL::Abstract->generate(
152 [ -ast_version => 1,
153 -where =>
154 [ -not_in =>
155 [-name => qw/me id/],
156 [-value => '100' ],
157 [-value => '200' ],
158 [-value => '300' ],
159 ]
160 ]
161 ) ],
162
163 [ "WHERE me.id NOT IN (?, ?, ?)",
164 [ qw/100 200 300/]
165 ],
166
167 "where NOT IN clause");