Showing 4 changed files with 109 additions and 53 deletions
+6
Changes
... ...
@@ -1,3 +1,9 @@
1
+0.1728
2
+    - update_param is DEPRECATED, use assing_clause instead.
3
+    - assing_param is renamed to assing_clause, assing_param is DEPRECATED!
4
+    - insert_param is renamed to values_clause, insert_param is DEPRECATED!
5
+0.1727
6
+    - improved join clause parsing
1 7
 0.1726
2 8
     - improved join clause parsing
3 9
 0.1725
+52 -32
lib/DBIx/Custom.pm
... ...
@@ -1,7 +1,7 @@
1 1
 package DBIx::Custom;
2 2
 use Object::Simple -base;
3 3
 
4
-our $VERSION = '0.1726';
4
+our $VERSION = '0.1728';
5 5
 use 5.008001;
6 6
 
7 7
 use Carp 'croak';
... ...
@@ -119,7 +119,7 @@ sub AUTOLOAD {
119 119
     }
120 120
 }
121 121
 
122
-sub assign_param {
122
+sub assign_clause {
123 123
     my ($self, $param, $opts) = @_;
124 124
     
125 125
     my $wrap = $opts->{wrap} || {};
... ...
@@ -636,14 +636,14 @@ sub insert {
636 636
     $sql .= "insert ";
637 637
     $sql .= "$prefix " if defined $prefix;
638 638
     $sql .= "into " . $self->_q($table) . " "
639
-      . $self->insert_param($param, {wrap => $wrap}) . " ";
639
+      . $self->values_clause($param, {wrap => $wrap}) . " ";
640 640
     $sql .= $append if defined $append;
641 641
     
642 642
     # Execute query
643 643
     return $self->execute($sql, $param, table => $table, %args);
644 644
 }
645 645
 
646
-sub insert_param {
646
+sub values_clause {
647 647
     my ($self, $param, $opts) = @_;
648 648
     
649 649
     my $wrap = $opts->{wrap} || {};
... ...
@@ -1138,7 +1138,7 @@ sub update {
1138 1138
     }
1139 1139
 
1140 1140
     # Update clause
1141
-    my $update_clause = $self->update_param($param, {wrap => $wrap});
1141
+    my $assign_clause = $self->assign_clause($param, {wrap => $wrap});
1142 1142
 
1143 1143
     # Where
1144 1144
     $where = $self->_create_param_from_id($id, $primary_key) if defined $id;
... ...
@@ -1167,7 +1167,7 @@ sub update {
1167 1167
     my $sql;
1168 1168
     $sql .= "update ";
1169 1169
     $sql .= "$prefix " if defined $prefix;
1170
-    $sql .= $self->_q($table) . " $update_clause $where_clause ";
1170
+    $sql .= $self->_q($table) . " set $assign_clause $where_clause ";
1171 1171
     $sql .= $append if defined $append;
1172 1172
     
1173 1173
     # Execute query
... ...
@@ -1176,16 +1176,6 @@ sub update {
1176 1176
 
1177 1177
 sub update_all { shift->update(allow_update_all => 1, @_) };
1178 1178
 
1179
-sub update_param {
1180
-    my ($self, $param, $opts) = @_;
1181
-    
1182
-    # Create update parameter tag
1183
-    my $tag = $self->assign_param($param, $opts);
1184
-    $tag = "set $tag" unless $opts->{no_set};
1185
-
1186
-    return $tag;
1187
-}
1188
-
1189 1179
 sub update_timestamp {
1190 1180
     my $self = shift;
1191 1181
     
... ...
@@ -1452,7 +1442,7 @@ sub _push_join {
1452 1442
             
1453 1443
             my @j_clauses = reverse split /\s(and|on)\s/, $j_clause;
1454 1444
             my $c = $self->safety_character;
1455
-            my $join_re = qr/(?:^|\s)($c+)\.$c+[^$c]+($c+)\.$c+/;
1445
+            my $join_re = qr/($c+)\.$c+[^$c].*?($c+)\.$c+/sm;
1456 1446
             for my $clause (@j_clauses) {
1457 1447
                 if ($clause =~ $join_re) {
1458 1448
                     $table1 = $1;
... ...
@@ -1663,6 +1653,32 @@ sub _apply_filter {
1663 1653
     return $self;
1664 1654
 }
1665 1655
 
1656
+# DEPRECATED!
1657
+has 'data_source';
1658
+has dbi_options => sub { {} };
1659
+has filter_check  => 1;
1660
+has 'reserved_word_quote';
1661
+
1662
+# DEPRECATED!
1663
+sub assign_param {
1664
+    my $self = shift;
1665
+    warn "assing_param is DEPRECATED! use assign_clause instead";
1666
+    return $self->assign_clause(@_);
1667
+}
1668
+
1669
+# DEPRECATED
1670
+sub update_param {
1671
+    my ($self, $param, $opts) = @_;
1672
+    
1673
+    warn "update_param is DEPRECATED! use assing_clause instead.";
1674
+    
1675
+    # Create update parameter tag
1676
+    my $tag = $self->assign_clause($param, $opts);
1677
+    $tag = "set $tag" unless $opts->{no_set};
1678
+
1679
+    return $tag;
1680
+}
1681
+
1666 1682
 # DEPRECATED!
1667 1683
 sub create_query {
1668 1684
     warn "create_query is DEPRECATED! use query option of each method";
... ...
@@ -1813,12 +1829,6 @@ sub register_tag_processor {
1813 1829
     return $self;
1814 1830
 }
1815 1831
 
1816
-# DEPRECATED!
1817
-has 'data_source';
1818
-has dbi_options => sub { {} };
1819
-has filter_check  => 1;
1820
-has 'reserved_word_quote';
1821
-
1822 1832
 # DEPRECATED!
1823 1833
 sub default_bind_filter {
1824 1834
     my $self = shift;
... ...
@@ -1868,6 +1878,13 @@ sub default_fetch_filter {
1868 1878
     return $self->{default_in_filter};
1869 1879
 }
1870 1880
 
1881
+# DEPRECATED!
1882
+sub insert_param {
1883
+    my $self = shift;
1884
+    warn "insert_param is DEPRECATED! use values_clause instead";
1885
+    return $self->values_clause(@_);
1886
+}
1887
+
1871 1888
 # DEPRECATED!
1872 1889
 sub insert_param_tag {
1873 1890
     warn "insert_param_tag is DEPRECATED! " .
... ...
@@ -2253,15 +2270,17 @@ in C<type rule>'s C<from1> and C<from2> section.
2253 2270
 Get available type names. You can use these type names in
2254 2271
 C<type_rule>'s C<into1> and C<into2> section.
2255 2272
 
2256
-=head2 C<assign_param>
2273
+=head2 C<assign_clause>
2257 2274
 
2258
-    my $assign_param = $dbi->assign_param({title => 'a', age => 2});
2275
+    my $assign_clause = $dbi->assign_clause({title => 'a', age => 2});
2259 2276
 
2260
-Create assign parameter.
2277
+Create assign clause
2261 2278
 
2262 2279
     title = :title, author = :author
2263 2280
 
2264
-This is equal to C<update_param> exept that set is not added.
2281
+This is used to create update clause.
2282
+
2283
+    "update book set " . $dbi->assign_clause({title => 'a', age => 2});
2265 2284
 
2266 2285
 =head2 C<column>
2267 2286
 
... ...
@@ -2812,11 +2831,11 @@ is executed, the following SQL is executed.
2812 2831
 
2813 2832
 =over 4
2814 2833
 
2815
-=head2 C<insert_param>
2834
+=head2 C<values_clause>
2816 2835
 
2817
-    my $insert_param = $dbi->insert_param({title => 'a', age => 2});
2836
+    my $values_clause = $dbi->values_clause({title => 'a', age => 2});
2818 2837
 
2819
-Create insert parameters.
2838
+Create values clause.
2820 2839
 
2821 2840
     (title, author) values (title = :title, age = :age);
2822 2841
 
... ...
@@ -3477,6 +3496,9 @@ L<DBIx::Custom>
3477 3496
     cache_method # will be removed at 2017/1/1
3478 3497
     
3479 3498
     # Methods
3499
+    assign_param # will be removed at 2017/1/1
3500
+    update_param # will be removed at 2017/1/1
3501
+    insert_param # will be removed at 2017/1/1
3480 3502
     create_query # will be removed at 2017/1/1
3481 3503
     apply_filter # will be removed at 2017/1/1
3482 3504
     select_at # will be removed at 2017/1/1
... ...
@@ -3561,8 +3583,6 @@ I extend one year each time he tell me it.
3561 3583
 
3562 3584
 EXPERIMENTAL functionality will be changed without warnings.
3563 3585
 
3564
-This policy was changed at 2011/6/28
3565
-
3566 3586
 =head1 BUGS
3567 3587
 
3568 3588
 Please tell me bugs if found.
+32 -19
t/common.t
... ...
@@ -13,7 +13,7 @@ plan skip_all => $ENV{DBIX_CUSTOM_SKIP_MESSAGE} || 'common.t is always skipped'
13 13
 
14 14
 plan 'no_plan';
15 15
 
16
-$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
16
+#$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
17 17
 sub test { print "# $_[0]\n" }
18 18
 
19 19
 # Constant
... ...
@@ -78,6 +78,8 @@ my $join;
78 78
 my $binary;
79 79
 my $user_table_info;
80 80
 my $user_column_info;
81
+my $values_clause;
82
+my $assign_clause;
81 83
 
82 84
 require MyDBI1;
83 85
 {
... ...
@@ -2004,14 +2006,14 @@ $result = $model->select(
2004 2006
 is_deeply($result->one,
2005 2007
           {$key1 => 1, $key2 => 2, "${table2}__$key1" => 1, "${table2}__$key3" => 3});
2006 2008
 
2007
-test 'insert_param';
2009
+test 'values_clause';
2008 2010
 $dbi = DBIx::Custom->connect;
2009 2011
 eval { $dbi->execute("drop table $table1") };
2010 2012
 $dbi->execute($create_table1_2);
2011 2013
 $param = {$key1 => 1, $key2 => 2};
2012
-$insert_param = $dbi->insert_param($param);
2014
+$values_clause = $dbi->values_clause($param);
2013 2015
 $sql = <<"EOS";
2014
-insert into $table1 $insert_param
2016
+insert into $table1 $values_clause
2015 2017
 EOS
2016 2018
 $dbi->execute($sql, param => $param, table => $table1);
2017 2019
 is($dbi->select(table => $table1)->one->{$key1}, 1);
... ...
@@ -2021,15 +2023,15 @@ $dbi = DBIx::Custom->connect;
2021 2023
 eval { $dbi->execute("drop table $table1") };
2022 2024
 $dbi->execute($create_table1_2);
2023 2025
 $param = {$key1 => 1, $key2 => 2};
2024
-$insert_param = $dbi->insert_param($param);
2026
+$values_clause = $dbi->insert_param($param);
2025 2027
 $sql = <<"EOS";
2026
-insert into $table1 $insert_param
2028
+insert into $table1 $values_clause
2027 2029
 EOS
2028 2030
 $dbi->execute($sql, param => $param, table => $table1);
2029 2031
 is($dbi->select(table => $table1)->one->{$key1}, 1);
2030 2032
 is($dbi->select(table => $table1)->one->{$key2}, 2);
2031 2033
 
2032
-eval { $dbi->insert_param({";" => 1}) };
2034
+eval { $dbi->values_clause({";" => 1}) };
2033 2035
 like($@, qr/not safety/);
2034 2036
 
2035 2037
 test 'mycolumn';
... ...
@@ -3208,7 +3210,7 @@ $model = $dbi->create_model(
3208 3210
 $model->method(foo => sub { shift->select(@_) });
3209 3211
 is_deeply($model->foo->one, {$key1 => 1, $key3 => 3});
3210 3212
 
3211
-test 'update_param';
3213
+test 'assign_clause';
3212 3214
 $dbi = DBIx::Custom->connect;
3213 3215
 eval { $dbi->execute("drop table $table1") };
3214 3216
 $dbi->execute($create_table1_2);
... ...
@@ -3216,9 +3218,9 @@ $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $ke
3216 3218
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
3217 3219
 
3218 3220
 $param = {$key2 => 11};
3219
-$update_param = $dbi->update_param($param);
3221
+$assign_clause = $dbi->assign_clause($param);
3220 3222
 $sql = <<"EOS";
3221
-update $table1 $update_param
3223
+update $table1 set $assign_clause
3222 3224
 where $key1 = 1
3223 3225
 EOS
3224 3226
 $dbi->execute($sql, param => $param);
... ...
@@ -3236,9 +3238,9 @@ $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $ke
3236 3238
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
3237 3239
 
3238 3240
 $param = {$key2 => 11, $key3 => 33};
3239
-$update_param = $dbi->update_param($param);
3241
+$assign_clause = $dbi->assign_clause($param);
3240 3242
 $sql = <<"EOS";
3241
-update $table1 $update_param
3243
+update $table1 set $assign_clause
3242 3244
 where $key1 = 1
3243 3245
 EOS
3244 3246
 $dbi->execute($sql, param => $param);
... ...
@@ -3255,9 +3257,9 @@ $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $ke
3255 3257
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
3256 3258
 
3257 3259
 $param = {$key2 => 11, $key3 => 33};
3258
-$update_param = $dbi->update_param($param, {no_set => 1});
3260
+$assign_clause = $dbi->update_param($param, {no_set => 1});
3259 3261
 $sql = <<"EOS";
3260
-update $table1 set $update_param
3262
+update $table1 set $assign_clause
3261 3263
 where $key1 = 1
3262 3264
 EOS
3263 3265
 $dbi->execute($sql, param => $param);
... ...
@@ -3268,11 +3270,9 @@ is_deeply($rows, [{$key1 => 1, $key2 => 11, $key3 => 33, $key4 => 4, $key5 => 5}
3268 3270
                   "update param no_set");
3269 3271
 
3270 3272
             
3271
-eval { $dbi->update_param({";" => 1}) };
3273
+eval { $dbi->assign_clause({";" => 1}) };
3272 3274
 like($@, qr/not safety/);
3273 3275
 
3274
-
3275
-test 'update_param';
3276 3276
 $dbi = DBIx::Custom->connect;
3277 3277
 eval { $dbi->execute("drop table $table1") };
3278 3278
 $dbi->execute($create_table1_2);
... ...
@@ -3280,9 +3280,22 @@ $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $ke
3280 3280
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
3281 3281
 
3282 3282
 $param = {$key2 => 11};
3283
-$update_param = $dbi->assign_param($param);
3283
+$assign_clause = $dbi->assign_param($param);
3284
+$sql = <<"EOS";
3285
+update $table1 set $assign_clause
3286
+where $key1 = 1
3287
+EOS
3288
+$dbi->execute($sql, param => $param, table => $table1);
3289
+$result = $dbi->execute("select * from $table1 order by $key1");
3290
+$rows   = $result->all;
3291
+is_deeply($rows, [{$key1 => 1, $key2 => 11, $key3 => 3, $key4 => 4, $key5 => 5},
3292
+                  {$key1 => 6, $key2 => 7,  $key3 => 8, $key4 => 9, $key5 => 10}],
3293
+                  "basic");
3294
+
3295
+$param = {$key2 => 11};
3296
+$assign_clause = $dbi->assign_clause($param);
3284 3297
 $sql = <<"EOS";
3285
-update $table1 set $update_param
3298
+update $table1 set $assign_clause
3286 3299
 where $key1 = 1
3287 3300
 EOS
3288 3301
 $dbi->execute($sql, param => $param, table => $table1);
+19 -2
t/sqlite.t
... ...
@@ -282,7 +282,24 @@ $result = $dbi->select(
282 282
     table => 'table1',
283 283
     column => [{table2 => ['key3']}],
284 284
     join => [
285
-        "left outer join table2 on coalesce(table2.key3, 0) > '3' and table1.key1 = table2.key1"
285
+        "left outer join table2 on coalesce(table1.key1, 0) = coalesce(table2.key1, 0) and table2.key3 > '3'"
286 286
     ]
287 287
 );
288
-is_deeply($result->all, [{"table2.key3" => 4}]);
288
+is_deeply($result->all, [{"table2.key3" => 4}]);
289
+
290
+$dbi = DBIx::Custom->connect;
291
+eval { $dbi->execute("drop table table1") };
292
+eval { $dbi->execute("drop table table2") };
293
+$dbi->execute($create_table1);
294
+$dbi->execute("create table table2 (key1, key3)");
295
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
296
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4});
297
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 1});
298
+$result = $dbi->select(
299
+    table => 'table1',
300
+    column => [{table2 => ['key3']}],
301
+    join => [
302
+        "left outer join table2 on table2.key3 > '3' and coalesce(table1.key1, 0) = coalesce(table2.key1, 0)"
303
+    ]
304
+);
305
+is_deeply($result->all, [{"table2.key3" => 4}]);