| ... | ... |
@@ -1,3 +1,7 @@ |
| 1 |
+0.1641 |
|
| 2 |
+ fix bug : filter can't overwirite undef value. |
|
| 3 |
+ add feature to apply_filter(). you can apply end filter. |
|
| 4 |
+ add feature to apply_filter(). TABLE__COLUMN is filterded now. |
|
| 1 | 5 |
0.1640 |
| 2 | 6 |
removed experimental DBIx::Custom::Table base() method |
| 3 | 7 |
table created by tabled method can call base_$method correponding to base_table's one |
| ... | ... |
@@ -81,54 +81,45 @@ sub apply_filter {
|
| 81 | 81 |
|
| 82 | 82 |
# Create filters |
| 83 | 83 |
my $usage = "Usage: \$dbi->apply_filter(" .
|
| 84 |
- "TABLE, COLUMN1, {in => INFILTER1, out => OUTFILTER1}, " .
|
|
| 85 |
- "COLUMN2, {in => INFILTER2, out => OUTFILTER2}, ...)";
|
|
| 84 |
+ "TABLE, COLUMN1, {in => INFILTER1, out => OUTFILTER1, end => ENDFILTER1}, " .
|
|
| 85 |
+ "COLUMN2, {in => INFILTER2, out => OUTFILTER2, end => ENDFILTER2}, ...)";
|
|
| 86 | 86 |
|
| 87 | 87 |
for (my $i = 0; $i < @cinfos; $i += 2) {
|
| 88 | 88 |
|
| 89 | 89 |
# Column |
| 90 | 90 |
my $column = $cinfos[$i]; |
| 91 | 91 |
|
| 92 |
- # Filter |
|
| 93 |
- my $filter = $cinfos[$i + 1] || {};
|
|
| 94 |
- croak $usage unless ref $filter eq 'HASH'; |
|
| 95 |
- foreach my $ftype (keys %$filter) {
|
|
| 96 |
- croak $usage unless $ftype eq 'in' || $ftype eq 'out'; |
|
| 92 |
+ # Filter info |
|
| 93 |
+ my $finfo = $cinfos[$i + 1] || {};
|
|
| 94 |
+ croak $usage unless ref $finfo eq 'HASH'; |
|
| 95 |
+ foreach my $ftype (keys %$finfo) {
|
|
| 96 |
+ croak $usage unless $ftype eq 'in' || $ftype eq 'out' |
|
| 97 |
+ || $ftype eq 'end'; |
|
| 97 | 98 |
} |
| 98 |
- my $in_filter = $filter->{in};
|
|
| 99 |
- my $out_filter = $filter->{out};
|
|
| 100 | 99 |
|
| 101 |
- # Out filter |
|
| 102 |
- if (ref $out_filter eq 'CODE') {
|
|
| 103 |
- $self->{filter}{out}{$table}{$column}
|
|
| 104 |
- = $out_filter; |
|
| 105 |
- $self->{filter}{out}{$table}{"$table.$column"}
|
|
| 106 |
- = $out_filter; |
|
| 107 |
- } |
|
| 108 |
- elsif (defined $out_filter) {
|
|
| 109 |
- croak qq{Filter "$out_filter" is not registered}
|
|
| 110 |
- unless exists $self->filters->{$out_filter};
|
|
| 100 |
+ foreach my $way (qw/in out end/) {
|
|
| 101 |
+ my $filter = $finfo->{$way};
|
|
| 111 | 102 |
|
| 112 |
- $self->{filter}{out}{$table}{$column}
|
|
| 113 |
- = $self->filters->{$out_filter};
|
|
| 114 |
- $self->{filter}{out}{$table}{"$table.$column"}
|
|
| 115 |
- = $self->filters->{$out_filter};
|
|
| 116 |
- } |
|
| 117 |
- |
|
| 118 |
- # In filter |
|
| 119 |
- if (ref $in_filter eq 'CODE') {
|
|
| 120 |
- $self->{filter}{in}{$table}{$column}
|
|
| 121 |
- = $in_filter; |
|
| 122 |
- $self->{filter}{in}{$table}{"$table.$column"}
|
|
| 123 |
- = $in_filter; |
|
| 124 |
- } |
|
| 125 |
- elsif (defined $in_filter) {
|
|
| 126 |
- croak qq{Filter "$in_filter" is not registered}
|
|
| 127 |
- unless exists $self->filters->{$in_filter};
|
|
| 128 |
- $self->{filter}{in}{$table}{$column}
|
|
| 129 |
- = $self->filters->{$in_filter};
|
|
| 130 |
- $self->{filter}{in}{$table}{"$table.$column"}
|
|
| 131 |
- = $self->filters->{$in_filter};
|
|
| 103 |
+ # State |
|
| 104 |
+ my $state = !exists $finfo->{$way} ? 'not_exists'
|
|
| 105 |
+ : !defined $filter ? 'not_defined' |
|
| 106 |
+ : ref $filter eq 'CODE' ? 'code' |
|
| 107 |
+ : 'name'; |
|
| 108 |
+ |
|
| 109 |
+ next if $state eq 'not_exists'; |
|
| 110 |
+ |
|
| 111 |
+ # Check filter |
|
| 112 |
+ croak qq{Filter "$filter" is not registered}
|
|
| 113 |
+ if $state eq 'name' |
|
| 114 |
+ && ! exists $self->filters->{$filter};
|
|
| 115 |
+ |
|
| 116 |
+ # Filter |
|
| 117 |
+ my $f = $state eq 'not_defined' ? undef |
|
| 118 |
+ : $state eq 'code' ? $filter |
|
| 119 |
+ : $self->filters->{$filter};
|
|
| 120 |
+ $self->{filter}{$way}{$table}{$column} = $f;
|
|
| 121 |
+ $self->{filter}{$way}{$table}{"$table.$column"} = $f;
|
|
| 122 |
+ $self->{filter}{$way}{$table}{"${table}__$column"} = $f;
|
|
| 132 | 123 |
} |
| 133 | 124 |
} |
| 134 | 125 |
|
| ... | ... |
@@ -345,13 +336,18 @@ sub execute{
|
| 345 | 336 |
# Return resultset if select statement is executed |
| 346 | 337 |
if ($sth->{NUM_OF_FIELDS}) {
|
| 347 | 338 |
|
| 348 |
- # Auto in filter |
|
| 349 |
- my $in_filter = {};
|
|
| 339 |
+ # Result in and end filter |
|
| 340 |
+ my $in_filter = {};
|
|
| 341 |
+ my $end_filter = {};
|
|
| 350 | 342 |
foreach my $table (@$tables) {
|
| 351 | 343 |
$in_filter = {
|
| 352 | 344 |
%$in_filter, |
| 353 | 345 |
%{$self->{filter}{in}{$table} || {}}
|
| 354 |
- } |
|
| 346 |
+ }; |
|
| 347 |
+ $end_filter = {
|
|
| 348 |
+ %$end_filter, |
|
| 349 |
+ %{$self->{filter}{end}{$table} || {}}
|
|
| 350 |
+ }; |
|
| 355 | 351 |
} |
| 356 | 352 |
|
| 357 | 353 |
# Result |
| ... | ... |
@@ -360,7 +356,8 @@ sub execute{
|
| 360 | 356 |
filters => $self->filters, |
| 361 | 357 |
filter_check => $self->filter_check, |
| 362 | 358 |
default_filter => $self->{default_in_filter},
|
| 363 |
- filter => $in_filter || {}
|
|
| 359 |
+ filter => $in_filter || {},
|
|
| 360 |
+ end_filter => $end_filter || {}
|
|
| 364 | 361 |
); |
| 365 | 362 |
|
| 366 | 363 |
return $result; |
| ... | ... |
@@ -1028,8 +1025,8 @@ and implements the following new ones. |
| 1028 | 1025 |
|
| 1029 | 1026 |
$dbi->apply_filter( |
| 1030 | 1027 |
$table, |
| 1031 |
- $column1 => {in => $infilter1, out => $outfilter1}
|
|
| 1032 |
- $column2 => {in => $infilter2, out => $outfilter2}
|
|
| 1028 |
+ $column1 => {in => $infilter1, out => $outfilter1, end => $endfilter1}
|
|
| 1029 |
+ $column2 => {in => $infilter2, out => $outfilter2, end =. $endfilter2}
|
|
| 1033 | 1030 |
..., |
| 1034 | 1031 |
); |
| 1035 | 1032 |
|
| ... | ... |
@@ -1045,7 +1042,13 @@ arguments. |
| 1045 | 1042 |
param => {key1 => 1, key2 => 2},
|
| 1046 | 1043 |
table => ['table1'] |
| 1047 | 1044 |
); |
| 1048 |
- |
|
| 1045 |
+ |
|
| 1046 |
+You can use three name as column name. |
|
| 1047 |
+ |
|
| 1048 |
+ 1. column : author |
|
| 1049 |
+ 2. table.column : book.author |
|
| 1050 |
+ 3. table__column : book__author |
|
| 1051 |
+ |
|
| 1049 | 1052 |
=head2 C<connect> |
| 1050 | 1053 |
|
| 1051 | 1054 |
my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=dbname", |
| ... | ... |
@@ -36,7 +36,6 @@ Column names. |
| 36 | 36 |
title => 'to_something'}); |
| 37 | 37 |
|
| 38 | 38 |
Filters when parameter binding is executed. |
| 39 |
-This overwrites C<default_filter>. |
|
| 40 | 39 |
|
| 41 | 40 |
=head2 C<sql> |
| 42 | 41 |
|
| ... | ... |
@@ -20,7 +20,11 @@ sub filter {
|
| 20 | 20 |
|
| 21 | 21 |
foreach my $column (keys %$filter) {
|
| 22 | 22 |
my $fname = $filter->{$column};
|
| 23 |
- unless (ref $fname eq 'CODE') {
|
|
| 23 |
+ |
|
| 24 |
+ if (exists $filter->{$column}
|
|
| 25 |
+ && defined $fname |
|
| 26 |
+ && ref $fname ne 'CODE') |
|
| 27 |
+ {
|
|
| 24 | 28 |
croak qq{Filter "$fname" is not registered"}
|
| 25 | 29 |
unless exists $self->filters->{$fname};
|
| 26 | 30 |
|
| ... | ... |
@@ -44,7 +48,11 @@ sub end_filter {
|
| 44 | 48 |
|
| 45 | 49 |
foreach my $column (keys %$end_filter) {
|
| 46 | 50 |
my $fname = $end_filter->{$column};
|
| 47 |
- unless (ref $fname eq 'CODE') {
|
|
| 51 |
+ |
|
| 52 |
+ if (exists $end_filter->{$column}
|
|
| 53 |
+ && defined $fname |
|
| 54 |
+ && ref $fname ne 'CODE') |
|
| 55 |
+ {
|
|
| 48 | 56 |
croak qq{Filter "$fname" is not registered"}
|
| 49 | 57 |
unless exists $self->filters->{$fname};
|
| 50 | 58 |
|
| ... | ... |
@@ -600,6 +600,21 @@ $result = $dbi->select(table => 'table1'); |
| 600 | 600 |
$row = $result->fetch_hash_first; |
| 601 | 601 |
is_deeply($row, {key1 => 6, key2 => 12}, "insert");
|
| 602 | 602 |
|
| 603 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
|
| 604 |
+$dbi->execute($CREATE_TABLE->{0});
|
|
| 605 |
+$dbi->register_filter(twice => sub { $_[0] * 2 });
|
|
| 606 |
+$dbi->register_filter(three_times => sub { $_[0] * 3});
|
|
| 607 |
+$dbi->apply_filter( |
|
| 608 |
+ 'table1', 'key1' => {out => 'twice', in => 'three_times'},
|
|
| 609 |
+ 'key2' => {out => 'three_times', in => 'twice'});
|
|
| 610 |
+$dbi->apply_filter( |
|
| 611 |
+ 'table1', 'key1' => {out => undef}
|
|
| 612 |
+); |
|
| 613 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
|
|
| 614 |
+$result = $dbi->execute($SELECT_SOURCES->{0});
|
|
| 615 |
+$row = $result->fetch_hash_first; |
|
| 616 |
+is_deeply($row, {key1 => 1, key2 => 6}, "insert");
|
|
| 617 |
+ |
|
| 603 | 618 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
| 604 | 619 |
$dbi->execute($CREATE_TABLE->{0});
|
| 605 | 620 |
$dbi->register_filter(twice => sub { $_[0] * 2 });
|
| ... | ... |
@@ -852,6 +867,27 @@ $result->end_filter({key1 => sub { $_[0] * 3 }, key2 => 'five_times' });
|
| 852 | 867 |
$row = $result->fetch_hash_first; |
| 853 | 868 |
is_deeply($row, {key1 => 6, key2 => 40});
|
| 854 | 869 |
|
| 870 |
+$dbi->register_filter(five_times => sub { $_[0] * 5 });
|
|
| 871 |
+$dbi->apply_filter('table1',
|
|
| 872 |
+ key1 => {end => sub { $_[0] * 3 } },
|
|
| 873 |
+ key2 => {end => 'five_times'}
|
|
| 874 |
+); |
|
| 875 |
+$result = $dbi->select(table => 'table1'); |
|
| 876 |
+$result->filter(key1 => sub { $_[0] * 2 }, key2 => sub { $_[0] * 4 });
|
|
| 877 |
+$row = $result->fetch_hash_first; |
|
| 878 |
+is_deeply($row, {key1 => 6, key2 => 40}, 'apply_filter');
|
|
| 879 |
+ |
|
| 880 |
+$dbi->register_filter(five_times => sub { $_[0] * 5 });
|
|
| 881 |
+$dbi->apply_filter('table1',
|
|
| 882 |
+ key1 => {end => sub { $_[0] * 3 } },
|
|
| 883 |
+ key2 => {end => 'five_times'}
|
|
| 884 |
+); |
|
| 885 |
+$result = $dbi->select(table => 'table1'); |
|
| 886 |
+$result->filter(key1 => sub { $_[0] * 2 }, key2 => sub { $_[0] * 4 });
|
|
| 887 |
+$result->filter(key1 => undef); |
|
| 888 |
+$result->end_filter(key1 => undef); |
|
| 889 |
+$row = $result->fetch_hash_first; |
|
| 890 |
+is_deeply($row, {key1 => 1, key2 => 40}, 'apply_filter overwrite');
|
|
| 855 | 891 |
|
| 856 | 892 |
test 'empty where select'; |
| 857 | 893 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
| ... | ... |
@@ -1264,3 +1300,20 @@ is($table->three_times(1), 3, 'child table method'); |
| 1264 | 1300 |
eval {$dbi->base_two};
|
| 1265 | 1301 |
ok($@); |
| 1266 | 1302 |
|
| 1303 |
+test 'filter __ expression'; |
|
| 1304 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
|
| 1305 |
+$dbi->execute('create table company (id, name, location_id)');
|
|
| 1306 |
+$dbi->execute('create table location (id, name)');
|
|
| 1307 |
+$dbi->apply_filter('location',
|
|
| 1308 |
+ name => {in => sub { uc $_[0] } }
|
|
| 1309 |
+); |
|
| 1310 |
+ |
|
| 1311 |
+$dbi->insert(table => 'company', param => {id => 1, name => 'a', location_id => 2});
|
|
| 1312 |
+$dbi->insert(table => 'location', param => {id => 2, name => 'b'});
|
|
| 1313 |
+ |
|
| 1314 |
+$result = $dbi->select( |
|
| 1315 |
+ table => ['company', 'location'], relation => {'company.location_id' => 'location.id'},
|
|
| 1316 |
+ column => ['location.name as location__name'] |
|
| 1317 |
+); |
|
| 1318 |
+is($result->fetch_first->[0], 'B'); |
|
| 1319 |
+ |