| ... | ... |
@@ -1,3 +1,5 @@ |
| 1 |
+0.1703 |
|
| 2 |
+ - added join new syntax. |
|
| 1 | 3 |
0.1702 |
| 2 | 4 |
- removed EXPERIMENTAL status of some methods. |
| 3 | 5 |
- fixed some join bug |
| ... | ... |
@@ -1,7 +1,7 @@ |
| 1 | 1 |
package DBIx::Custom; |
| 2 | 2 |
use Object::Simple -base; |
| 3 | 3 |
|
| 4 |
-our $VERSION = '0.1702'; |
|
| 4 |
+our $VERSION = '0.1703'; |
|
| 5 | 5 |
use 5.008001; |
| 6 | 6 |
|
| 7 | 7 |
use Carp 'croak'; |
| ... | ... |
@@ -1313,29 +1313,46 @@ sub _push_join {
|
| 1313 | 1313 |
for (my $i = 0; $i < @$join; $i++) {
|
| 1314 | 1314 |
|
| 1315 | 1315 |
# Search table in join clause |
| 1316 |
- my $join_clause = $join->[$i]; |
|
| 1316 |
+ my $join_clause;; |
|
| 1317 |
+ my $option; |
|
| 1318 |
+ if (ref $join->[$i] eq 'HASH') {
|
|
| 1319 |
+ $join_clause = $join->[$i]->{clause};
|
|
| 1320 |
+ $option = {table => $join->[$i]->{table}};
|
|
| 1321 |
+ } |
|
| 1322 |
+ else {
|
|
| 1323 |
+ $join_clause = $join->[$i]; |
|
| 1324 |
+ $option = {};
|
|
| 1325 |
+ }; |
|
| 1317 | 1326 |
my $j_clause = (split /\s+on\s+/, $join_clause)[-1]; |
| 1318 | 1327 |
$j_clause =~ s/'.+?'//g; |
| 1319 | 1328 |
my $q_re = quotemeta($q); |
| 1320 | 1329 |
$j_clause =~ s/$q_re//g; |
| 1321 | 1330 |
my $c = $self->safety_character; |
| 1322 | 1331 |
my $join_re = qr/(?:^|\s)($c+)\.$c+\s+=\s+($c+)\.$c+/; |
| 1323 |
- if ($j_clause =~ $join_re) {
|
|
| 1324 |
- my $table1 = $1; |
|
| 1325 |
- my $table2 = $2; |
|
| 1326 |
- croak qq{right side table of "$join_clause" must be unique }
|
|
| 1327 |
- . _subname |
|
| 1328 |
- if exists $tree->{$table2};
|
|
| 1329 |
- croak qq{Same table "$table1" is specified} . _subname
|
|
| 1330 |
- if $table1 eq $table2; |
|
| 1331 |
- |
|
| 1332 |
- $tree->{$table2}
|
|
| 1333 |
- = {position => $i, parent => $table1, join => $join_clause};
|
|
| 1332 |
+ |
|
| 1333 |
+ my $table1; |
|
| 1334 |
+ my $table2; |
|
| 1335 |
+ if (my $table = $option->{table}) {
|
|
| 1336 |
+ $table1 = $table->[0]; |
|
| 1337 |
+ $table2 = $table->[1]; |
|
| 1334 | 1338 |
} |
| 1335 |
- else {
|
|
| 1336 |
- croak qq{join clause must have two table name after "on" keyword. } .
|
|
| 1337 |
- qq{"$join_clause" is passed } . _subname
|
|
| 1339 |
+ elsif ($j_clause =~ $join_re) {
|
|
| 1340 |
+ $table1 = $1; |
|
| 1341 |
+ $table2 = $2; |
|
| 1338 | 1342 |
} |
| 1343 |
+ croak qq{join clause must have two table name after "on" keyword. } .
|
|
| 1344 |
+ qq{"$join_clause" is passed } . _subname
|
|
| 1345 |
+ unless defined $table1 && defined $table2; |
|
| 1346 |
+ |
|
| 1347 |
+ croak qq{right side table of "$join_clause" must be unique }
|
|
| 1348 |
+ . _subname |
|
| 1349 |
+ if exists $tree->{$table2};
|
|
| 1350 |
+ |
|
| 1351 |
+ croak qq{Same table "$table1" is specified} . _subname
|
|
| 1352 |
+ if $table1 eq $table2; |
|
| 1353 |
+ |
|
| 1354 |
+ $tree->{$table2}
|
|
| 1355 |
+ = {position => $i, parent => $table1, join => $join_clause};
|
|
| 1339 | 1356 |
} |
| 1340 | 1357 |
|
| 1341 | 1358 |
# Search need tables |
| ... | ... |
@@ -2758,6 +2775,21 @@ the following SQL is created |
| 2758 | 2775 |
left outer join company on book.company_id = company.id |
| 2759 | 2776 |
where company.name = ?; |
| 2760 | 2777 |
|
| 2778 |
+You can specify two table by yourself. This is useful when join parser can't parse |
|
| 2779 |
+the join clause correctly. |
|
| 2780 |
+ |
|
| 2781 |
+ $dbi->select( |
|
| 2782 |
+ table => 'book', |
|
| 2783 |
+ column => ['company.location_id as location_id'], |
|
| 2784 |
+ where => {'company.name' => 'Orange'},
|
|
| 2785 |
+ join => [ |
|
| 2786 |
+ {
|
|
| 2787 |
+ clause => 'left outer join location on company.location_id = location.id', |
|
| 2788 |
+ table => ['company', 'location'] |
|
| 2789 |
+ } |
|
| 2790 |
+ ] |
|
| 2791 |
+ ); |
|
| 2792 |
+ |
|
| 2761 | 2793 |
=item C<primary_key> |
| 2762 | 2794 |
|
| 2763 | 2795 |
primary_key => 'id' |
| ... | ... |
@@ -2189,6 +2189,32 @@ $result = $dbi->select( |
| 2189 | 2189 |
] |
| 2190 | 2190 |
); |
| 2191 | 2191 |
is_deeply($result->all, [{'table2.key3' => 4}]);
|
| 2192 |
+$result = $dbi->select( |
|
| 2193 |
+ table => 'table1', |
|
| 2194 |
+ column => [{table2 => ['key3']}],
|
|
| 2195 |
+ join => [ |
|
| 2196 |
+ "left outer join table2 on table1.key1 = table2.key1 and table2.key3 = '4'" |
|
| 2197 |
+ ] |
|
| 2198 |
+); |
|
| 2199 |
+is_deeply($result->all, [{'table2.key3' => 4}]);
|
|
| 2200 |
+ |
|
| 2201 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
|
|
| 2202 |
+$dbi->execute($CREATE_TABLE->{0});
|
|
| 2203 |
+$dbi->execute($CREATE_TABLE->{2});
|
|
| 2204 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
|
|
| 2205 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4});
|
|
| 2206 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5});
|
|
| 2207 |
+$result = $dbi->select( |
|
| 2208 |
+ table => 'table1', |
|
| 2209 |
+ column => [{table2 => ['key3']}],
|
|
| 2210 |
+ join => [ |
|
| 2211 |
+ {
|
|
| 2212 |
+ clause => "left outer join table2 on table2.key3 = '4' and table1.key1 = table2.key1", |
|
| 2213 |
+ table => ['table1', 'table2'] |
|
| 2214 |
+ } |
|
| 2215 |
+ ] |
|
| 2216 |
+); |
|
| 2217 |
+is_deeply($result->all, [{'table2.key3' => 4}]);
|
|
| 2192 | 2218 |
|
| 2193 | 2219 |
test 'mycolumn'; |
| 2194 | 2220 |
$dbi = MyDBI8->connect($NEW_ARGS->{0});
|