... | ... |
@@ -724,7 +724,8 @@ sub new { |
724 | 724 |
return $self; |
725 | 725 |
} |
726 | 726 |
|
727 |
-sub not_exists { bless {}, 'DBIx::Custom::NotExists' } |
|
727 |
+my $not_exists = bless {}, 'DBIx::Custom::NotExists'; |
|
728 |
+sub not_exists { $not_exists } |
|
728 | 729 |
|
729 | 730 |
sub order { |
730 | 731 |
my $self = shift; |
... | ... |
@@ -55,6 +55,7 @@ sub _map_param { |
55 | 55 |
|
56 | 56 |
$value_cb ||= sub { $_[0] }; |
57 | 57 |
$condition ||= $self->if || 'exists'; |
58 |
+ $condition = $self->_if_to_sub($condition); |
|
58 | 59 |
|
59 | 60 |
# Map parameter |
60 | 61 |
my $value; |
... | ... |
@@ -97,15 +98,7 @@ sub if { |
97 | 98 |
if (@_) { |
98 | 99 |
my $if = $_[0]; |
99 | 100 |
|
100 |
- $if = $if eq 'exists' ? $if |
|
101 |
- : $if eq 'defined' ? sub { defined $_[0] } |
|
102 |
- : $if eq 'length' ? sub { defined $_[0] && length $_[0] } |
|
103 |
- : ref $if eq 'CODE' ? $if |
|
104 |
- : undef; |
|
105 |
- |
|
106 |
- croak "You can must specify right value to C<if> " . _subname |
|
107 |
- unless $if; |
|
108 |
- |
|
101 |
+ $if = $self->_if_to_sub($if); |
|
109 | 102 |
$self->{if} = $if; |
110 | 103 |
return $self; |
111 | 104 |
} |
... | ... |
@@ -113,6 +106,20 @@ sub if { |
113 | 106 |
return $self->{if}; |
114 | 107 |
} |
115 | 108 |
|
109 |
+sub _if_to_sub { |
|
110 |
+ my ($self, $if) = @_; |
|
111 |
+ $if = $if eq 'exists' ? $if |
|
112 |
+ : $if eq 'defined' ? sub { defined $_[0] } |
|
113 |
+ : $if eq 'length' ? sub { defined $_[0] && length $_[0] } |
|
114 |
+ : ref $if eq 'CODE' ? $if |
|
115 |
+ : undef; |
|
116 |
+ |
|
117 |
+ croak "You can must specify right value to C<if> " . _subname |
|
118 |
+ unless $if; |
|
119 |
+ |
|
120 |
+ return $if; |
|
121 |
+} |
|
122 |
+ |
|
116 | 123 |
sub new { |
117 | 124 |
my $self = shift->SUPER::new(@_); |
118 | 125 |
|
... | ... |
@@ -1337,6 +1337,36 @@ $where->map( |
1337 | 1337 |
); |
1338 | 1338 |
is_deeply($where->param, {'book.price' => '%a'}); |
1339 | 1339 |
|
1340 |
+$where = $dbi->where; |
|
1341 |
+$where->param({id => [1, 2], author => 'Ken', price => 1900}); |
|
1342 |
+$where->map( |
|
1343 |
+ id => 'book.id', |
|
1344 |
+ author => ['book.author', sub { '%' . $_[0] . '%' }], |
|
1345 |
+ price => ['book.price', {if => sub { $_[0] eq 1900 }}] |
|
1346 |
+); |
|
1347 |
+is_deeply($where->param, {'book.id' => [1, 2], 'book.author' => '%Ken%', |
|
1348 |
+ 'book.price' => 1900}); |
|
1349 |
+ |
|
1350 |
+$where = $dbi->where; |
|
1351 |
+$where->if('length'); |
|
1352 |
+$where->param({id => ['', ''], author => 'Ken', price => 1900}); |
|
1353 |
+$where->map( |
|
1354 |
+ id => 'book.id', |
|
1355 |
+ author => ['book.author', sub { '%' . $_[0] . '%' }], |
|
1356 |
+ price => ['book.price', {if => sub { $_[0] eq 1900 }}] |
|
1357 |
+); |
|
1358 |
+is_deeply($where->param, {'book.id' => [$dbi->not_exists, $dbi->not_exists], 'book.author' => '%Ken%', |
|
1359 |
+ 'book.price' => 1900}); |
|
1360 |
+ |
|
1361 |
+$where = $dbi->where; |
|
1362 |
+$where->param({id => ['', ''], author => 'Ken', price => 1900}); |
|
1363 |
+$where->map( |
|
1364 |
+ id => ['book.id', {if => 'length'}], |
|
1365 |
+ author => ['book.author', sub { '%' . $_[0] . '%' }, {if => 'defined'}], |
|
1366 |
+ price => ['book.price', {if => sub { $_[0] eq 1900 }}] |
|
1367 |
+); |
|
1368 |
+is_deeply($where->param, {'book.id' => [$dbi->not_exists, $dbi->not_exists], 'book.author' => '%Ken%', |
|
1369 |
+ 'book.price' => 1900}); |
|
1340 | 1370 |
|
1341 | 1371 |
test 'dbi_option default'; |
1342 | 1372 |
$dbi = DBIx::Custom->new; |