... | ... |
@@ -1,6 +1,7 @@ |
1 | 1 |
0.1670 |
2 | 2 |
- removed EXPERIMETNAL select() column hash option. it's a little complex. |
3 |
- - added EXPERIMETAL select() param option. |
|
3 |
+ - added EXPERIMENTAL select() param option. |
|
4 |
+ - added EXPERIMENTAL replace(). |
|
4 | 5 |
0.1669 |
5 | 6 |
- renamed update_param to update_param_tag, update_param is DEPRECATED! |
6 | 7 |
- renamed insert_param to insert_param_tag, insert_param is DEPRECATED! |
... | ... |
@@ -840,6 +840,25 @@ sub register_filter { |
840 | 840 |
|
841 | 841 |
sub register_tag { shift->query_builder->register_tag(@_) } |
842 | 842 |
|
843 |
+sub replace { |
|
844 |
+ my ($self, $join, $search, $replace) = @_; |
|
845 |
+ |
|
846 |
+ my @replace_join; |
|
847 |
+ my $is_replaced; |
|
848 |
+ foreach my $j (@$join) { |
|
849 |
+ if ($search eq $j) { |
|
850 |
+ push @replace_join, $replace; |
|
851 |
+ $is_replaced = 1; |
|
852 |
+ } |
|
853 |
+ else { |
|
854 |
+ push @replace_join, $j; |
|
855 |
+ } |
|
856 |
+ } |
|
857 |
+ croak qq{Can't replace "$search" with "$replace"} unless $is_replaced; |
|
858 |
+ |
|
859 |
+ return @replace_join; |
|
860 |
+} |
|
861 |
+ |
|
843 | 862 |
our %SELECT_ARGS |
844 | 863 |
= map { $_ => 1 } @COMMON_ARGS, qw/column where append relation join param/; |
845 | 864 |
|
... | ... |
@@ -2326,6 +2345,21 @@ Column names is |
2326 | 2345 |
|
2327 | 2346 |
['title', 'author'] |
2328 | 2347 |
|
2348 |
+=head2 C<replace> EXPERIMENTAL |
|
2349 |
+ |
|
2350 |
+ my $join = [ |
|
2351 |
+ 'left outer join table2 on table1.key1 = table2.key1', |
|
2352 |
+ 'left outer join table3 on table2.key3 = table3.key3' |
|
2353 |
+ ]; |
|
2354 |
+ $join = $dbi->replace( |
|
2355 |
+ $join, |
|
2356 |
+ 'left outer join table2 on table1.key1 = table2.key1', |
|
2357 |
+ 'left outer join (select * from table2 where {= table2.key1}) ' . |
|
2358 |
+ 'as table2 on table1.key1 = table2.key1' |
|
2359 |
+ ); |
|
2360 |
+ |
|
2361 |
+Replace join clauses if match the expression. |
|
2362 |
+ |
|
2329 | 2363 |
=head2 C<select> |
2330 | 2364 |
|
2331 | 2365 |
my $result = $dbi->select( |
... | ... |
@@ -2415,6 +2449,22 @@ In above select, the following SQL is created. |
2415 | 2449 |
left outer join company on book.company_id = company.id |
2416 | 2450 |
where company.name = Orange |
2417 | 2451 |
|
2452 |
+=item C<param> EXPERIMETNAL |
|
2453 |
+ |
|
2454 |
+Parameter shown before where clause. |
|
2455 |
+ |
|
2456 |
+ $dbi->select( |
|
2457 |
+ table => 'table1', |
|
2458 |
+ column => 'table1.key1 as table1_key1, key2, key3', |
|
2459 |
+ where => {'table1.key2' => 3}, |
|
2460 |
+ join => ['inner join (select * from table2 where {= table2.key3})' . |
|
2461 |
+ ' as table2 on table1.key1 = table2.key1'], |
|
2462 |
+ param => {'table2.key3' => 5} |
|
2463 |
+ ); |
|
2464 |
+ |
|
2465 |
+For example, if you want to contain tag in join clause, |
|
2466 |
+you can pass parameter by C<param> option. |
|
2467 |
+ |
|
2418 | 2468 |
=item C<append> |
2419 | 2469 |
|
2420 | 2470 |
Append statement to last of SQL. This is string. |
... | ... |
@@ -72,6 +72,7 @@ my $model2; |
72 | 72 |
my $where; |
73 | 73 |
my $update_param; |
74 | 74 |
my $insert_param; |
75 |
+my $join; |
|
75 | 76 |
|
76 | 77 |
# Prepare table |
77 | 78 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
... | ... |
@@ -2097,7 +2098,6 @@ $dbi->insert(table => 'table1', param => {key1 => 2, key2 => 3}); |
2097 | 2098 |
$dbi->execute($CREATE_TABLE->{2}); |
2098 | 2099 |
$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4}); |
2099 | 2100 |
$dbi->insert(table => 'table2', param => {key1 => 2, key3 => 5}); |
2100 |
-$DB::single = 1; |
|
2101 | 2101 |
$rows = $dbi->select( |
2102 | 2102 |
table => 'table1', |
2103 | 2103 |
column => 'table1.key1 as table1_key1, key2, key3', |
... | ... |
@@ -2116,12 +2116,28 @@ $dbi->insert(table => 'table1', param => {key1 => 2, key2 => 3}); |
2116 | 2116 |
$dbi->execute($CREATE_TABLE->{2}); |
2117 | 2117 |
$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4}); |
2118 | 2118 |
$dbi->insert(table => 'table2', param => {key1 => 2, key3 => 5}); |
2119 |
+$join = ['inner join table2 on "table1"."key1" = "table2"."key1"']; |
|
2120 |
+$join = $dbi->replace( |
|
2121 |
+ $join, |
|
2122 |
+ 'inner join table2 on "table1"."key1" = "table2"."key1"', |
|
2123 |
+ 'inner join (select * from table2 where {= table2.key3}) as table2' |
|
2124 |
+); |
|
2125 |
+ |
|
2119 | 2126 |
$rows = $dbi->select( |
2120 | 2127 |
table => 'table1', |
2121 | 2128 |
column => 'table1.key1 as table1_key1, key2, key3', |
2122 | 2129 |
where => {'table1.key2' => 3}, |
2123 |
- join => ['inner join (select * from table2 where {= table2.key3})' . |
|
2124 |
- ' as table2 on "table1"."key1" = "table2"."key1"'], |
|
2130 |
+ join => ['inner join table2 on "table1"."key1" = "table2"."key1"'], |
|
2125 | 2131 |
param => {'table2.key3' => 5} |
2126 | 2132 |
)->fetch_hash_all; |
2127 | 2133 |
is_deeply($rows, [{table1_key1 => 2, key2 => 3, key3 => 5}]); |
2134 |
+ |
|
2135 |
+$join = ['inner join table2 on "table1"."key1" = "table2"."key1"']; |
|
2136 |
+eval { |
|
2137 |
+ $join = $dbi->replace( |
|
2138 |
+ $join, |
|
2139 |
+ 'pppp inner join table2 on "table1"."key1" = "table2"."key1"', |
|
2140 |
+ 'inner join (select * from table2 where {= table2.key3}) as table2' |
|
2141 |
+ ); |
|
2142 |
+}; |
|
2143 |
+like($@, qr/replace/); |