Refactor more things to fully hash based AST
[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 eq_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     }
65   ) ], 
66   [ "me.id > ? AND me.name = ?",
67     [ 500,
68       '200'
69     ]
70   ],
71   "Where with binds"
72 );
73 __END__
74
75
76 is $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
85 is $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
96 is $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
107 is $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
119 is $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
130 eq_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
150 eq_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");