... | ... |
@@ -15,8 +15,10 @@ has [qw/dbi param/], |
15 | 15 |
sub map { |
16 | 16 |
my ($self, %map) = @_; |
17 | 17 |
|
18 |
- my $param = $self->_map_param($self->param, %map); |
|
19 |
- $self->param($param); |
|
18 |
+ if ($self->if ne 'exists' || keys %map) { |
|
19 |
+ my $param = $self->_map_param($self->param, %map); |
|
20 |
+ $self->param($param); |
|
21 |
+ } |
|
20 | 22 |
return $self; |
21 | 23 |
} |
22 | 24 |
|
... | ... |
@@ -97,7 +99,7 @@ sub if { |
97 | 99 |
|
98 | 100 |
$if = $if eq 'exists' ? $if |
99 | 101 |
: $if eq 'defined' ? sub { defined $_[0] } |
100 |
- : $if eq 'length' ? sub { length $_[0] } |
|
102 |
+ : $if eq 'length' ? sub { defined $_[0] && length $_[0] } |
|
101 | 103 |
: ref $if eq 'CODE' ? $if |
102 | 104 |
: undef; |
103 | 105 |
|
... | ... |
@@ -1289,6 +1289,54 @@ $result = $dbi->execute("select * from table1 $where", {key1 => 1}); |
1289 | 1289 |
$row = $result->all; |
1290 | 1290 |
is_deeply($row, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}]); |
1291 | 1291 |
|
1292 |
+$where = $dbi->where; |
|
1293 |
+$where->param({id => 1, author => 'Ken', price => 1900}); |
|
1294 |
+$where->map(id => 'book.id', |
|
1295 |
+ author => ['book.author', sub { '%' . $_[0] . '%' }], |
|
1296 |
+ price => ['book.price', {if => sub { $_[0] eq 1900 }}] |
|
1297 |
+); |
|
1298 |
+is_deeply($where->param, {'book.id' => 1, 'book.author' => '%Ken%', |
|
1299 |
+ 'book.price' => 1900}); |
|
1300 |
+ |
|
1301 |
+$where = $dbi->where; |
|
1302 |
+$where->param({id => 0, author => 0, price => 0}); |
|
1303 |
+$where->map( |
|
1304 |
+ id => 'book.id', |
|
1305 |
+ author => ['book.author', sub { '%' . $_[0] . '%' }], |
|
1306 |
+ price => ['book.price', sub { '%' . $_[0] . '%' }, |
|
1307 |
+ {if => sub { $_[0] eq 0 }}] |
|
1308 |
+); |
|
1309 |
+is_deeply($where->param, {'book.id' => 0, 'book.author' => '%0%', 'book.price' => '%0%'}); |
|
1310 |
+ |
|
1311 |
+$where = $dbi->where; |
|
1312 |
+$where->param({id => '', author => '', price => ''}); |
|
1313 |
+$where->if('length'); |
|
1314 |
+$where->map( |
|
1315 |
+ id => 'book.id', |
|
1316 |
+ author => ['book.author', sub { '%' . $_[0] . '%' }], |
|
1317 |
+ price => ['book.price', sub { '%' . $_[0] . '%' }, |
|
1318 |
+ {if => sub { $_[0] eq 1 }}] |
|
1319 |
+); |
|
1320 |
+is_deeply($where->param, {}); |
|
1321 |
+ |
|
1322 |
+$where = $dbi->where; |
|
1323 |
+$where->param({id => undef, author => undef, price => undef}); |
|
1324 |
+$where->if('length'); |
|
1325 |
+$where->map( |
|
1326 |
+ id => 'book.id', |
|
1327 |
+ price => ['book.price', {if => 'exists'}] |
|
1328 |
+); |
|
1329 |
+is_deeply($where->param, {'book.price' => undef}); |
|
1330 |
+ |
|
1331 |
+$where = $dbi->where; |
|
1332 |
+$where->param({price => 'a'}); |
|
1333 |
+$where->if('length'); |
|
1334 |
+$where->map( |
|
1335 |
+ id => ['book.id', {if => 'exists'}], |
|
1336 |
+ price => ['book.price', sub { '%' . $_[0] }, {if => 'exists'}] |
|
1337 |
+); |
|
1338 |
+is_deeply($where->param, {'book.price' => '%a'}); |
|
1339 |
+ |
|
1292 | 1340 |
|
1293 | 1341 |
test 'dbi_option default'; |
1294 | 1342 |
$dbi = DBIx::Custom->new; |