Make more stuff work with HashAST
[dbsrgits/SQL-Abstract-2.0-ish.git] / t / 100_where_basic.t
1 use strict;
2 use warnings;
3
4 use Test::More tests => 12;
5 use Test::Differences;
6
7 use_ok('SQL::Abstract') or BAIL_OUT( "$@" );
8
9 my $sqla = SQL::Abstract->create(1);
10
11 is $sqla->dispatch(
12   { -type => 'expr',
13     op => '>',
14     args => [
15       {-type => name => args => [qw/me id/] }, 
16       { -type => 'value', value => 500 }
17     ]
18   }
19 ), "me.id > ?", 
20    "simple where clause";
21
22 is $sqla->dispatch(
23   { -type => 'expr', op => 'in', args => [  ] }
24 ), "0 = 1", "emtpy -in";
25
26 is $sqla->dispatch(
27   { -type => 'expr', 
28     op => 'in', 
29     args => [ { -type => 'name', args => ['foo'] } ],
30   }
31 ), "0 = 1", "emtpy -in";
32
33 is $sqla->dispatch(
34   { -type => 'expr',
35     op => '>',
36     args => [
37       {-type => 'name', args => [qw/me id/]}, 
38       {-type => 'value', value => 500 }
39     ]
40   }
41 ), "me.id > ?", 
42    "simple expr clause";
43
44 my $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
61 eq_or_diff( [ SQL::Abstract->generate(
62     { -ast_version => 1,
63       -type => 'expr',
64       op => 'and',
65       args => $cols,
66     }
67   ) ], 
68   [ "me.id > ? AND me.name = ?",
69     [ 500,
70       '200'
71     ]
72   ],
73   "Where with binds"
74 );
75
76
77 is $sqla->dispatch(
78   { -type => 'expr',  op => 'or', args => $cols }
79 ), "me.id > ? OR me.name = ?", 
80    "where clause (simple or)";
81
82
83 is $sqla->dispatch(
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 = ?",
93    "where clause (nested or)";
94
95 is $sqla->dispatch(
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 = ?", 
105    "where clause (inner and)";
106
107 __END__
108 is $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
120 is $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
131 eq_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
151 eq_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");