... | ... |
@@ -14,6 +14,7 @@ use DBIx::Custom::Model; |
14 | 14 |
use DBIx::Custom::Tag; |
15 | 15 |
use DBIx::Custom::Order; |
16 | 16 |
use DBIx::Custom::Util qw/_array_to_hash _subname/; |
17 |
+use DBIx::Custom::Mapper; |
|
17 | 18 |
use Encode qw/encode encode_utf8 decode_utf8/; |
18 | 19 |
use Scalar::Util qw/weaken/; |
19 | 20 |
|
... | ... |
@@ -1,13 +1,16 @@ |
1 | 1 |
package DBIx::Custom::Mapper; |
2 | 2 |
use Object::Simple -base; |
3 | 3 |
|
4 |
+use Carp 'croak'; |
|
4 | 5 |
use DBIx::Custom::Util '_subname'; |
5 | 6 |
|
6 | 7 |
# Carp trust relationship |
7 | 8 |
push @DBIx::Custom::CARP_NOT, __PACKAGE__; |
8 | 9 |
|
9 |
-has [qw/param pass/] |
|
10 |
- condition => sub { defined $_[0] && length $_[0] }; |
|
10 |
+has [qw/param pass/], |
|
11 |
+ condition => sub { |
|
12 |
+ sub { defined $_[0] && length $_[0] } |
|
13 |
+ }; |
|
11 | 14 |
|
12 | 15 |
sub map { |
13 | 16 |
my ($self, %rule) = @_; |
... | ... |
@@ -25,7 +28,7 @@ sub map { |
25 | 28 |
if (ref $rule{$key} eq 'ARRAY') { |
26 | 29 |
foreach my $some (@{$rule{$key}}) { |
27 | 30 |
$new_key = $some unless ref $some; |
28 |
- $condition = $some->{if} if ref $some eq 'HASH'; |
|
31 |
+ $condition = $some->{condition} if ref $some eq 'HASH'; |
|
29 | 32 |
$value_cb = $some if ref $some eq 'CODE'; |
30 | 33 |
} |
31 | 34 |
} |
... | ... |
@@ -2597,6 +2597,52 @@ $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
2597 | 2597 |
$rows = $dbi->select(prefix => "$key1,", column => $key2, table => $table1)->all; |
2598 | 2598 |
is_deeply($rows, [{$key1 => 1, $key2 => 2}], "table"); |
2599 | 2599 |
|
2600 |
+test 'mapper'; |
|
2601 |
+$DB::single = 1; |
|
2602 |
+$dbi = DBIx::Custom->connect; |
|
2603 |
+$param = $dbi->mapper(param => {id => 1, author => 'Ken', price => 1900})->map( |
|
2604 |
+ id => "$table1.id", |
|
2605 |
+ author => ["$table1.author", sub { '%' . $_[0] . '%' }], |
|
2606 |
+ price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}] |
|
2607 |
+); |
|
2608 |
+is_deeply($param, {"$table1.id" => 1, "$table1.author" => '%Ken%', |
|
2609 |
+ "$table1.price" => 1900}); |
|
2610 |
+ |
|
2611 |
+$param = $dbi->mapper(param => {id => 0, author => 0, price => 0})->map( |
|
2612 |
+ id => "$table1.id", |
|
2613 |
+ author => ["$table1.author", sub { '%' . $_[0] . '%' }], |
|
2614 |
+ price => ["$table1.price", sub { '%' . $_[0] . '%' }, |
|
2615 |
+ {condition => sub { $_[0] eq 0 }}] |
|
2616 |
+); |
|
2617 |
+is_deeply($param, {"$table1.id" => 0, "$table1.author" => '%0%', "$table1.price" => '%0%'}); |
|
2618 |
+ |
|
2619 |
+$param = $dbi->mapper(param => {id => '', author => '', price => ''})->map( |
|
2620 |
+ id => "$table1.id", |
|
2621 |
+ author => ["$table1.author", sub { '%' . $_[0] . '%' }], |
|
2622 |
+ price => ["$table1.price", sub { '%' . $_[0] . '%' }, |
|
2623 |
+ {condition => sub { $_[0] eq 1 }}] |
|
2624 |
+); |
|
2625 |
+is_deeply($param, {}); |
|
2626 |
+ |
|
2627 |
+$DB::single = 1; |
|
2628 |
+$param = $dbi->mapper(param => {id => undef, author => undef, price => undef})->map( |
|
2629 |
+ id => "$table1.id", |
|
2630 |
+ price => ["$table1.price", {condition => 'exists'}] |
|
2631 |
+); |
|
2632 |
+is_deeply($param, {"$table1.price" => undef}); |
|
2633 |
+ |
|
2634 |
+$param = $dbi->mapper(param => {price => 'a'})->map( |
|
2635 |
+ id => ["$table1.id", {condition => 'exists'}], |
|
2636 |
+ price => ["$table1.price", sub { '%' . $_[0] }, {condition => 'exists'}] |
|
2637 |
+); |
|
2638 |
+is_deeply($param, {"$table1.price" => '%a'}); |
|
2639 |
+ |
|
2640 |
+$param = $dbi->mapper(param => {price => 'a'}, condition => 'exists')->map( |
|
2641 |
+ id => ["$table1.id"], |
|
2642 |
+ price => ["$table1.price", sub { '%' . $_[0] }] |
|
2643 |
+); |
|
2644 |
+is_deeply($param, {"$table1.price" => '%a'}); |
|
2645 |
+ |
|
2600 | 2646 |
test 'map_param'; |
2601 | 2647 |
$dbi = DBIx::Custom->connect; |
2602 | 2648 |
$param = $dbi->map_param( |