Port more stuff to use 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 __END__
22 is $sqla->dispatch(
23   [ -in => [  ] ]
24 ), "0 = 1", "emtpy -in";
25
26 is $sqla->dispatch(
27   [ -where =>
28       [ '>', [-name => qw/me id/], [-value => 500 ] ]
29   ]
30 ), "WHERE me.id > ?", 
31    "simple where clause";
32
33 eq_or_diff( [ SQL::Abstract->generate(
34     [ -ast_version => 1,
35       -where =>
36         [ '>', [-name => qw/me id/], [-value => 500 ] ],
37         [ '==', [-name => qw/me name/], [-value => '200' ] ]
38     ]
39   ) ], 
40   [ "WHERE me.id > ? AND me.name = ?",
41     [ 500,
42       '200'
43     ]
44   ],
45   "Where with binds"
46 );
47
48
49 is $sqla->dispatch(
50   [ -where =>  -or =>
51       [ '>', [-name => qw/me id/], [-value => 500 ] ],
52       [ '==', [-name => qw/me name/], [-value => '200' ] ],
53   ]
54 ), "WHERE me.id > ? OR me.name = ?", 
55    "where clause (simple or)";
56
57
58 is $sqla->dispatch(
59   [ -where =>  -or =>
60       [ '>', [-name => qw/me id/], [-value => 500 ] ],
61       [ -or => 
62         [ '==', [-name => qw/me name/], [-value => '200' ] ],
63         [ '==', [-name => qw/me name/], [-value => '100' ] ]
64       ]
65   ]
66 ), "WHERE me.id > ? OR me.name = ? OR me.name = ?",
67    "where clause (nested or)";
68
69 is $sqla->dispatch(
70   [ -where =>  -or =>
71       [ '==', [-name => qw/me id/], [-value => 500 ] ],
72       [ -and => 
73         [ '>', [-name => qw/me name/], [-value => '200' ] ],
74         [ '<', [-name => qw/me name/], [-value => '100' ] ]
75       ]
76   ]
77 ), "WHERE me.id = ? OR me.name > ? AND me.name < ?", 
78    "where clause (inner and)";
79
80 is $sqla->dispatch(
81   [ -where =>  -and =>
82       [ '==', [-name => qw/me id/], [-value => 500 ] ],
83       [ -and => 
84         [ '>', [-name => qw/me name/], [-value => '200' ] ],
85         [ '<', [-name => qw/me name/], [-value => '100' ] ]
86       ]
87   ]
88 ), "WHERE me.id = ? AND me.name > ? AND me.name < ?", 
89    "where clause (nested and)";
90
91
92 is $sqla->dispatch(
93   [ -where =>  -and =>
94       [ '==', [-name => qw/me id/], [-value => 500 ] ],
95       [ -or => 
96         [ '>', [-name => qw/me name/], [-value => '200' ] ],
97         [ '<', [-name => qw/me name/], [-value => '100' ] ]
98       ]
99   ]
100 ), "WHERE me.id = ? AND (me.name > ? OR me.name < ?)", 
101    "where clause (inner or)";
102
103 eq_or_diff(
104   [SQL::Abstract->generate(
105     [ -ast_version => 1,
106       -where =>
107       [ -in => 
108         [-name => qw/me id/],
109         [-value => '100' ],
110         [-value => '200' ],
111         [-value => '300' ],
112       ]
113     ]
114   ) ],
115
116   [ "WHERE me.id IN (?, ?, ?)", 
117     [ qw/100 200 300/]
118   ],
119   
120   "where IN clause");
121
122
123 eq_or_diff(
124   [SQL::Abstract->generate(
125     [ -ast_version => 1,
126       -where =>
127       [ -not_in => 
128         [-name => qw/me id/],
129         [-value => '100' ],
130         [-value => '200' ],
131         [-value => '300' ],
132       ]
133     ]
134   ) ],
135
136   [ "WHERE me.id NOT IN (?, ?, ?)", 
137     [ qw/100 200 300/]
138   ],
139   
140   "where NOT IN clause");