| ... | ... |
@@ -1,7 +1,8 @@ |
| 1 | 1 |
0.1689 |
| 2 | 2 |
- added EXPERIMENTAL available_data_type |
| 3 | 3 |
- simplified type_rule |
| 4 |
- - changed type_rule arguments format. |
|
| 4 |
+ - changed type_rule arguments format |
|
| 5 |
+ - added DBIx::Custom result_filter attribute |
|
| 5 | 6 |
0.1688 |
| 6 | 7 |
- fixed bug that model insert, update, delete select can't |
| 7 | 8 |
odd number arguments |
| ... | ... |
@@ -84,7 +84,9 @@ sub AUTOLOAD {
|
| 84 | 84 |
} |
| 85 | 85 |
} |
| 86 | 86 |
|
| 87 |
-sub apply_filter {
|
|
| 87 |
+sub apply_filter { shift->_apply_filter(@_) }
|
|
| 88 |
+ |
|
| 89 |
+sub _apply_filter {
|
|
| 88 | 90 |
my ($self, $table, @cinfos) = @_; |
| 89 | 91 |
|
| 90 | 92 |
# Initialize filters |
| ... | ... |
@@ -389,6 +391,13 @@ sub create_model {
|
| 389 | 391 |
? [%{$model->filter}]
|
| 390 | 392 |
: $model->filter; |
| 391 | 393 |
$self->apply_filter($model->table, @$filter); |
| 394 |
+ my $result_filter = ref $model->result_filter eq 'HASH' |
|
| 395 |
+ ? [%{$model->result_filter}]
|
|
| 396 |
+ : $model->result_filter; |
|
| 397 |
+ for (my $i = 1; $i < @$result_filter; $i += 2) {
|
|
| 398 |
+ $result_filter->[$i] = {in => $result_filter->[$i]};
|
|
| 399 |
+ } |
|
| 400 |
+ $self->apply_filter($model->table, @$result_filter); |
|
| 392 | 401 |
|
| 393 | 402 |
# Associate table with model |
| 394 | 403 |
croak "Table name is duplicated " . _subname |
| ... | ... |
@@ -579,6 +588,7 @@ sub execute {
|
| 579 | 588 |
my $filter = {};
|
| 580 | 589 |
$filter->{in} = {};
|
| 581 | 590 |
$filter->{end} = {};
|
| 591 |
+ push @$tables, $main_table if $main_table; |
|
| 582 | 592 |
foreach my $table (@$tables) {
|
| 583 | 593 |
foreach my $way (qw/in end/) {
|
| 584 | 594 |
$filter->{$way} = {
|
| ... | ... |
@@ -16,6 +16,7 @@ __PACKAGE__->attr( |
| 16 | 16 |
table_alias => sub { {} },
|
| 17 | 17 |
columns => sub { [] },
|
| 18 | 18 |
filter => sub { [] },
|
| 19 |
+ result_filter => sub { [] },
|
|
| 19 | 20 |
join => sub { [] },
|
| 20 | 21 |
type => sub { [] },
|
| 21 | 22 |
primary_key => sub { [] }
|
| ... | ... |
@@ -163,7 +164,10 @@ L<DBIx::Custom> object. |
| 163 | 164 |
=head2 C<filter> |
| 164 | 165 |
|
| 165 | 166 |
my $dbi = $model->filter |
| 166 |
- $model = $model->filter({out => 'tp_to_date', in => 'date_to_tp'});
|
|
| 167 |
+ $model = $model->filter( |
|
| 168 |
+ title => {out => 'tp_to_date', in => 'date_to_tp'}
|
|
| 169 |
+ author => {out => ..., in => ...},
|
|
| 170 |
+ ); |
|
| 167 | 171 |
|
| 168 | 172 |
This filter is applied when L<DBIx::Custom>'s C<include_model()> is called. |
| 169 | 173 |
|
| ... | ... |
@@ -183,6 +187,24 @@ Model name. |
| 183 | 187 |
|
| 184 | 188 |
Join clause, this is used as C<select()>'s C<join> option. |
| 185 | 189 |
|
| 190 |
+=head2 C<primary_key> |
|
| 191 |
+ |
|
| 192 |
+ my $primary_key = $model->primary_key; |
|
| 193 |
+ $model = $model->primary_key(['id', 'number']); |
|
| 194 |
+ |
|
| 195 |
+Foreign key, this is used as C<primary_key> of C<insert_at>,C<update_at()>, |
|
| 196 |
+C<delete_at()>,C<select_at()>. |
|
| 197 |
+ |
|
| 198 |
+=head2 C<result_filter> |
|
| 199 |
+ |
|
| 200 |
+ my $dbi = $model->result_filter |
|
| 201 |
+ $model = $model->result_filter( |
|
| 202 |
+ title => sub { ... },
|
|
| 203 |
+ author => sub { ... }
|
|
| 204 |
+ ); |
|
| 205 |
+ |
|
| 206 |
+This filter is applied when L<DBIx::Custom>'s C<include_model()> or C<create_model> is called. |
|
| 207 |
+ |
|
| 186 | 208 |
=head2 C<table> |
| 187 | 209 |
|
| 188 | 210 |
my $table = $model->table; |
| ... | ... |
@@ -200,14 +222,6 @@ Table alias. If you define table alias, |
| 200 | 222 |
same filter as the table is avaliable |
| 201 | 223 |
, and can write $dbi->column('user1') to get all columns.
|
| 202 | 224 |
|
| 203 |
-=head2 C<primary_key> |
|
| 204 |
- |
|
| 205 |
- my $primary_key = $model->primary_key; |
|
| 206 |
- $model = $model->primary_key(['id', 'number']); |
|
| 207 |
- |
|
| 208 |
-Foreign key, this is used as C<primary_key> of C<insert_at>,C<update_at()>, |
|
| 209 |
-C<delete_at()>,C<select_at()>. |
|
| 210 |
- |
|
| 211 | 225 |
=head2 C<type> |
| 212 | 226 |
|
| 213 | 227 |
my $type = $model->type; |
| ... | ... |
@@ -2684,4 +2684,41 @@ $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 |
+ |
|
| 2688 |
+test 'result_filter'; |
|
| 2689 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
|
| 2690 |
+$dbi->execute($CREATE_TABLE->{0});
|
|
| 2691 |
+$dbi->execute($CREATE_TABLE->{2});
|
|
| 2692 |
+ |
|
| 2693 |
+$dbi->create_model( |
|
| 2694 |
+ table => 'table1', |
|
| 2695 |
+ join => [ |
|
| 2696 |
+ 'left outer join table2 on table1.key1 = table2.key1' |
|
| 2697 |
+ ], |
|
| 2698 |
+ primary_key => ['key1'], |
|
| 2699 |
+ result_filter => {
|
|
| 2700 |
+ key1 => sub { $_[0] * 2 }
|
|
| 2701 |
+ } |
|
| 2702 |
+); |
|
| 2703 |
+$model2 = $dbi->create_model( |
|
| 2704 |
+ table => 'table2', |
|
| 2705 |
+ result_filter => [ |
|
| 2706 |
+ [qw/key1 key3/] => sub { $_[0] * 3 }
|
|
| 2707 |
+ ] |
|
| 2708 |
+); |
|
| 2709 |
+$dbi->setup_model; |
|
| 2710 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
|
|
| 2711 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 3});
|
|
| 2712 |
+$model = $dbi->model('table1');
|
|
| 2713 |
+$result = $model->select( |
|
| 2714 |
+ column => [ |
|
| 2715 |
+ $model->mycolumn, |
|
| 2716 |
+ {table2 => [qw/key1 key3/]}
|
|
| 2717 |
+ ], |
|
| 2718 |
+ where => {'table1.key1' => 1}
|
|
| 2719 |
+); |
|
| 2720 |
+is_deeply($result->one, |
|
| 2721 |
+ {key1 => 2, key2 => 2, 'table2.key1' => 3, 'table2.key3' => 9});
|
|
| 2722 |
+is_deeply($model2->select->one, {key1 => 3, key3 => 9});
|
|
| 2723 |
+ |
|
| 2687 | 2724 |
=cut |