Showing 3 changed files with 137 additions and 1 deletions
+2
Changes
... ...
@@ -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.
+91 -1
lib/DBIx/Custom.pm
... ...
@@ -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});
+44
t/dbix-custom-core-sqlite.t
... ...
@@ -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