| ... | ... |
@@ -2,7 +2,8 @@ |
| 2 | 2 |
- added EXPERIMENTAL available_data_type |
| 3 | 3 |
- simplified type_rule |
| 4 | 4 |
- changed type_rule arguments format |
| 5 |
- - added DBIx::Custom result_filter attribute |
|
| 5 |
+ - added DBIx::Custom::Model result_filter attribute |
|
| 6 |
+ - added DBIx::Custom::Result filter_off method |
|
| 6 | 7 |
0.1688 |
| 7 | 8 |
- fixed bug that model insert, update, delete select can't |
| 8 | 9 |
odd number arguments |
| ... | ... |
@@ -1042,9 +1042,19 @@ sub type_rule {
|
| 1042 | 1042 |
|
| 1043 | 1043 |
my $type = $column_info->{TYPE_NAME};
|
| 1044 | 1044 |
if ($type_rule->{into} &&
|
| 1045 |
- (my $rule = $type_rule->{into}->{$type}))
|
|
| 1045 |
+ (my $filter = $type_rule->{into}->{$type}))
|
|
| 1046 | 1046 |
{
|
| 1047 |
- $self->{_into}{$table}{$column} = $rule;
|
|
| 1047 |
+ return unless exists $type_rule->{into}->{$type};
|
|
| 1048 |
+ if (defined $filter && ref $filter ne 'CODE') |
|
| 1049 |
+ {
|
|
| 1050 |
+ my $fname = $filter; |
|
| 1051 |
+ croak qq{Filter "$fname" is not registered" } . _subname
|
|
| 1052 |
+ unless exists $self->filters->{$fname};
|
|
| 1053 |
+ |
|
| 1054 |
+ $filter = $self->filters->{$fname};
|
|
| 1055 |
+ } |
|
| 1056 |
+ |
|
| 1057 |
+ $self->{_into}{$table}{$column} = $filter;
|
|
| 1048 | 1058 |
} |
| 1049 | 1059 |
}); |
| 1050 | 1060 |
|
| ... | ... |
@@ -9,7 +9,7 @@ use Carp 'croak'; |
| 9 | 9 |
use DBIx::Custom::Util qw/_array_to_hash _subname/; |
| 10 | 10 |
|
| 11 | 11 |
__PACKAGE__->attr( |
| 12 |
- [qw/filters sth type_rule type_rule_off/], |
|
| 12 |
+ [qw/filters filter_off sth type_rule type_rule_off/], |
|
| 13 | 13 |
stash => sub { {} }
|
| 14 | 14 |
); |
| 15 | 15 |
|
| ... | ... |
@@ -125,8 +125,8 @@ sub fetch {
|
| 125 | 125 |
my $ef = $end_filter->{$column};
|
| 126 | 126 |
|
| 127 | 127 |
# Filtering |
| 128 |
- $row[$i] = $f->($row[$i]) if $f; |
|
| 129 |
- $row[$i] = $ef->($row[$i]) if $ef; |
|
| 128 |
+ $row[$i] = $f->($row[$i]) if $f && !$self->filter_off; |
|
| 129 |
+ $row[$i] = $ef->($row[$i]) if $ef && !$self->filter_off; |
|
| 130 | 130 |
} |
| 131 | 131 |
|
| 132 | 132 |
return \@row; |
| ... | ... |
@@ -195,8 +195,10 @@ sub fetch_hash {
|
| 195 | 195 |
my $ef = $end_filter->{$column};
|
| 196 | 196 |
|
| 197 | 197 |
# Filtering |
| 198 |
- $row_hash->{$column} = $f ? $f->($row->[$i]) : $row->[$i];
|
|
| 199 |
- $row_hash->{$column} = $ef->($row_hash->{$column}) if $ef;
|
|
| 198 |
+ $row_hash->{$column} = $f && !$self->filter_off ? $f->($row->[$i])
|
|
| 199 |
+ : $row->[$i]; |
|
| 200 |
+ $row_hash->{$column} = $ef->($row_hash->{$column})
|
|
| 201 |
+ if $ef && !$self->filter_off; |
|
| 200 | 202 |
} |
| 201 | 203 |
|
| 202 | 204 |
return $row_hash; |
| ... | ... |
@@ -2684,6 +2684,24 @@ $dbi->insert({key1 => 2}, table => 'table1', type_rule_off => 1);
|
| 2684 | 2684 |
$result = $dbi->select(table => 'table1', type_rule_off => 1); |
| 2685 | 2685 |
is($result->one->{key1}, 2);
|
| 2686 | 2686 |
|
| 2687 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 2688 |
+$dbi->execute("create table table1 (key1 Date, key2 datetime)");
|
|
| 2689 |
+$dbi->register_filter(ppp => sub { uc $_[0] });
|
|
| 2690 |
+$dbi->type_rule( |
|
| 2691 |
+ into => {
|
|
| 2692 |
+ Date => 'ppp' |
|
| 2693 |
+ } |
|
| 2694 |
+); |
|
| 2695 |
+$dbi->insert({key1 => 'a'}, table => 'table1');
|
|
| 2696 |
+$result = $dbi->select(table => 'table1'); |
|
| 2697 |
+is($result->one->{key1}, 'A');
|
|
| 2698 |
+ |
|
| 2699 |
+eval{$dbi->type_rule(
|
|
| 2700 |
+ into => {
|
|
| 2701 |
+ Date => 'pp' |
|
| 2702 |
+ } |
|
| 2703 |
+)}; |
|
| 2704 |
+like($@, qr/not registered/); |
|
| 2687 | 2705 |
|
| 2688 | 2706 |
test 'result_filter'; |
| 2689 | 2707 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
| ... | ... |
@@ -2721,4 +2739,54 @@ is_deeply($result->one, |
| 2721 | 2739 |
{key1 => 2, key2 => 2, 'table2.key1' => 3, 'table2.key3' => 9});
|
| 2722 | 2740 |
is_deeply($model2->select->one, {key1 => 3, key3 => 9});
|
| 2723 | 2741 |
|
| 2742 |
+test 'filter_off'; |
|
| 2743 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
|
| 2744 |
+$dbi->execute($CREATE_TABLE->{0});
|
|
| 2745 |
+$dbi->execute($CREATE_TABLE->{2});
|
|
| 2746 |
+ |
|
| 2747 |
+$dbi->create_model( |
|
| 2748 |
+ table => 'table1', |
|
| 2749 |
+ join => [ |
|
| 2750 |
+ 'left outer join table2 on table1.key1 = table2.key1' |
|
| 2751 |
+ ], |
|
| 2752 |
+ primary_key => ['key1'], |
|
| 2753 |
+ result_filter => {
|
|
| 2754 |
+ key1 => sub { $_[0] * 2 }
|
|
| 2755 |
+ }, |
|
| 2756 |
+); |
|
| 2757 |
+$model2 = $dbi->create_model( |
|
| 2758 |
+ table => 'table2', |
|
| 2759 |
+ result_filter => [ |
|
| 2760 |
+ [qw/key1 key3/] => sub { $_[0] * 3 }
|
|
| 2761 |
+ ] |
|
| 2762 |
+); |
|
| 2763 |
+$dbi->setup_model; |
|
| 2764 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
|
|
| 2765 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 3});
|
|
| 2766 |
+$model = $dbi->model('table1');
|
|
| 2767 |
+$result = $model->select( |
|
| 2768 |
+ column => [ |
|
| 2769 |
+ $model->mycolumn, |
|
| 2770 |
+ {table2 => [qw/key1 key3/]}
|
|
| 2771 |
+ ], |
|
| 2772 |
+ where => {'table1.key1' => 1}
|
|
| 2773 |
+); |
|
| 2774 |
+$result->filter_off(1); |
|
| 2775 |
+$result->end_filter(key1 => sub { $_[0] * 5});
|
|
| 2776 |
+is_deeply($result->one, |
|
| 2777 |
+ {key1 => 1, key2 => 2, 'table2.key1' => 1, 'table2.key3' => 3});
|
|
| 2778 |
+ |
|
| 2779 |
+$result = $model->select( |
|
| 2780 |
+ column => [ |
|
| 2781 |
+ $model->mycolumn, |
|
| 2782 |
+ {table2 => [qw/key1 key3/]}
|
|
| 2783 |
+ ], |
|
| 2784 |
+ where => {'table1.key1' => 1}
|
|
| 2785 |
+); |
|
| 2786 |
+$result->filter_off(1); |
|
| 2787 |
+$result->end_filter(key1 => sub { $_[0] * 5});
|
|
| 2788 |
+ |
|
| 2789 |
+is_deeply($result->fetch_first, |
|
| 2790 |
+ [1, 2, 1, 3]); |
|
| 2791 |
+ |
|
| 2724 | 2792 |
=cut |