all filter can receive array referenand receiving hash...
...reference is DEPRECATED
... | ... |
@@ -16,6 +16,7 @@ use DBIx::Custom::QueryBuilder; |
16 | 16 |
use DBIx::Custom::Where; |
17 | 17 |
use DBIx::Custom::Model; |
18 | 18 |
use DBIx::Custom::Tag; |
19 |
+use DBIx::Custom::Util; |
|
19 | 20 |
use Encode qw/encode_utf8 decode_utf8/; |
20 | 21 |
|
21 | 22 |
__PACKAGE__->attr( |
... | ... |
@@ -87,6 +88,7 @@ sub apply_filter { |
87 | 88 |
$self->{filter} ||= {}; |
88 | 89 |
$self->{filter}{out} ||= {}; |
89 | 90 |
$self->{filter}{in} ||= {}; |
91 |
+ $self->{filter}{end} ||= {}; |
|
90 | 92 |
|
91 | 93 |
# Create filters |
92 | 94 |
my $usage = "Usage: \$dbi->apply_filter(" . |
... | ... |
@@ -98,11 +100,18 @@ sub apply_filter { |
98 | 100 |
# Column |
99 | 101 |
my $column = $cinfos[$i]; |
100 | 102 |
|
103 |
+ if (ref $column eq 'ARRAY') { |
|
104 |
+ foreach my $c (@$column) { |
|
105 |
+ push @cinfos, $c, $cinfos[$i + 1]; |
|
106 |
+ } |
|
107 |
+ next; |
|
108 |
+ } |
|
109 |
+ |
|
101 | 110 |
# Filter info |
102 | 111 |
my $finfo = $cinfos[$i + 1] || {}; |
103 |
- croak $usage unless ref $finfo eq 'HASH'; |
|
112 |
+ croak "$usage (table: $table)" unless ref $finfo eq 'HASH'; |
|
104 | 113 |
foreach my $ftype (keys %$finfo) { |
105 |
- croak $usage unless $ftype eq 'in' || $ftype eq 'out' |
|
114 |
+ croak "$usage (table: $table 2)" unless $ftype eq 'in' || $ftype eq 'out' |
|
106 | 115 |
|| $ftype eq 'end'; |
107 | 116 |
} |
108 | 117 |
|
... | ... |
@@ -351,6 +360,7 @@ sub execute{ |
351 | 360 |
|
352 | 361 |
# Applied filter |
353 | 362 |
my $filter = {}; |
363 |
+ |
|
354 | 364 |
my $tables = $query->tables; |
355 | 365 |
my $arg_tables = $args{table} || []; |
356 | 366 |
$arg_tables = [$arg_tables] |
... | ... |
@@ -364,7 +374,8 @@ sub execute{ |
364 | 374 |
} |
365 | 375 |
|
366 | 376 |
# Filter argument |
367 |
- my $f = $args{filter} || $query->filter || {}; |
|
377 |
+ my $f = DBIx::Custom::Util::array_filter_to_hash($args{filter}) |
|
378 |
+ || $query->filter || {}; |
|
368 | 379 |
foreach my $column (keys %$f) { |
369 | 380 |
my $fname = $f->{$column}; |
370 | 381 |
if (!defined $fname) { |
... | ... |
@@ -773,7 +784,9 @@ sub include_model { |
773 | 784 |
$self->model($model->name, $model); |
774 | 785 |
|
775 | 786 |
# Apply filter |
776 |
- $self->apply_filter($model->table, %{$model->filter}); |
|
787 |
+ croak "${name_space}::$model_class filter must be array reference" |
|
788 |
+ unless ref $model->filter eq 'ARRAY'; |
|
789 |
+ $self->apply_filter($model->table, @{$model->filter}); |
|
777 | 790 |
} |
778 | 791 |
return $self; |
779 | 792 |
} |
... | ... |
@@ -1075,23 +1088,23 @@ DBIx::Custom - DBI interface, having hash parameter binding and filtering system |
1075 | 1088 |
# Insert |
1076 | 1089 |
$dbi->insert(table => 'book', |
1077 | 1090 |
param => {title => 'Perl', author => 'Ken'}, |
1078 |
- filter => {title => 'to_something'}); |
|
1091 |
+ filter => [title => 'to_something']); |
|
1079 | 1092 |
|
1080 | 1093 |
# Update |
1081 | 1094 |
$dbi->update(table => 'book', |
1082 | 1095 |
param => {title => 'Perl', author => 'Ken'}, |
1083 | 1096 |
where => {id => 5}, |
1084 |
- filter => {title => 'to_something'}); |
|
1097 |
+ filter => [title => 'to_something']); |
|
1085 | 1098 |
|
1086 | 1099 |
# Update all |
1087 | 1100 |
$dbi->update_all(table => 'book', |
1088 | 1101 |
param => {title => 'Perl'}, |
1089 |
- filter => {title => 'to_something'}); |
|
1102 |
+ filter => [title => 'to_something']); |
|
1090 | 1103 |
|
1091 | 1104 |
# Delete |
1092 | 1105 |
$dbi->delete(table => 'book', |
1093 | 1106 |
where => {author => 'Ken'}, |
1094 |
- filter => {title => 'to_something'}); |
|
1107 |
+ filter => [title => 'to_something']); |
|
1095 | 1108 |
|
1096 | 1109 |
# Delete all |
1097 | 1110 |
$dbi->delete_all(table => 'book'); |
... | ... |
@@ -1103,7 +1116,7 @@ DBIx::Custom - DBI interface, having hash parameter binding and filtering system |
1103 | 1116 |
where => {author => 'Ken'}, |
1104 | 1117 |
relation => {'book.id' => 'rental.book_id'}, |
1105 | 1118 |
append => 'order by id limit 5', |
1106 |
- filter => {title => 'to_something'} |
|
1119 |
+ filter => [title => 'to_something'] |
|
1107 | 1120 |
); |
1108 | 1121 |
|
1109 | 1122 |
# Execute SQL |
... | ... |
@@ -1112,7 +1125,7 @@ DBIx::Custom - DBI interface, having hash parameter binding and filtering system |
1112 | 1125 |
# Execute SQL with hash binding and filtering |
1113 | 1126 |
$dbi->execute("select id from book where {= author} and {like title}", |
1114 | 1127 |
param => {author => 'ken', title => '%Perl%'}, |
1115 |
- filter => {title => 'to_something'}); |
|
1128 |
+ filter => [title => 'to_something']); |
|
1116 | 1129 |
|
1117 | 1130 |
# Create query and execute it |
1118 | 1131 |
my $query = $dbi->create_query( |
... | ... |
@@ -1331,8 +1344,8 @@ instead of suger methods. |
1331 | 1344 |
|
1332 | 1345 |
=head2 C<execute> |
1333 | 1346 |
|
1334 |
- my $result = $dbi->execute($query, param => $params, filter => \%filter); |
|
1335 |
- my $result = $dbi->execute($source, param => $params, filter => \%filter); |
|
1347 |
+ my $result = $dbi->execute($query, param => $params, filter => \@filter); |
|
1348 |
+ my $result = $dbi->execute($source, param => $params, filter => \@filter); |
|
1336 | 1349 |
|
1337 | 1350 |
Execute query or the source of SQL. |
1338 | 1351 |
Query is L<DBIx::Custom::Query> object. |
... | ... |
@@ -1344,7 +1357,7 @@ or the count of affected rows if insert, update, delete statement is executed. |
1344 | 1357 |
$dbi->delete(table => $table, |
1345 | 1358 |
where => \%where, |
1346 | 1359 |
append => $append, |
1347 |
- filter => \%filter, |
|
1360 |
+ filter => \@filter, |
|
1348 | 1361 |
query => 1); |
1349 | 1362 |
|
1350 | 1363 |
Execute delete statement. |
... | ... |
@@ -1392,7 +1405,7 @@ You can also write arguments like this. |
1392 | 1405 |
$dbi->insert(table => $table, |
1393 | 1406 |
param => \%param, |
1394 | 1407 |
append => $append, |
1395 |
- filter => \%filter, |
|
1408 |
+ filter => \@filter, |
|
1396 | 1409 |
query => 1); |
1397 | 1410 |
|
1398 | 1411 |
Execute insert statement. |
... | ... |
@@ -1594,7 +1607,7 @@ NOTE that you must pass array reference as C<where>. |
1594 | 1607 |
param => \%params, |
1595 | 1608 |
where => \%where, |
1596 | 1609 |
append => $append, |
1597 |
- filter => \%filter, |
|
1610 |
+ filter => \@filter, |
|
1598 | 1611 |
query => 1) |
1599 | 1612 |
|
1600 | 1613 |
Execute update statement. |
... | ... |
@@ -1632,7 +1645,7 @@ C<columns> and C<primary_key> is automatically set. |
1632 | 1645 |
|
1633 | 1646 |
$dbi->update_all(table => $table, |
1634 | 1647 |
param => \%params, |
1635 |
- filter => \%filter, |
|
1648 |
+ filter => \@filter, |
|
1636 | 1649 |
append => $append); |
1637 | 1650 |
|
1638 | 1651 |
Execute update statement to update all rows. |
... | ... |
@@ -13,7 +13,7 @@ push @DBIx::Custom::CARP_NOT, __PACKAGE__; |
13 | 13 |
__PACKAGE__->attr( |
14 | 14 |
['dbi', 'name', 'table'], |
15 | 15 |
columns => sub { [] }, |
16 |
- filter => sub { {} }, |
|
16 |
+ filter => sub { [] }, |
|
17 | 17 |
primary_key => sub { [] }, |
18 | 18 |
relation => sub { {} } |
19 | 19 |
); |
... | ... |
@@ -13,7 +13,28 @@ sub filter { |
13 | 13 |
my $self = shift; |
14 | 14 |
|
15 | 15 |
if (@_) { |
16 |
- my $filter = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
|
16 |
+ my $filter = {}; |
|
17 |
+ |
|
18 |
+ if (ref $_[0] eq 'HASH') { |
|
19 |
+ $filter = $_[0]; |
|
20 |
+ } |
|
21 |
+ else { |
|
22 |
+ my $ef = @_ > 1 ? [@_] : $_[0]; |
|
23 |
+ |
|
24 |
+ for (my $i = 0; $i < @$ef; $i += 2) { |
|
25 |
+ my $column = $ef->[$i]; |
|
26 |
+ my $f = $ef->[$i + 1]; |
|
27 |
+ |
|
28 |
+ if (ref $column eq 'ARRAY') { |
|
29 |
+ foreach my $c (@$column) { |
|
30 |
+ $filter->{$c} = $f; |
|
31 |
+ } |
|
32 |
+ } |
|
33 |
+ else { |
|
34 |
+ $filter->{$column} = $f; |
|
35 |
+ } |
|
36 |
+ } |
|
37 |
+ } |
|
17 | 38 |
|
18 | 39 |
foreach my $column (keys %$filter) { |
19 | 40 |
my $fname = $filter->{$column}; |
... | ... |
@@ -65,6 +86,8 @@ Column names. |
65 | 86 |
$query = $query->filter(author => 'to_something', |
66 | 87 |
title => 'to_something'); |
67 | 88 |
|
89 |
+ $query = $query->filter([qw/author title/] => 'to_something'); |
|
90 |
+ |
|
68 | 91 |
Filters when parameter binding is executed. |
69 | 92 |
|
70 | 93 |
=head2 C<sql> |
... | ... |
@@ -6,6 +6,7 @@ use warnings; |
6 | 6 |
use base 'Object::Simple'; |
7 | 7 |
|
8 | 8 |
use Carp 'croak'; |
9 |
+use DBIx::Custom::Util; |
|
9 | 10 |
|
10 | 11 |
__PACKAGE__->attr( |
11 | 12 |
[qw/filters sth/], |
... | ... |
@@ -16,8 +17,17 @@ sub filter { |
16 | 17 |
my $self = shift; |
17 | 18 |
|
18 | 19 |
if (@_) { |
19 |
- my $filter = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
|
20 |
+ my $filter = {}; |
|
20 | 21 |
|
22 |
+ if (ref $_[0] eq 'HASH') { |
|
23 |
+ $filter = $_[0]; |
|
24 |
+ } |
|
25 |
+ else { |
|
26 |
+ $filter = DBIx::Custom::Util::array_filter_to_hash( |
|
27 |
+ @_ > 1 ? [@_] : $_[0] |
|
28 |
+ ); |
|
29 |
+ } |
|
30 |
+ |
|
21 | 31 |
foreach my $column (keys %$filter) { |
22 | 32 |
my $fname = $filter->{$column}; |
23 | 33 |
|
... | ... |
@@ -44,7 +54,16 @@ sub end_filter { |
44 | 54 |
my $self = shift; |
45 | 55 |
|
46 | 56 |
if (@_) { |
47 |
- my $end_filter = ref $_[0] eq 'HASH' ? $_[0] : {@_}; |
|
57 |
+ my $end_filter = {}; |
|
58 |
+ |
|
59 |
+ if (ref $_[0] eq 'HASH') { |
|
60 |
+ $end_filter = $_[0]; |
|
61 |
+ } |
|
62 |
+ else { |
|
63 |
+ $end_filter = DBIx::Custom::Util::array_filter_to_hash( |
|
64 |
+ @_ > 1 ? [@_] : $_[0] |
|
65 |
+ ); |
|
66 |
+ } |
|
48 | 67 |
|
49 | 68 |
foreach my $column (keys %$end_filter) { |
50 | 69 |
my $fname = $end_filter->{$column}; |
... | ... |
@@ -339,9 +358,11 @@ and implements the following new ones. |
339 | 358 |
|
340 | 359 |
=head2 C<(experimental) end_filter> |
341 | 360 |
|
342 |
- $result = $result->end_filter(title => 'to_something', |
|
361 |
+ $result = $result->end_filter(title => 'to_something', |
|
343 | 362 |
author => 'to_something'); |
344 | 363 |
|
364 |
+ $result = $result->end_filter([qw/title author/] => 'to_something'); |
|
365 |
+ |
|
345 | 366 |
End filters. |
346 | 367 |
These each filters is executed after the filters applied by C<apply_filter> of |
347 | 368 |
L<DBIx::Custom> or C<filter> method. |
... | ... |
@@ -401,6 +422,8 @@ Row count must be specified. |
401 | 422 |
$result = $result->filter(title => 'to_something', |
402 | 423 |
author => 'to_something'); |
403 | 424 |
|
425 |
+ $result = $result->filter([qw/title author/] => 'to_something'); |
|
426 |
+ |
|
404 | 427 |
Filters. |
405 | 428 |
These each filters override the filters applied by C<apply_filter> of |
406 | 429 |
L<DBIx::Custom>. |
... | ... |
@@ -0,0 +1,35 @@ |
1 |
+package DBIx::Custom::Util; |
|
2 |
+ |
|
3 |
+use strict; |
|
4 |
+use warnings; |
|
5 |
+ |
|
6 |
+sub array_filter_to_hash { |
|
7 |
+ my $array_filter = shift; |
|
8 |
+ |
|
9 |
+ return unless $array_filter; |
|
10 |
+ return $array_filter if ref $array_filter eq 'HASH'; |
|
11 |
+ |
|
12 |
+ my $filter = {}; |
|
13 |
+ |
|
14 |
+ for (my $i = 0; $i < @$array_filter; $i += 2) { |
|
15 |
+ my $column = $array_filter->[$i]; |
|
16 |
+ my $f = $array_filter->[$i + 1]; |
|
17 |
+ |
|
18 |
+ if (ref $column eq 'ARRAY') { |
|
19 |
+ foreach my $c (@$column) { |
|
20 |
+ $filter->{$c} = $f; |
|
21 |
+ } |
|
22 |
+ } |
|
23 |
+ else { |
|
24 |
+ $filter->{$column} = $f; |
|
25 |
+ } |
|
26 |
+ } |
|
27 |
+ return $filter; |
|
28 |
+} |
|
29 |
+ |
|
30 |
+1; |
|
31 |
+ |
|
32 |
+=head1 NAME |
|
33 |
+ |
|
34 |
+DBIx::Custom::Util - Utility class |
|
35 |
+ |
... | ... |
@@ -828,6 +828,24 @@ $result->end_filter(key1 => sub { $_[0] * 3 }, key2 => sub { $_[0] * 5 }); |
828 | 828 |
$row = $result->fetch_first; |
829 | 829 |
is_deeply($row, [6, 40]); |
830 | 830 |
|
831 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
832 |
+$dbi->execute($CREATE_TABLE->{0}); |
|
833 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
834 |
+$result = $dbi->select(table => 'table1'); |
|
835 |
+$result->filter([qw/key1 key2/] => sub { $_[0] * 2 }); |
|
836 |
+$result->end_filter([[qw/key1 key2/] => sub { $_[0] * 3 }]); |
|
837 |
+$row = $result->fetch_first; |
|
838 |
+is_deeply($row, [6, 12]); |
|
839 |
+ |
|
840 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
841 |
+$dbi->execute($CREATE_TABLE->{0}); |
|
842 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
843 |
+$result = $dbi->select(table => 'table1'); |
|
844 |
+$result->filter([[qw/key1 key2/] => sub { $_[0] * 2 }]); |
|
845 |
+$result->end_filter([qw/key1 key2/] => sub { $_[0] * 3 }); |
|
846 |
+$row = $result->fetch_first; |
|
847 |
+is_deeply($row, [6, 12]); |
|
848 |
+ |
|
831 | 849 |
$dbi->register_filter(five_times => sub { $_[0] * 5 }); |
832 | 850 |
$result = $dbi->select(table => 'table1'); |
833 | 851 |
$result->filter(key1 => sub { $_[0] * 2 }, key2 => sub { $_[0] * 4 }); |
... | ... |
@@ -3,9 +3,9 @@ package MyModel6::table3; |
3 | 3 |
use base 'MyModel6'; |
4 | 4 |
|
5 | 5 |
__PACKAGE__->attr(filter => sub { |
6 |
- { |
|
6 |
+ [ |
|
7 | 7 |
key1 => {in => sub { uc $_[0] }} |
8 |
- } |
|
8 |
+ ] |
|
9 | 9 |
}); |
10 | 10 |
|
11 | 11 |
1; |