Adjust for SQLA's API change 966200cc8
[dbsrgits/DBIx-Class.git] / t / search / stack_cond.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use lib qw(t/lib);
6 use DBICTest ':DiffSQL';
7 use SQL::Abstract qw(is_plain_value is_literal_value);
8 use List::Util 'shuffle';
9 use Data::Dumper;
10 $Data::Dumper::Terse = 1;
11 $Data::Dumper::Useqq = 1;
12 $Data::Dumper::Indent = 0;
13
14 my $schema = DBICTest->init_schema();
15
16 for my $c (
17   { cond => undef, sql => 'IS NULL' },
18   { cond => { -value => undef }, sql => 'IS NULL' },
19   { cond => \'foo', sql => '= foo' },
20   { cond => 'foo', sql => '= ?', bind => [
21     [ { dbic_colname => "title", sqlt_datatype => "varchar", sqlt_size => 100 } => 'foo' ],
22     [ { dbic_colname => "year", sqlt_datatype => "varchar", sqlt_size => 100 } => 'foo' ],
23   ]},
24   { cond => { -value => 'foo' }, sql => '= ?', bind => [
25     [ { dbic_colname => "title", sqlt_datatype => "varchar", sqlt_size => 100 } => 'foo' ],
26     [ { dbic_colname => "year", sqlt_datatype => "varchar", sqlt_size => 100 } => 'foo' ],
27   ]},
28   { cond => \[ '?', "foo" ], sql => '= ?', bind => [
29     [ {} => 'foo' ],
30     [ {} => 'foo' ],
31   ]},
32 ) {
33   my $rs = $schema->resultset('CD')->search({}, { columns => 'title' });
34
35   my $bare_cond = is_literal_value($c->{cond}) ? { '=', $c->{cond} } : $c->{cond};
36
37   my @query_steps = (
38     # these are monkey-wrenches, always there
39     { title => { '!=', [ -and => \'bar' ] }, year => { '!=', [ -and => 'bar' ] } },
40     { -or => [ genreid => undef, genreid => { '!=' => \42 } ] },
41     { -or => [ genreid => undef, genreid => { '!=' => \42 } ] },
42
43     { title => $bare_cond, year => { '=', $c->{cond} } },
44     { -and => [ year => $bare_cond, { title => { '=', $c->{cond} } } ] },
45     [ year => $bare_cond ],
46     [ title => $bare_cond ],
47     { -and => [ { year => { '=', $c->{cond} } }, { title => { '=', $c->{cond} } } ] },
48     { -and => { -or => { year => { '=', $c->{cond} } } }, -or => { title => $bare_cond } },
49   );
50
51   if (my $v = is_plain_value($c->{cond})) {
52     push @query_steps,
53       { year => $$v },
54       { title => $$v },
55       { -and => [ year => $$v, title => $$v ] },
56     ;
57   }
58
59   @query_steps = shuffle @query_steps;
60
61   $rs = $rs->search($_) for @query_steps;
62
63   my @bind = @{$c->{bind} || []};
64   {
65     no warnings 'misc';
66     splice @bind, 1, 0, [ { dbic_colname => "year", sqlt_datatype => "varchar", sqlt_size => 100 } => 'bar' ];
67   }
68
69   is_same_sql_bind (
70     $rs->as_query,
71     "(
72       SELECT me.title
73         FROM cd me
74       WHERE
75         ( genreid != 42 OR genreid IS NULL )
76           AND
77         ( genreid != 42 OR genreid IS NULL )
78           AND
79         title != bar
80           AND
81         title $c->{sql}
82           AND
83         year != ?
84           AND
85         year $c->{sql}
86     )",
87     \@bind,
88     'Double condition correctly collapsed for steps' . Dumper \@query_steps,
89   );
90 }
91
92 done_testing;