| ... | ... |
@@ -2,6 +2,8 @@ |
| 2 | 2 |
added experimental DBIx::Custom::Result end_filter method |
| 3 | 3 |
experimental extended select method's where option |
| 4 | 4 |
fix select method empty where failed bug |
| 5 |
+ added experimental suger method query option |
|
| 6 |
+ added experimental or method |
|
| 5 | 7 |
0.1630 |
| 6 | 8 |
fix test bug |
| 7 | 9 |
0.1629 |
| ... | ... |
@@ -13,6 +13,7 @@ use DBI; |
| 13 | 13 |
use DBIx::Custom::Result; |
| 14 | 14 |
use DBIx::Custom::Query; |
| 15 | 15 |
use DBIx::Custom::QueryBuilder; |
| 16 |
+use DBIx::Custom::Or; |
|
| 16 | 17 |
use Encode qw/encode_utf8 decode_utf8/; |
| 17 | 18 |
|
| 18 | 19 |
__PACKAGE__->attr( |
| ... | ... |
@@ -461,6 +462,12 @@ sub new {
|
| 461 | 462 |
return $self; |
| 462 | 463 |
} |
| 463 | 464 |
|
| 465 |
+sub or {
|
|
| 466 |
+ my $self = shift; |
|
| 467 |
+ my $values = ref $_[0] eq 'ARRAY' ? $_[0] : [@_]; |
|
| 468 |
+ return DBIx::Custom::Or->new(values => $values); |
|
| 469 |
+} |
|
| 470 |
+ |
|
| 464 | 471 |
sub register_filter {
|
| 465 | 472 |
my $invocant = shift; |
| 466 | 473 |
|
| ... | ... |
@@ -534,7 +541,35 @@ sub select {
|
| 534 | 541 |
$param = $where->[1]; |
| 535 | 542 |
|
| 536 | 543 |
if (ref $w eq 'HASH') {
|
| 544 |
+ $wexists = keys %$param; |
|
| 545 |
+ if ($wexists) {
|
|
| 546 |
+ $source .= 'where (';
|
|
| 537 | 547 |
|
| 548 |
+ foreach my $column (keys %$param) {
|
|
| 549 |
+ croak qq{"$column" don't correspond to where clause}
|
|
| 550 |
+ unless exists $w->{$column};
|
|
| 551 |
+ |
|
| 552 |
+ my $value = $param->{$column};
|
|
| 553 |
+ if (ref $value eq 'DBIx::Custom::Or') {
|
|
| 554 |
+ my $values = $value->values; |
|
| 555 |
+ |
|
| 556 |
+ $source .= '( '; |
|
| 557 |
+ foreach my $value (@$values) {
|
|
| 558 |
+ $source .= $w->{$column};
|
|
| 559 |
+ $source .= ' or '; |
|
| 560 |
+ } |
|
| 561 |
+ $source =~ s/ or $//; |
|
| 562 |
+ $source .= ' )'; |
|
| 563 |
+ $source .= ' and '; |
|
| 564 |
+ $param->{$column} = $values;
|
|
| 565 |
+ } |
|
| 566 |
+ elsif ($w->{$column}) {
|
|
| 567 |
+ $source .= $w->{$column} . ' and ';
|
|
| 568 |
+ } |
|
| 569 |
+ } |
|
| 570 |
+ $source =~ s/ and $//; |
|
| 571 |
+ $source .= ') '; |
|
| 572 |
+ } |
|
| 538 | 573 |
} |
| 539 | 574 |
else {
|
| 540 | 575 |
$wexists = $w =~ /\S/; |
| ... | ... |
@@ -1199,6 +1234,13 @@ Create a new L<DBIx::Custom> object. |
| 1199 | 1234 |
Iterate all columns of all tables. Argument is callback. |
| 1200 | 1235 |
You can do anything by callback. |
| 1201 | 1236 |
|
| 1237 |
+=head2 C<(experimental) or> |
|
| 1238 |
+ |
|
| 1239 |
+ $or = $dbi->or(1, 5); |
|
| 1240 |
+ |
|
| 1241 |
+Create L<DBIx::Custom::Or> object. This is used with select method's |
|
| 1242 |
+where option. |
|
| 1243 |
+ |
|
| 1202 | 1244 |
=head2 C<register_filter> |
| 1203 | 1245 |
|
| 1204 | 1246 |
$dbi->register_filter(%filters); |
| ... | ... |
@@ -0,0 +1,26 @@ |
| 1 |
+package DBIx::Custom::Or; |
|
| 2 |
+ |
|
| 3 |
+use strict; |
|
| 4 |
+use warnings; |
|
| 5 |
+ |
|
| 6 |
+use base 'Object::Simple'; |
|
| 7 |
+ |
|
| 8 |
+__PACKAGE__->attr(values => sub { [] });
|
|
| 9 |
+ |
|
| 10 |
+1; |
|
| 11 |
+ |
|
| 12 |
+=head1 NAME |
|
| 13 |
+ |
|
| 14 |
+DBIx::Custom::Or - or condition |
|
| 15 |
+ |
|
| 16 |
+=head1 SYNOPSYS |
|
| 17 |
+ |
|
| 18 |
+ my $or = DBIx::Custom::Or->new; |
|
| 19 |
+ |
|
| 20 |
+=head1 ATTRIBUTES |
|
| 21 |
+ |
|
| 22 |
+=head2 C<values> |
|
| 23 |
+ |
|
| 24 |
+ my $values = $or->values; |
|
| 25 |
+ $or = $or->values([1, 2]); |
|
| 26 |
+ |
| ... | ... |
@@ -814,3 +814,71 @@ $query = $dbi->select(table => 'table1', where => {key1 => 1, key2 => 2}, query
|
| 814 | 814 |
is(ref $query, 'DBIx::Custom::Query'); |
| 815 | 815 |
|
| 816 | 816 |
1; |
| 817 |
+ |
|
| 818 |
+test 'select where option'; |
|
| 819 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
|
| 820 |
+$dbi->execute($CREATE_TABLE->{0});
|
|
| 821 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
|
|
| 822 |
+$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4});
|
|
| 823 |
+$result = $dbi->select( |
|
| 824 |
+ table => 'table1', |
|
| 825 |
+ where => [ |
|
| 826 |
+ { key1 => '{= key1}', key2 => '{= key2}' },
|
|
| 827 |
+ {key1 => 1}
|
|
| 828 |
+ ] |
|
| 829 |
+); |
|
| 830 |
+$row = $result->fetch_hash_all; |
|
| 831 |
+is_deeply($row, [{key1 => 1, key2 => 2}]);
|
|
| 832 |
+ |
|
| 833 |
+$result = $dbi->select( |
|
| 834 |
+ table => 'table1', |
|
| 835 |
+ where => [ |
|
| 836 |
+ { key1 => '{= key1}', key2 => '{= key2}' },
|
|
| 837 |
+ {key1 => 1, key2 => 2}
|
|
| 838 |
+ ] |
|
| 839 |
+); |
|
| 840 |
+$row = $result->fetch_hash_all; |
|
| 841 |
+is_deeply($row, [{key1 => 1, key2 => 2}]);
|
|
| 842 |
+ |
|
| 843 |
+$result = $dbi->select( |
|
| 844 |
+ table => 'table1', |
|
| 845 |
+ where => [ |
|
| 846 |
+ { key1 => '{= key1}', key2 => '{= key2}' },
|
|
| 847 |
+ {}
|
|
| 848 |
+ ] |
|
| 849 |
+); |
|
| 850 |
+$row = $result->fetch_hash_all; |
|
| 851 |
+is_deeply($row, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}]);
|
|
| 852 |
+ |
|
| 853 |
+$result = $dbi->select( |
|
| 854 |
+ table => 'table1', |
|
| 855 |
+ where => [ |
|
| 856 |
+ { key1 => '{= key1}', key2 => '{= key2}' },
|
|
| 857 |
+ { key1 => 1, key2 => $dbi->or(1, 2)}
|
|
| 858 |
+ ] |
|
| 859 |
+); |
|
| 860 |
+$row = $result->fetch_hash_all; |
|
| 861 |
+is_deeply($row, [{key1 => 1, key2 => 2}]);
|
|
| 862 |
+ |
|
| 863 |
+$result = $dbi->select( |
|
| 864 |
+ table => 'table1', |
|
| 865 |
+ where => [ |
|
| 866 |
+ { key1 => '{= key1}', key2 => '{= key2}' },
|
|
| 867 |
+ { key1 => 1, key2 => $dbi->or(2)}
|
|
| 868 |
+ ] |
|
| 869 |
+); |
|
| 870 |
+$row = $result->fetch_hash_all; |
|
| 871 |
+is_deeply($row, [{key1 => 1, key2 => 2}]);
|
|
| 872 |
+ |
|
| 873 |
+eval {
|
|
| 874 |
+$result = $dbi->select( |
|
| 875 |
+ table => 'table1', |
|
| 876 |
+ where => [ |
|
| 877 |
+ { key2 => '{= key2}' },
|
|
| 878 |
+ { key1 => 1}
|
|
| 879 |
+ ] |
|
| 880 |
+); |
|
| 881 |
+}; |
|
| 882 |
+ok($@); |
|
| 883 |
+ |
|
| 884 |
+ |