| ... | ... | 
                  @@ -1,3 +1,5 @@  | 
              
| 1 | 
                  +0.1697  | 
              |
| 2 | 
                  + - added EXPERIMENTAL map_param method  | 
              |
| 1 | 3 | 
                  0.1696  | 
              
| 2 | 4 | 
                  - added new argument format update, delete, select method where option  | 
              
| 3 | 5 | 
                  - create_query is DEPRECATED! use query option of each method instead.  | 
              
| ... | ... | 
                  @@ -1,7 +1,7 @@  | 
              
| 1 | 1 | 
                  package DBIx::Custom;  | 
              
| 2 | 2 | 
                  use Object::Simple -base;  | 
              
| 3 | 3 | 
                   | 
              
| 4 | 
                  -our $VERSION = '0.1696';  | 
              |
| 4 | 
                  +our $VERSION = '0.1670';  | 
              |
| 5 | 5 | 
                  use 5.008001;  | 
              
| 6 | 6 | 
                   | 
              
| 7 | 7 | 
                  use Carp 'croak';  | 
              
| ... | ... | 
                  @@ -590,6 +590,48 @@ sub include_model {
                 | 
              
| 590 | 590 | 
                  return $self;  | 
              
| 591 | 591 | 
                  }  | 
              
| 592 | 592 | 
                   | 
              
| 593 | 
                  +sub map_param {
                 | 
              |
| 594 | 
                  + my $self = shift;  | 
              |
| 595 | 
                  + my $param = shift;  | 
              |
| 596 | 
                  + my %map = @_;  | 
              |
| 597 | 
                  +  | 
              |
| 598 | 
                  + # Mapping  | 
              |
| 599 | 
                  +    my $map_param = {};
                 | 
              |
| 600 | 
                  +    foreach my $key (keys %map) {
                 | 
              |
| 601 | 
                  + my $value_cb;  | 
              |
| 602 | 
                  + my $condition;  | 
              |
| 603 | 
                  + my $map_key;  | 
              |
| 604 | 
                  +  | 
              |
| 605 | 
                  + # Get mapping information  | 
              |
| 606 | 
                  +        if (ref $map{$key} eq 'ARRAY') {
                 | 
              |
| 607 | 
                  +            foreach my $some (@{$map{$key}}) {
                 | 
              |
| 608 | 
                  + $map_key = $some unless ref $some;  | 
              |
| 609 | 
                  +                $condition = $some->{if} if ref $some eq 'HASH';
                 | 
              |
| 610 | 
                  + $value_cb = $some if ref $some eq 'CODE';  | 
              |
| 611 | 
                  + }  | 
              |
| 612 | 
                  + }  | 
              |
| 613 | 
                  +        else {
                 | 
              |
| 614 | 
                  +            $map_key = $map{$key};
                 | 
              |
| 615 | 
                  + }  | 
              |
| 616 | 
                  +        $value_cb ||= sub { $_[0] };
                 | 
              |
| 617 | 
                  +        $condition ||= sub { defined $_[0] && length $_[0] };
                 | 
              |
| 618 | 
                  +  | 
              |
| 619 | 
                  + # Map parameter  | 
              |
| 620 | 
                  + my $value;  | 
              |
| 621 | 
                  +        if (ref $condition eq 'CODE') {
                 | 
              |
| 622 | 
                  +            $map_param->{$map_key} = $value_cb->($param->{$key})
                 | 
              |
| 623 | 
                  +              if $condition->($param->{$key});
                 | 
              |
| 624 | 
                  + }  | 
              |
| 625 | 
                  +        elsif ($condition eq 'exists') {
                 | 
              |
| 626 | 
                  +            $map_param->{$map_key} = $value_cb->($param->{$key})
                 | 
              |
| 627 | 
                  +              if exists $param->{$key};
                 | 
              |
| 628 | 
                  + }  | 
              |
| 629 | 
                  +        else { croak qq/Condition must be code reference or "exists" / . _subname }
                 | 
              |
| 630 | 
                  + }  | 
              |
| 631 | 
                  +  | 
              |
| 632 | 
                  + return $map_param;  | 
              |
| 633 | 
                  +}  | 
              |
| 634 | 
                  +  | 
              |
| 593 | 635 | 
                   sub merge_param {
                 | 
              
| 594 | 636 | 
                  my ($self, @params) = @_;  | 
              
| 595 | 637 | 
                   | 
              
| ... | ... | 
                  @@ -2337,6 +2379,54 @@ You can get model object by C<model>.  | 
              
| 2337 | 2379 | 
                   | 
              
| 2338 | 2380 | 
                  See L<DBIx::Custom::Model> to know model features.  | 
              
| 2339 | 2381 | 
                   | 
              
| 2382 | 
                  +=head2 C<map_param> EXPERIMENTAL  | 
              |
| 2383 | 
                  +  | 
              |
| 2384 | 
                  + my $map_param = $dbi->map_param(  | 
              |
| 2385 | 
                  +        {id => 1, authro => 'Ken', price => 1900},
                 | 
              |
| 2386 | 
                  + 'id' => 'book.id',  | 
              |
| 2387 | 
                  +        'author' => ['book.author' => sub { '%' . $_[0] . '%' }],
                 | 
              |
| 2388 | 
                  + 'price' => [  | 
              |
| 2389 | 
                  +            'book.price', {if => sub { length $_[0] }}
                 | 
              |
| 2390 | 
                  + ]  | 
              |
| 2391 | 
                  + );  | 
              |
| 2392 | 
                  +  | 
              |
| 2393 | 
                  +Map paramters to other key and value. First argument is original  | 
              |
| 2394 | 
                  +parameter. this is hash reference. Rest argument is mapping.  | 
              |
| 2395 | 
                  +By default, Mapping is done if the value length is not zero.  | 
              |
| 2396 | 
                  +  | 
              |
| 2397 | 
                  +=over 4  | 
              |
| 2398 | 
                  +  | 
              |
| 2399 | 
                  +=item Key mapping  | 
              |
| 2400 | 
                  +  | 
              |
| 2401 | 
                  + 'id' => 'book.id'  | 
              |
| 2402 | 
                  +  | 
              |
| 2403 | 
                  +This is only key mapping. Value is same as original one.  | 
              |
| 2404 | 
                  +  | 
              |
| 2405 | 
                  +    (id => 1) is mapped to ('book.id' => 1) if value length is not zero.
                 | 
              |
| 2406 | 
                  +  | 
              |
| 2407 | 
                  +=item Key and value mapping  | 
              |
| 2408 | 
                  +  | 
              |
| 2409 | 
                  +    'author' => ['book.author' => sub { '%' . $_[0] . '%' }]
                 | 
              |
| 2410 | 
                  +  | 
              |
| 2411 | 
                  +This is key and value mapping. Frist element of array reference  | 
              |
| 2412 | 
                  +is mapped key name, second element is code reference to map the value.  | 
              |
| 2413 | 
                  +  | 
              |
| 2414 | 
                  +    (author => 'Ken') is mapped to ('book.author' => '%Ken%')
                 | 
              |
| 2415 | 
                  + if value length is not zero.  | 
              |
| 2416 | 
                  +  | 
              |
| 2417 | 
                  +=item Condition  | 
              |
| 2418 | 
                  +  | 
              |
| 2419 | 
                  +    'price' => ['book.price', {if => 'exists'}]
                 | 
              |
| 2420 | 
                  +    'price' => ['book.price', sub { '%' . $_[0] . '%' }, {if => 'exists'}]
                 | 
              |
| 2421 | 
                  +    'price' => ['book.price', {if => sub { defined shift }}]
                 | 
              |
| 2422 | 
                  +  | 
              |
| 2423 | 
                  +If you need condition, you can sepecify it. this is code reference  | 
              |
| 2424 | 
                  +or 'exists'. By default, condition is the following one.  | 
              |
| 2425 | 
                  +  | 
              |
| 2426 | 
                  +    sub { defined $_[0] && length $_[0] }
                 | 
              |
| 2427 | 
                  +  | 
              |
| 2428 | 
                  +=back  | 
              |
| 2429 | 
                  +  | 
              |
| 2340 | 2430 | 
                  =head2 C<merge_param>  | 
              
| 2341 | 2431 | 
                   | 
              
| 2342 | 2432 | 
                       my $param = $dbi->merge_param({key1 => 1}, {key1 => 1, key2 => 2});
                 | 
              
| ... | ... | 
                  @@ -3204,4 +3204,48 @@ is($dbi->separator, '__');  | 
              
| 3204 | 3204 | 
                   eval { $dbi->separator('?') };
                 | 
              
| 3205 | 3205 | 
                  like($@, qr/Separator/);  | 
              
| 3206 | 3206 | 
                   | 
              
| 3207 | 
                  +  | 
              |
| 3208 | 
                  +test 'map_param';  | 
              |
| 3209 | 
                  +$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
                 | 
              |
| 3210 | 
                  +$param = $dbi->map_param(  | 
              |
| 3211 | 
                  +    {id => 1, author => 'Ken', price => 1900},
                 | 
              |
| 3212 | 
                  + id => 'book.id',  | 
              |
| 3213 | 
                  +    author => ['book.author', sub { '%' . $_[0] . '%' }],
                 | 
              |
| 3214 | 
                  +    price => ['book.price', {if => sub { $_[0] eq 1900 }}]
                 | 
              |
| 3215 | 
                  +);  | 
              |
| 3216 | 
                  +is_deeply($param, {'book.id' => 1, 'book.author' => '%Ken%',
                 | 
              |
| 3217 | 
                  + 'book.price' => 1900});  | 
              |
| 3218 | 
                  +  | 
              |
| 3219 | 
                  +$param = $dbi->map_param(  | 
              |
| 3220 | 
                  +    {id => 0, author => 0, price => 0},
                 | 
              |
| 3221 | 
                  + id => 'book.id',  | 
              |
| 3222 | 
                  +    author => ['book.author', sub { '%' . $_[0] . '%' }],
                 | 
              |
| 3223 | 
                  +    price => ['book.price', sub { '%' . $_[0] . '%' },
                 | 
              |
| 3224 | 
                  +      {if => sub { $_[0] eq 0 }}]
                 | 
              |
| 3225 | 
                  +);  | 
              |
| 3226 | 
                  +is_deeply($param, {'book.id' => 0, 'book.author' => '%0%', 'book.price' => '%0%'});
                 | 
              |
| 3227 | 
                  +  | 
              |
| 3228 | 
                  +$param = $dbi->map_param(  | 
              |
| 3229 | 
                  +    {id => '', author => '', price => ''},
                 | 
              |
| 3230 | 
                  + id => 'book.id',  | 
              |
| 3231 | 
                  +    author => ['book.author', sub { '%' . $_[0] . '%' }],
                 | 
              |
| 3232 | 
                  +    price => ['book.price', sub { '%' . $_[0] . '%' },
                 | 
              |
| 3233 | 
                  +      {if => sub { $_[0] eq 1 }}]
                 | 
              |
| 3234 | 
                  +);  | 
              |
| 3235 | 
                  +is_deeply($param, {});
                 | 
              |
| 3236 | 
                  +  | 
              |
| 3237 | 
                  +$param = $dbi->map_param(  | 
              |
| 3238 | 
                  +    {id => undef, author => undef, price => undef},
                 | 
              |
| 3239 | 
                  + id => 'book.id',  | 
              |
| 3240 | 
                  +    price => ['book.price', {if => 'exists'}]
                 | 
              |
| 3241 | 
                  +);  | 
              |
| 3242 | 
                  +is_deeply($param, {'book.price' => undef});
                 | 
              |
| 3243 | 
                  +  | 
              |
| 3244 | 
                  +$param = $dbi->map_param(  | 
              |
| 3245 | 
                  +    {price => 'a'},
                 | 
              |
| 3246 | 
                  +    id => ['book.id', {if => 'exists'}],
                 | 
              |
| 3247 | 
                  +    price => ['book.price', sub { '%' . $_[0] }, {if => 'exists'}]
                 | 
              |
| 3248 | 
                  +);  | 
              |
| 3249 | 
                  +is_deeply($param, {'book.price' => '%a'});
                 | 
              |
| 3250 | 
                  +  | 
              |
| 3207 | 3251 | 
                  =cut  |