Showing 5 changed files with 204 additions and 19 deletions
+3
Changes
... ...
@@ -1,3 +1,6 @@
1
+0.1722
2
+    - added EXPERIMENTAL pass attribute to DBIx::Custom::Mapper
3
+    - removed EXPERIMENTAL ignore attribute from DBIx::Custom::Mapper
1 4
 0.1721
2 5
     - added EXPERIMENTAL DBIx::Custom::Mapper class
3 6
     - added EXPERIMENTAL mapper method to DBIx::Custom
+9 -3
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.1721';
4
+our $VERSION = '0.1722';
5 5
 use 5.008001;
6 6
 
7 7
 use Carp 'croak';
... ...
@@ -15,6 +15,7 @@ use DBIx::Custom::Tag;
15 15
 use DBIx::Custom::Order;
16 16
 use DBIx::Custom::Util qw/_array_to_hash _subname/;
17 17
 use DBIx::Custom::Mapper;
18
+use DBIx::Custom::NotExists;
18 19
 use Encode qw/encode encode_utf8 decode_utf8/;
19 20
 use Scalar::Util qw/weaken/;
20 21
 
... ...
@@ -854,8 +855,7 @@ sub new {
854 855
     return $self;
855 856
 }
856 857
 
857
-my $not_exists = bless {}, 'DBIx::Custom::NotExists';
858
-sub not_exists { $not_exists }
858
+sub not_exists { DBIx::Custom::NotExists->singleton }
859 859
 
860 860
 sub order {
861 861
     my $self = shift;
... ...
@@ -2844,6 +2844,12 @@ You can get model object by C<model>.
2844 2844
 
2845 2845
 See L<DBIx::Custom::Model> to know model features.
2846 2846
 
2847
+=head2 C<mapper EXPERIMETNAL>
2848
+
2849
+    my $mapper = $dbi->mapper(param => $param);
2850
+
2851
+Create a new L<DBIx::Custom::Mapper> object.
2852
+
2847 2853
 =head2 C<map_param> EXPERIMENTAL
2848 2854
 
2849 2855
     my $map_param = $dbi->map_param(
+23 -14
lib/DBIx/Custom/Mapper.pm
... ...
@@ -1,25 +1,29 @@
1 1
 package DBIx::Custom::Mapper;
2 2
 use Object::Simple -base;
3 3
 
4
+use DBIx::Custom::NotExists;
5
+
4 6
 use Carp 'croak';
5 7
 use DBIx::Custom::Util '_subname';
6 8
 
7 9
 # Carp trust relationship
8 10
 push @DBIx::Custom::CARP_NOT, __PACKAGE__;
9 11
 
10
-has [qw/param pass/],
12
+has [qw/param/],
11 13
     condition => sub {
12 14
         sub { defined $_[0] && length $_[0] }
13
-    };
15
+    },
16
+    pass => sub { [] };
14 17
 
15 18
 sub map {
16 19
     my ($self, %rule) = @_;
17 20
     my $param = $self->param;
21
+    $rule{$_} = $rule{$_} for @{$self->pass};
18 22
     
19 23
     # Mapping
20 24
     my $new_param = {};
21
-    foreach my $key (keys %$param) {
22
-    
25
+    foreach my $key (keys %rule) {
26
+        
23 27
         my $value_cb;
24 28
         my $condition;
25 29
         my $new_key;
... ...
@@ -51,7 +55,7 @@ sub map {
51 55
                 for (my $i = 0; $i < @{$param->{$key}}; $i++) {
52 56
                     $new_param->{$new_key}->[$i]
53 57
                       = $condition->($param->{$key}->[$i]) ? $param->{$key}->[$i]
54
-                      : $self->dbi->not_exists;
58
+                      : DBIx::Custom::NotExists->singleton;
55 59
                 }
56 60
             }
57 61
             else {
... ...
@@ -65,7 +69,7 @@ sub map {
65 69
                 for (my $i = 0; $i < @{$param->{$key}}; $i++) {
66 70
                     $new_param->{$new_key}->[$i]
67 71
                       = exists $param->{$key}->[$i] ? $param->{$key}->[$i]
68
-                      : $self->dbi->not_exists;
72
+                      : DBIx::Custom::NotExists->singleton;
69 73
                 }
70 74
             }
71 75
             else {
... ...
@@ -131,12 +135,12 @@ DBIx::Custom::Mapper - Mapper of parameter EXPERIMENTAL
131 135
 
132 136
 Parameter.
133 137
 
134
-=head2 C<ignore>
138
+=head2 C<pass>
135 139
 
136
-    my $pass = $mapper->ignore;
137
-    $mapper = $mapper->ignore([qw/title author/]);
140
+    my $pass = $mapper->pass;
141
+    $mapper = $mapper->pass([qw/title author/]);
138 142
 
139
-Ignored parameter keys when C<map> method is executed.
143
+the key and value is copied without change when C<map> method is executed.
140 144
 
141 145
 =head2 C<condition>
142 146
 
... ...
@@ -204,7 +208,6 @@ The following hash reference is returned.
204 208
         'book.price' => 1900,
205 209
         title => '%Perl%',
206 210
         'book.author' => '%Ken%',
207
-        issude_date => '2010-11-11'
208 211
     }
209 212
 
210 213
 By default, If the value has length, key and value is mapped.
... ...
@@ -226,11 +229,17 @@ Or you can set C<condtion> option for each key.
226 229
         author => ['book.author', sub { '%' . $_[0] . '%'}, condtion => 'exists']
227 230
     );
228 231
 
229
-If C<ignore> is set, the keys is ignored.
232
+If C<pass> attrivute is set, the keys and value is copied without change.
230 233
 
231
-    $mapper->ignore([qw/title author/]);
234
+    $mapper->pass([qw/title author/]);
235
+    my $new_param = $mapper->map(price => 'book.price');
236
+
237
+The following hash reference
232 238
     
233 239
     {title => 'Perl', author => 'Ken', price => 1900}
234
-      is mapped to {price => 1900}
240
+
241
+is mapped to
242
+
243
+    {title => 'Perl', author => 'Ken', 'book.price' => 1900}
235 244
 
236 245
 =cut
+26
lib/DBIx/Custom/NotExists.pm
... ...
@@ -0,0 +1,26 @@
1
+package DBIx::Custom::NotExists;
2
+
3
+use strict;
4
+use warnings;
5
+
6
+my $not_exists = bless {}, 'DBIx::Custom::NotExists';
7
+
8
+sub singleton { $not_exists }
9
+
10
+=head1 NAME
11
+
12
+DBIx::Custom::NotExists
13
+
14
+=head1 SYNOPSYS
15
+
16
+    $not_exists = DBIx::Custom::NotExists->singleton;
17
+
18
+=head1 METHODS
19
+
20
+=head2 C<singleton>
21
+
22
+    $not_exists = DBIx::Custom::NotExists->singleton;
23
+
24
+L<DBIx::Custom::NotExists> singleton object.
25
+
26
+=cut
+143 -2
t/common.t
... ...
@@ -2597,8 +2597,8 @@ $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
+
2600 2601
 test 'mapper';
2601
-$DB::single = 1;
2602 2602
 $dbi = DBIx::Custom->connect;
2603 2603
 $param = $dbi->mapper(param => {id => 1, author => 'Ken', price => 1900})->map(
2604 2604
     id => "$table1.id",
... ...
@@ -2624,7 +2624,6 @@ $param = $dbi->mapper(param => {id => '', author => '', price => ''})->map(
2624 2624
 );
2625 2625
 is_deeply($param, {});
2626 2626
 
2627
-$DB::single = 1;
2628 2627
 $param = $dbi->mapper(param => {id => undef, author => undef, price => undef})->map(
2629 2628
     id => "$table1.id",
2630 2629
     price => ["$table1.price", {condition => 'exists'}]
... ...
@@ -2643,6 +2642,148 @@ $param = $dbi->mapper(param => {price => 'a'}, condition => 'exists')->map(
2643 2642
 );
2644 2643
 is_deeply($param, {"$table1.price" => '%a'});
2645 2644
 
2645
+eval { $dbi->execute("drop table $table1") };
2646
+$dbi->execute($create_table1);
2647
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2});
2648
+$dbi->insert(table => $table1, param => {$key1 => 3, $key2 => 4});
2649
+
2650
+$where = $dbi->where;
2651
+$where->clause(['and', ":${key1}{=}"]);
2652
+$param = $dbi->mapper(param => {$key1 => undef}, condition => 'defined')->map;
2653
+$where->param($param);
2654
+$result = $dbi->execute("select * from $table1 $where", {$key1 => 1});
2655
+$row = $result->all;
2656
+is_deeply($row, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]);
2657
+
2658
+$where = $dbi->where;
2659
+$where->clause(['or', ":${key1}{=}", ":${key1}{=}"]);
2660
+$param = $dbi->mapper(param => {$key1 => [undef, undef]}, condition => 'exists')->map;
2661
+$result = $dbi->execute("select * from $table1 $where", {$key1 => [1, 0]});
2662
+$row = $result->all;
2663
+is_deeply($row, [{$key1 => 1, $key2 => 2}]);
2664
+$result = $dbi->execute("select * from $table1 $where", {$key1 => [0, 1]});
2665
+$row = $result->all;
2666
+is_deeply($row, [{$key1 => 1, $key2 => 2}]);
2667
+
2668
+$where = $dbi->where;
2669
+$where->clause(['and', ":${key1}{=}"]);
2670
+$param = $dbi->mapper(param => {$key1 => [undef, undef]}, condition => 'defined')->map;
2671
+$where->param($param);
2672
+$result = $dbi->execute("select * from $table1 $where", {$key1 => [1, 0]});
2673
+$row = $result->all;
2674
+is_deeply($row, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]);
2675
+$result = $dbi->execute("select * from $table1 $where", {$key1 => [0, 1]});
2676
+$row = $result->all;
2677
+is_deeply($row, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]);
2678
+
2679
+$where = $dbi->where;
2680
+$where->clause(['and', ":${key1}{=}"]);
2681
+$param = $dbi->mapper(param => {$key1 => 0}, condition => 'length')
2682
+  ->pass([$key1, $key2])->map;
2683
+$where->param($param);
2684
+$result = $dbi->execute("select * from $table1 $where", {$key1 => 1});
2685
+$row = $result->all;
2686
+is_deeply($row, [{$key1 => 1, $key2 => 2}]);
2687
+
2688
+$where = $dbi->where;
2689
+$where->clause(['and', ":${key1}{=}"]);
2690
+$param = $dbi->mapper(param => {$key1 => ''}, condition => 'length')->map;
2691
+$where->param($param);
2692
+$result = $dbi->execute("select * from $table1 $where", {$key1 => 1});
2693
+$row = $result->all;
2694
+is_deeply($row, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]);
2695
+
2696
+$where = $dbi->where;
2697
+$where->clause(['and', ":${key1}{=}"]);
2698
+$param = $dbi->mapper(param => {$key1 => 5}, condition => sub { ($_[0] || '') eq 5 })
2699
+  ->pass([$key1, $key2])->map;
2700
+$where->param($param);
2701
+$result = $dbi->execute("select * from $table1 $where", {$key1 => 1});
2702
+$row = $result->all;
2703
+is_deeply($row, [{$key1 => 1, $key2 => 2}]);
2704
+
2705
+$where = $dbi->where;
2706
+$where->clause(['and', ":${key1}{=}"]);
2707
+$param = $dbi->mapper(param => {$key1 => 7}, condition => sub { ($_[0] || '') eq 5 })->map;
2708
+$where->param($param);
2709
+$result = $dbi->execute("select * from $table1 $where", {$key1 => 1});
2710
+$row = $result->all;
2711
+is_deeply($row, [{$key1 => 1, $key2 => 2}, {$key1 => 3, $key2 => 4}]);
2712
+
2713
+$where = $dbi->where;
2714
+$param = $dbi->mapper(param => {id => 1, author => 'Ken', price => 1900})->map(
2715
+    id => "$table1.id",
2716
+    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2717
+    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2718
+);
2719
+$where->param($param);
2720
+is_deeply($where->param, {"$table1.id" => 1, "$table1.author" => '%Ken%',
2721
+  "$table1.price" => 1900});
2722
+
2723
+$where = $dbi->where;
2724
+$param = $dbi->mapper(param => {id => 0, author => 0, price => 0})->map(
2725
+    id => "$table1.id",
2726
+    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2727
+    price => ["$table1.price", sub { '%' . $_[0] . '%' }, {condition => sub { $_[0] eq 0 }}]
2728
+);
2729
+$where->param($param);
2730
+is_deeply($where->param, {"$table1.id" => 0, "$table1.author" => '%0%', "$table1.price" => '%0%'});
2731
+
2732
+$where = $dbi->where;
2733
+$param = $dbi->mapper(param => {id => '', author => '', price => ''})->map(
2734
+    id => "$table1.id",
2735
+    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2736
+    price => ["$table1.price", sub { '%' . $_[0] . '%' }, {condition => sub { $_[0] eq 1 }}]
2737
+);
2738
+$where->param($param);
2739
+is_deeply($where->param, {});
2740
+
2741
+$where = $dbi->where;
2742
+$param = $dbi->mapper(param => {id => undef, author => undef, price => undef}, condition => 'exists')->map(
2743
+    id => "$table1.id",
2744
+    price => ["$table1.price", {condition => 'exists'}]
2745
+);
2746
+is_deeply($param, {"$table1.id"  => undef,"$table1.price" => undef});
2747
+
2748
+$where = $dbi->where;
2749
+$param = $dbi->mapper(param => {price => 'a'})->map(
2750
+    id => ["$table1.id", {condition => 'exists'}],
2751
+    price => ["$table1.price", sub { '%' . $_[0] }, {condition => 'exists'}]
2752
+);
2753
+is_deeply($param, {"$table1.price" => '%a'});
2754
+
2755
+$where = $dbi->where;
2756
+$param = $dbi->mapper(param => {id => [1, 2], author => 'Ken', price => 1900})->map(
2757
+    id => "$table1.id",
2758
+    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2759
+    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2760
+);
2761
+is_deeply($param, {"$table1.id" => [1, 2], "$table1.author" => '%Ken%',
2762
+  "$table1.price" => 1900});
2763
+
2764
+$where = $dbi->where;
2765
+$param = $dbi->mapper(param => {id => ['', ''], author => 'Ken', price => 1900}, condition => 'length')->map(
2766
+    id => "$table1.id",
2767
+    author => ["$table1.author", sub { '%' . $_[0] . '%' }],
2768
+    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2769
+);
2770
+is_deeply($param, {"$table1.id" => [$dbi->not_exists, $dbi->not_exists], "$table1.author" => '%Ken%',
2771
+  "$table1.price" => 1900});
2772
+
2773
+$where = $dbi->where;
2774
+$param = $dbi->mapper(param => {id => ['', ''], author => 'Ken', price => 1900})->map(
2775
+    id => ["$table1.id", {condition => 'length'}],
2776
+    author => ["$table1.author", sub { '%' . $_[0] . '%' }, {condition => 'defined'}],
2777
+    price => ["$table1.price", {condition => sub { $_[0] eq 1900 }}]
2778
+);
2779
+is_deeply($param, {"$table1.id" => [$dbi->not_exists, $dbi->not_exists], "$table1.author" => '%Ken%',
2780
+  "$table1.price" => 1900});
2781
+
2782
+$where = $dbi->where;
2783
+$param = $dbi->mapper(param => {id => 'a', author => 'b', price => 'c'}, pass => [qw/id author/])
2784
+  ->map(price => 'book.price');
2785
+is_deeply($param, {id => 'a', author => 'b', 'book.price' => 'c'});
2786
+
2646 2787
 test 'map_param';
2647 2788
 $dbi = DBIx::Custom->connect;
2648 2789
 $param = $dbi->map_param(