Showing 3 changed files with 88 additions and 63 deletions
+3
Changes
... ...
@@ -1,4 +1,7 @@
1 1
 0.1728
2
+    
3
+    - added {key => ..., value => ...} syntax to DBIx::Custom::Mapper map method
4
+      ,and argument of string and code reference is DEPRECATED!
2 5
     - update_param is DEPRECATED, use assing_clause instead.
3 6
     - assing_param is renamed to assing_clause, assing_param is DEPRECATED!
4 7
     - insert_param is renamed to values_clause, insert_param is DEPRECATED!
+44 -23
lib/DBIx/Custom/Mapper.pm
... ...
@@ -18,30 +18,45 @@ has [qw/param/],
18 18
 sub map {
19 19
     my ($self, %rule) = @_;
20 20
     my $param = $self->param;
21
-    $rule{$_} = $rule{$_} for @{$self->pass};
21
+    $rule{$_} = {key => $_} for @{$self->pass};
22 22
     
23 23
     # Mapping
24 24
     my $new_param = {};
25 25
     foreach my $key (keys %rule) {
26 26
         
27
-        my $value_cb;
28
-        my $condition;
29
-        my $new_key;
27
+        my $mapping = $rule{$key};
30 28
         
31 29
         # Get mapping information
32
-        $rule{$key} = [$rule{$key}] if ref $rule{$key} ne 'ARRAY';
33
-        foreach my $some (@{$rule{$key}}) {
34
-            $new_key = $some unless ref $some;
35
-            $condition = $some->{condition} if ref $some eq 'HASH';
36
-            $value_cb = $some if ref $some eq 'CODE';
30
+        my $new_key;
31
+        my $value;
32
+        my $condition;
33
+        
34
+        if (ref $mapping eq 'ARRAY') {
35
+            $new_key = $mapping->[0];
36
+            $value = $mapping->[1];
37
+            $condition = $mapping->[2];
37 38
         }
39
+        elsif (ref $mapping eq 'HASH') {
40
+            $new_key = $mapping->{key};
41
+            $value = $mapping->{value};
42
+            $condition = $mapping->{condition};
43
+        }
44
+        elsif (!ref $mapping) {
45
+            $new_key = $mapping;
46
+            warn qq/map method's string value "$mapping" is DEPRECATED. / .
47
+                 qq/use {key => ...} syntax instead/
48
+        }
49
+        elsif (ref $mapping eq 'CODE') {
50
+            $value = $mapping;
51
+            warn qq/map method's code reference value "$mapping" is DEPRECATED. / .
52
+                 qq/use {value => ...} syntax instead/
53
+        }
54
+        
38 55
         $new_key = $key unless defined $new_key;
39
-        $value_cb ||= sub { $_[0] };
40 56
         $condition ||= $self->condition;
41 57
         $condition = $self->_condition_to_sub($condition);
42 58
 
43 59
         # Map parameter
44
-        my $value;
45 60
         if (ref $condition eq 'CODE') {
46 61
             if (ref $param->{$key} eq 'ARRAY') {
47 62
                 $new_param->{$new_key} = [];
... ...
@@ -52,8 +67,11 @@ sub map {
52 67
                 }
53 68
             }
54 69
             else {
55
-                $new_param->{$new_key} = $value_cb->($param->{$key})
56
-                  if $condition->($param->{$key});
70
+              if ($condition->($param->{$key})) {
71
+                  $new_param->{$new_key} = defined $value
72
+                                         ? $value->($param->{$key})
73
+                                         : $param->{$key};
74
+              }
57 75
             }
58 76
         }
59 77
         elsif ($condition eq 'exists') {
... ...
@@ -66,8 +84,11 @@ sub map {
66 84
                 }
67 85
             }
68 86
             else {
69
-                $new_param->{$new_key} = $value_cb->($param->{$key})
70
-                  if exists $param->{$key};
87
+                if (exists $param->{$key}) {
88
+                    $new_param->{$new_key} = defined $value
89
+                                           ? $value->($param->{$key})
90
+                                           : $param->{$key};
91
+                }
71 92
             }
72 93
         }
73 94
         else { croak qq/Condition must be code reference or "exists" / . _subname }
... ...
@@ -179,12 +200,12 @@ and implements the following new ones.
179 200
 =head2 C<map>
180 201
 
181 202
     my $new_param = $mapper->map(
182
-        price => 'book.price', # Key
183
-        title => sub { '%' . $_[0] . '%'}, # Value
184
-        author => ['book.author', sub { '%' . $_[0] . '%'}] # Key and value
203
+        price => {key => 'book.price'}
204
+        title => {value => sub { '%' . $_[0] . '%'}}
205
+        author => ['book.author' => sub { '%' . $_[0] . '%'}] # Key and value
185 206
     );
186 207
 
187
-Map C<param>'s key and value and return new parameter.
208
+Map C<param> into new parameter.
188 209
 
189 210
 For example, if C<param> is set to
190 211
 
... ...
@@ -217,15 +238,15 @@ You can set change mapping condition by C<condition> attribute.
217 238
 Or you can set C<condtion> option for each key.
218 239
 
219 240
     my $new_param = $mapper->map(
220
-        price => ['book.price', {condition => 'defined'}]
221
-        title => [sub { '%' . $_[0] . '%'}, {condition => 'defined'}] # Value
222
-        author => ['book.author', sub { '%' . $_[0] . '%'}, condtion => 'exists']
241
+        price => {key => 'book.price', condition => 'defined'}]
242
+        title => {value => sub { '%' . $_[0] . '%'}, condition => 'defined'}
243
+        author => ['book.author', sub { '%' . $_[0] . '%'}, 'exists']
223 244
     );
224 245
 
225 246
 If C<pass> attrivute is set, the keys and value is copied without change.
226 247
 
227 248
     $mapper->pass([qw/title author/]);
228
-    my $new_param = $mapper->map(price => 'book.price');
249
+    my $new_param = $mapper->map(price => {key => 'book.price'});
229 250
 
230 251
 The following hash reference
231 252
     
+41 -40
t/common.t
... ...
@@ -13,7 +13,7 @@ plan skip_all => $ENV{DBIX_CUSTOM_SKIP_MESSAGE} || 'common.t is always skipped'
13 13
 
14 14
 plan 'no_plan';
15 15
 
16
-#$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
16
+$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
17 17
 sub test { print "# $_[0]\n" }
18 18
 
19 19
 # Constant
... ...
@@ -2551,60 +2551,59 @@ is_deeply($rows, [{$key1 => 1, $key2 => 2}], "table");
2551 2551
 test 'mapper';
2552 2552
 $dbi = DBIx::Custom->connect;
2553 2553
 $param = $dbi->mapper(param => {id => 1, author => 'Ken', price => 1900})->map(
2554
-    id => "$table1.id",
2555
-    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2556
-    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2554
+    id => {key => "$table1.id"},
2555
+    author => ["$table1.author" => sub { '%' . $_[0] . '%' }],
2556
+    price => {key => "$table1.price", condition => sub { $_[0] eq 1900 }}
2557 2557
 );
2558 2558
 is_deeply($param, {"$table1.id" => 1, "$table1.author" => '%Ken%',
2559 2559
   "$table1.price" => 1900});
2560 2560
 
2561 2561
 $dbi = DBIx::Custom->connect;
2562 2562
 $param = $dbi->mapper(param => {id => 1, author => 'Ken', price => 1900})->map(
2563
-    id => "$table1.id",
2563
+    id => {key => "$table1.id"},
2564 2564
     author => ["$table1.author" => $dbi->like_value],
2565
-    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2565
+    price => {key => "$table1.price", condition => sub { $_[0] eq 1900 }}
2566 2566
 );
2567 2567
 is_deeply($param, {"$table1.id" => 1, "$table1.author" => '%Ken%',
2568 2568
   "$table1.price" => 1900});
2569 2569
 
2570 2570
 $param = $dbi->mapper(param => {id => 0, author => 0, price => 0})->map(
2571
-    id => "$table1.id",
2572
-    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2573
-    price => ["$table1.price", sub { '%' . $_[0] . '%' },
2574
-      {condition => sub { $_[0] eq 0 }}]
2571
+    id => {key => "$table1.id"},
2572
+    author => ["$table1.author" => sub { '%' . $_[0] . '%' }],
2573
+    price => ["$table1.price", sub { '%' . $_[0] . '%' }, sub { $_[0] eq 0 }]
2575 2574
 );
2576 2575
 is_deeply($param, {"$table1.id" => 0, "$table1.author" => '%0%', "$table1.price" => '%0%'});
2577 2576
 
2578 2577
 $param = $dbi->mapper(param => {id => '', author => '', price => ''})->map(
2579
-    id => "$table1.id",
2580
-    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2581
-    price => ["$table1.price", sub { '%' . $_[0] . '%' },
2582
-      {condition => sub { $_[0] eq 1 }}]
2578
+    id => {key => "$table1.id"},
2579
+    author => ["$table1.author" => sub { '%' . $_[0] . '%' }],
2580
+    price => ["$table1.price", sub { '%' . $_[0] . '%' }, sub { $_[0] eq 1 }]
2583 2581
 );
2584 2582
 is_deeply($param, {});
2585 2583
 
2586 2584
 $param = $dbi->mapper(param => {id => undef, author => undef, price => undef})->map(
2587
-    id => "$table1.id",
2588
-    price => ["$table1.price", {condition => 'exists'}]
2585
+    id => {key => "$table1.id"},
2586
+    price => {key => "$table1.price", condition => 'exists'}
2589 2587
 );
2590 2588
 is_deeply($param, {"$table1.price" => undef});
2591 2589
 
2592 2590
 $param = $dbi->mapper(param => {price => 'a'})->map(
2593
-    id => ["$table1.id", {condition => 'exists'}],
2594
-    price => ["$table1.price", sub { '%' . $_[0] }, {condition => 'exists'}]
2591
+    id => {key => "$table1.id", condition => 'exists'},
2592
+    price => ["$table1.price", sub { '%' . $_[0] }, 'exists']
2595 2593
 );
2596 2594
 is_deeply($param, {"$table1.price" => '%a'});
2597 2595
 
2598 2596
 $param = $dbi->mapper(param => {price => 'a'}, condition => 'exists')->map(
2599
-    id => ["$table1.id"],
2597
+    id => {key => "$table1.id"},
2600 2598
     price => ["$table1.price", sub { '%' . $_[0] }]
2601 2599
 );
2602 2600
 is_deeply($param, {"$table1.price" => '%a'});
2603 2601
 
2604
-$param = $dbi->mapper(param => {price => 'a'})->map(
2605
-    price => sub { '%' . $_[0] }
2602
+$param = $dbi->mapper(param => {price => 'a', author => 'b'})->map(
2603
+    price => sub { '%' . $_[0] },
2604
+    author => 'book.author'
2606 2605
 );
2607
-is_deeply($param, {price => '%a'});
2606
+is_deeply($param, {price => '%a', 'book.author' => 'b'});
2608 2607
 
2609 2608
 eval { $dbi->execute("drop table $table1") };
2610 2609
 $dbi->execute($create_table1);
... ...
@@ -2640,6 +2639,7 @@ $result = $dbi->execute("select * from $table1 $where", {$key1 => [0, 1]});
2640 2639
 $row = $result->all;
2641 2640
 is_deeply($row, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]);
2642 2641
 
2642
+
2643 2643
 $where = $dbi->where;
2644 2644
 $where->clause(['and', ":${key1}{=}"]);
2645 2645
 $param = $dbi->mapper(param => {$key1 => 0}, condition => 'length')
... ...
@@ -2666,6 +2666,7 @@ $result = $dbi->execute("select * from $table1 $where", {$key1 => 1});
2666 2666
 $row = $result->all;
2667 2667
 is_deeply($row, [{$key1 => 1, $key2 => 2}]);
2668 2668
 
2669
+
2669 2670
 $where = $dbi->where;
2670 2671
 $where->clause(['and', ":${key1}{=}"]);
2671 2672
 $param = $dbi->mapper(param => {$key1 => 7}, condition => sub { ($_[0] || '') eq 5 })->map;
... ...
@@ -2676,9 +2677,9 @@ is_deeply($row, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]);
2676 2677
 
2677 2678
 $where = $dbi->where;
2678 2679
 $param = $dbi->mapper(param => {id => 1, author => 'Ken', price => 1900})->map(
2679
-    id => "$table1.id",
2680
+    id => {key => "$table1.id"},
2680 2681
     author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2681
-    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2682
+    price => {key => "$table1.price", condition => sub { $_[0] eq 1900 }}
2682 2683
 );
2683 2684
 $where->param($param);
2684 2685
 is_deeply($where->param, {"$table1.id" => 1, "$table1.author" => '%Ken%',
... ...
@@ -2686,66 +2687,66 @@ is_deeply($where->param, {"$table1.id" => 1, "$table1.author" => '%Ken%',
2686 2687
 
2687 2688
 $where = $dbi->where;
2688 2689
 $param = $dbi->mapper(param => {id => 0, author => 0, price => 0})->map(
2689
-    id => "$table1.id",
2690
+    id => {key => "$table1.id"},
2690 2691
     author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2691
-    price => ["$table1.price", sub { '%' . $_[0] . '%' }, {condition => sub { $_[0] eq 0 }}]
2692
+    price => ["$table1.price", sub { '%' . $_[0] . '%' }, sub { $_[0] eq 0 }]
2692 2693
 );
2693 2694
 $where->param($param);
2694 2695
 is_deeply($where->param, {"$table1.id" => 0, "$table1.author" => '%0%', "$table1.price" => '%0%'});
2695 2696
 
2696 2697
 $where = $dbi->where;
2697 2698
 $param = $dbi->mapper(param => {id => '', author => '', price => ''})->map(
2698
-    id => "$table1.id",
2699
+    id => {key => "$table1.id"},
2699 2700
     author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2700
-    price => ["$table1.price", sub { '%' . $_[0] . '%' }, {condition => sub { $_[0] eq 1 }}]
2701
+    price => ["$table1.price", sub { '%' . $_[0] . '%' }, sub { $_[0] eq 1 }]
2701 2702
 );
2702 2703
 $where->param($param);
2703 2704
 is_deeply($where->param, {});
2704 2705
 
2705 2706
 $where = $dbi->where;
2706 2707
 $param = $dbi->mapper(param => {id => undef, author => undef, price => undef}, condition => 'exists')->map(
2707
-    id => "$table1.id",
2708
-    price => ["$table1.price", {condition => 'exists'}]
2708
+    id => {key => "$table1.id"},
2709
+    price => {key => "$table1.price", condition => 'exists'}
2709 2710
 );
2710 2711
 is_deeply($param, {"$table1.id"  => undef,"$table1.price" => undef});
2711 2712
 
2712 2713
 $where = $dbi->where;
2713 2714
 $param = $dbi->mapper(param => {price => 'a'})->map(
2714
-    id => ["$table1.id", {condition => 'exists'}],
2715
-    price => ["$table1.price", sub { '%' . $_[0] }, {condition => 'exists'}]
2715
+    id => {key => "$table1.id", condition => 'exists'},
2716
+    price => ["$table1.price", sub { '%' . $_[0] }, 'exists']
2716 2717
 );
2717 2718
 is_deeply($param, {"$table1.price" => '%a'});
2718 2719
 
2719 2720
 $where = $dbi->where;
2720 2721
 $param = $dbi->mapper(param => {id => [1, 2], author => 'Ken', price => 1900})->map(
2721
-    id => "$table1.id",
2722
+    id => {key => "$table1.id"},
2722 2723
     author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2723
-    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2724
+    price => {key => "$table1.price", condition => sub { $_[0] eq 1900 }}
2724 2725
 );
2725 2726
 is_deeply($param, {"$table1.id" => [1, 2], "$table1.author" => '%Ken%',
2726 2727
   "$table1.price" => 1900});
2727 2728
 
2728 2729
 $where = $dbi->where;
2729 2730
 $param = $dbi->mapper(param => {id => ['', ''], author => 'Ken', price => 1900}, condition => 'length')->map(
2730
-    id => "$table1.id",
2731
+    id => {key => "$table1.id"},
2731 2732
     author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2732
-    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2733
+    price => {key => "$table1.price", condition => sub { $_[0] eq 1900 }}
2733 2734
 );
2734 2735
 is_deeply($param, {"$table1.id" => [$dbi->not_exists, $dbi->not_exists], "$table1.author" => '%Ken%',
2735 2736
   "$table1.price" => 1900});
2736 2737
 
2737 2738
 $where = $dbi->where;
2738 2739
 $param = $dbi->mapper(param => {id => ['', ''], author => 'Ken', price => 1900})->map(
2739
-    id => ["$table1.id", {condition => 'length'}],
2740
-    author => ["$table1.author", sub { '%' . $_[0] . '%' }, {condition => 'defined'}],
2741
-    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2740
+    id => {key => "$table1.id", condition => 'length'},
2741
+    author => ["$table1.author", sub { '%' . $_[0] . '%' }, 'defined'],
2742
+    price => {key => "$table1.price", condition => sub { $_[0] eq 1900 }}
2742 2743
 );
2743 2744
 is_deeply($param, {"$table1.id" => [$dbi->not_exists, $dbi->not_exists], "$table1.author" => '%Ken%',
2744 2745
   "$table1.price" => 1900});
2745 2746
 
2746 2747
 $where = $dbi->where;
2747 2748
 $param = $dbi->mapper(param => {id => 'a', author => 'b', price => 'c'}, pass => [qw/id author/])
2748
-  ->map(price => 'book.price');
2749
+  ->map(price => {key => 'book.price'});
2749 2750
 is_deeply($param, {id => 'a', author => 'b', 'book.price' => 'c'});
2750 2751
 
2751 2752
 test 'order';