| ... | ... | 
                  @@ -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  |