Showing 4 changed files with 138 additions and 0 deletions
+2
Changes
... ...
@@ -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
+42
lib/DBIx/Custom.pm
... ...
@@ -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);
+26
lib/DBIx/Custom/Or.pm
... ...
@@ -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
+
+68
t/dbix-custom-core-sqlite.t
... ...
@@ -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
+