... | ... |
@@ -1,4 +1,6 @@ |
1 |
-0.1653 |
|
1 |
+0.1655 |
|
2 |
+ - remove experimental DBIx::Custom::Model relation |
|
3 |
+0.1654 |
|
2 | 4 |
- selection can contain where clause. |
3 | 5 |
0.1653 |
4 | 6 |
- added experimental DBIx::Custom::Result remove_filter() |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
package DBIx::Custom; |
2 | 2 |
|
3 |
-our $VERSION = '0.1654'; |
|
3 |
+our $VERSION = '0.1655'; |
|
4 | 4 |
|
5 | 5 |
use 5.008001; |
6 | 6 |
use strict; |
... | ... |
@@ -369,7 +369,9 @@ sub execute{ |
369 | 369 |
$arg_tables = [$arg_tables] |
370 | 370 |
unless ref $arg_tables eq 'ARRAY'; |
371 | 371 |
push @$tables, @$arg_tables; |
372 |
+ |
|
372 | 373 |
foreach my $table (@$tables) { |
374 |
+ next unless $table; |
|
373 | 375 |
$filter = { |
374 | 376 |
%$filter, |
375 | 377 |
%{$self->{filter}{out}->{$table} || {}} |
... | ... |
@@ -409,6 +411,7 @@ sub execute{ |
409 | 411 |
my $in_filter = {}; |
410 | 412 |
my $end_filter = {}; |
411 | 413 |
foreach my $table (@$tables) { |
414 |
+ next unless $table; |
|
412 | 415 |
$in_filter = { |
413 | 416 |
%$in_filter, |
414 | 417 |
%{$self->{filter}{in}{$table} || {}} |
... | ... |
@@ -532,6 +535,22 @@ sub insert_at { |
532 | 535 |
return $self->insert(param => $param, %args); |
533 | 536 |
} |
534 | 537 |
|
538 |
+sub insert_param { |
|
539 |
+ my ($self, $param) = @_; |
|
540 |
+ |
|
541 |
+ my @tag; |
|
542 |
+ |
|
543 |
+ push @tag, '{insert_param'; |
|
544 |
+ |
|
545 |
+ foreach my $column (keys %$param) { |
|
546 |
+ push @tag, $column; |
|
547 |
+ } |
|
548 |
+ |
|
549 |
+ push @tag, '}'; |
|
550 |
+ |
|
551 |
+ return join ' ', @tag; |
|
552 |
+} |
|
553 |
+ |
|
535 | 554 |
sub each_column { |
536 | 555 |
my ($self, $cb) = @_; |
537 | 556 |
|
... | ... |
@@ -593,7 +612,7 @@ sub register_filter { |
593 | 612 |
sub register_tag { shift->query_builder->register_tag(@_) } |
594 | 613 |
|
595 | 614 |
our %VALID_SELECT_ARGS |
596 |
- = map { $_ => 1 } qw/table column where append relation filter query selection/; |
|
615 |
+ = map { $_ => 1 } qw/table column where append relation filter query selection left_join/; |
|
597 | 616 |
|
598 | 617 |
sub select { |
599 | 618 |
my ($self, %args) = @_; |
... | ... |
@@ -616,7 +635,11 @@ sub select { |
616 | 635 |
my $relation = $args{relation} || {}; |
617 | 636 |
my $append = $args{append}; |
618 | 637 |
my $filter = $args{filter}; |
619 |
- |
|
638 |
+ my $left_join = $args{left_join} || []; |
|
639 |
+ |
|
640 |
+ my @left_join_tables; |
|
641 |
+ unshift @left_join_tables, $tables->[-1]; |
|
642 |
+ |
|
620 | 643 |
# Relation |
621 | 644 |
if (!$selection && keys %$relation) { |
622 | 645 |
foreach my $rcolumn (keys %$relation) { |
... | ... |
@@ -641,11 +664,13 @@ sub select { |
641 | 664 |
|
642 | 665 |
if ($selection) { |
643 | 666 |
push @sql, $selection; |
667 |
+ push @left_join_tables, @{$self->_tables($selection)}; |
|
644 | 668 |
} |
645 | 669 |
else { |
646 | 670 |
# Column clause |
647 | 671 |
if (@$columns) { |
648 | 672 |
foreach my $column (@$columns) { |
673 |
+ push @left_join_tables, @{$self->_tables($column)}; |
|
649 | 674 |
push @sql, ($column, ','); |
650 | 675 |
} |
651 | 676 |
pop @sql if $sql[-1] eq ','; |
... | ... |
@@ -680,6 +705,34 @@ sub select { |
680 | 705 |
|
681 | 706 |
# String where |
682 | 707 |
my $swhere = "$w"; |
708 |
+ |
|
709 |
+ # Table name in Where |
|
710 |
+ unshift @left_join_tables, @{$self->_tables($swhere)}; |
|
711 |
+ |
|
712 |
+ # Left join |
|
713 |
+ if (@$left_join) { |
|
714 |
+ for (my $i = 0; $i < @$left_join; $i += 2) { |
|
715 |
+ my $column1 = $left_join->[$i]; |
|
716 |
+ my $column2 = $left_join->[$i + 1]; |
|
717 |
+ |
|
718 |
+ my $table1 = (split (/\./, $column1))[0]; |
|
719 |
+ my $table2 = (split (/\./, $column2))[0]; |
|
720 |
+ |
|
721 |
+ my $table1_exists; |
|
722 |
+ my $table2_exists; |
|
723 |
+ |
|
724 |
+ foreach my $table (@left_join_tables) { |
|
725 |
+ $table1_exists = 1 if $table eq $table1; |
|
726 |
+ $table2_exists = 1 if $table eq $table2; |
|
727 |
+ } |
|
728 |
+ |
|
729 |
+ if ($table1_exists && $table2_exists) { |
|
730 |
+ push @sql, "left outer join $table2 on $column1 = $column2"; |
|
731 |
+ } |
|
732 |
+ } |
|
733 |
+ } |
|
734 |
+ |
|
735 |
+ # Add where |
|
683 | 736 |
push @sql, $swhere; |
684 | 737 |
|
685 | 738 |
# Relation |
... | ... |
@@ -694,7 +747,7 @@ sub select { |
694 | 747 |
} |
695 | 748 |
} |
696 | 749 |
pop @sql if $sql[-1] eq 'and'; |
697 |
- |
|
750 |
+ |
|
698 | 751 |
# Append statement |
699 | 752 |
push @sql, $append if $append; |
700 | 753 |
|
... | ... |
@@ -705,6 +758,8 @@ sub select { |
705 | 758 |
my $query = $self->create_query($sql); |
706 | 759 |
return $query if $args{query}; |
707 | 760 |
|
761 |
+ unshift @$tables, @left_join_tables; |
|
762 |
+ |
|
708 | 763 |
# Execute query |
709 | 764 |
my $result = $self->execute( |
710 | 765 |
$query, param => $where, filter => $filter, |
... | ... |
@@ -715,7 +770,7 @@ sub select { |
715 | 770 |
|
716 | 771 |
our %VALID_SELECT_AT_ARGS |
717 | 772 |
= map { $_ => 1 } qw/table column where append relation filter query selection |
718 |
- param primary_key/; |
|
773 |
+ param primary_key left_join/; |
|
719 | 774 |
|
720 | 775 |
sub select_at { |
721 | 776 |
my ($self, %args) = @_; |
... | ... |
@@ -999,6 +1054,22 @@ sub update_at { |
999 | 1054 |
return $self->update(where => $where, param => $param, %args); |
1000 | 1055 |
} |
1001 | 1056 |
|
1057 |
+sub update_param { |
|
1058 |
+ my ($self, $param) = @_; |
|
1059 |
+ |
|
1060 |
+ my @tag; |
|
1061 |
+ |
|
1062 |
+ push @tag, '{update_param'; |
|
1063 |
+ |
|
1064 |
+ foreach my $column (keys %$param) { |
|
1065 |
+ push @tag, $column; |
|
1066 |
+ } |
|
1067 |
+ |
|
1068 |
+ push @tag, '}'; |
|
1069 |
+ |
|
1070 |
+ return join ' ', @tag; |
|
1071 |
+} |
|
1072 |
+ |
|
1002 | 1073 |
sub where { |
1003 | 1074 |
my $self = shift; |
1004 | 1075 |
|
... | ... |
@@ -1070,6 +1141,20 @@ sub _croak { |
1070 | 1141 |
} |
1071 | 1142 |
} |
1072 | 1143 |
|
1144 |
+sub _tables { |
|
1145 |
+ my ($self, $source) = @_; |
|
1146 |
+ |
|
1147 |
+ my $tables = []; |
|
1148 |
+ |
|
1149 |
+ my $safety_name = $self->safety_column_name; |
|
1150 |
+ |
|
1151 |
+ while ($source =~ /\b(\w+)\./g) { |
|
1152 |
+ push @$tables, $1; |
|
1153 |
+ } |
|
1154 |
+ |
|
1155 |
+ return $tables; |
|
1156 |
+} |
|
1157 |
+ |
|
1073 | 1158 |
# DEPRECATED! |
1074 | 1159 |
__PACKAGE__->attr( |
1075 | 1160 |
dbi_options => sub { {} }, |
... | ... |
@@ -15,7 +15,6 @@ __PACKAGE__->attr( |
15 | 15 |
columns => sub { [] }, |
16 | 16 |
filter => sub { [] }, |
17 | 17 |
primary_key => sub { [] }, |
18 |
- relation => sub { {} } |
|
19 | 18 |
); |
20 | 19 |
|
21 | 20 |
our $AUTOLOAD; |
... | ... |
@@ -117,7 +116,6 @@ sub select { |
117 | 116 |
my $self = shift; |
118 | 117 |
$self->dbi->select( |
119 | 118 |
table => $self->table, |
120 |
- relation => $self->relation, |
|
121 | 119 |
@_ |
122 | 120 |
); |
123 | 121 |
} |
... | ... |
@@ -128,7 +126,6 @@ sub select_at { |
128 | 126 |
return $self->dbi->select_at( |
129 | 127 |
table => $self->table, |
130 | 128 |
primary_key => $self->primary_key, |
131 |
- relation => $self->relation, |
|
132 | 129 |
@_ |
133 | 130 |
); |
134 | 131 |
} |
... | ... |
@@ -1300,7 +1300,7 @@ test 'selection'; |
1300 | 1300 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
1301 | 1301 |
$dbi->execute($CREATE_TABLE->{0}); |
1302 | 1302 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
1303 |
-$result = $dbi->select(selection => '* from table1', where => {key1 => 1}); |
|
1303 |
+$result = $dbi->select(selection => '* from {table table1}', where => {key1 => 1}); |
|
1304 | 1304 |
is_deeply($result->fetch_hash_all, [{key1 => 1, key2 => 2}]); |
1305 | 1305 |
|
1306 | 1306 |
test 'Model class'; |
... | ... |
@@ -1586,8 +1586,6 @@ test 'columns'; |
1586 | 1586 |
use MyDBI1; |
1587 | 1587 |
$dbi = MyDBI1->connect($NEW_ARGS->{0}); |
1588 | 1588 |
$model = $dbi->model('book'); |
1589 |
-$model->relation({'book.id' => 'company.id'}); |
|
1590 |
-is_deeply($model->relation, {'book.id' => 'company.id'}); |
|
1591 | 1589 |
|
1592 | 1590 |
|
1593 | 1591 |
test 'model delete_at'; |
... | ... |
@@ -1654,7 +1652,7 @@ is($row->{key2}, 2); |
1654 | 1652 |
is($row->{key3}, 3); |
1655 | 1653 |
|
1656 | 1654 |
|
1657 |
-test 'model select relation'; |
|
1655 |
+test 'column_clause'; |
|
1658 | 1656 |
{ |
1659 | 1657 |
package MyDBI7; |
1660 | 1658 |
|
... | ... |
@@ -1672,21 +1670,6 @@ test 'model select relation'; |
1672 | 1670 |
$dbi = MyDBI7->connect($NEW_ARGS->{0}); |
1673 | 1671 |
$dbi->execute($CREATE_TABLE->{0}); |
1674 | 1672 |
$dbi->execute($CREATE_TABLE->{2}); |
1675 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
1676 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 3}); |
|
1677 |
-$result = $dbi->model('table1')->select(column => ['key3'], where => {'table1.key1' => 1}); |
|
1678 |
-is($result->fetch_hash_first->{key3}, 3); |
|
1679 |
-$result = $dbi->model('table1')->select_at(column => ['key3'], where => [1]); |
|
1680 |
-is($result->fetch_hash_first->{key3}, 3); |
|
1681 |
-$dbi->execute('create table table3 (key1);'); |
|
1682 |
-$dbi->model('table3')->insert(param => {key1 => 'a'}); |
|
1683 |
-is_deeply($dbi->model('table3')->select(where => {key1 => 'a'})->fetch_hash_first, |
|
1684 |
- {key1 => 'A'}); |
|
1685 |
- |
|
1686 |
-test 'column_clause'; |
|
1687 |
-$dbi = MyDBI7->connect($NEW_ARGS->{0}); |
|
1688 |
-$dbi->execute($CREATE_TABLE->{0}); |
|
1689 |
-$dbi->execute($CREATE_TABLE->{2}); |
|
1690 | 1673 |
$dbi->setup_model; |
1691 | 1674 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
1692 | 1675 |
$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 3}); |
... | ... |
@@ -1695,7 +1678,7 @@ $result = $model->select(column => $model->column_clause, where => {'table1.key1 |
1695 | 1678 |
is_deeply($result->fetch_hash_first, {key1 => 1, key2 => 2}); |
1696 | 1679 |
$result = $model->select(column => $model->column_clause(remove => ['key1']), where => {'table1.key1' => 1}); |
1697 | 1680 |
is_deeply($result->fetch_hash_first, {key2 => 2}); |
1698 |
-$result = $model->select(column => $model->column_clause(add => ['key3']), where => {'table1.key1' => 1}); |
|
1681 |
+$result = $model->select(relation => {'table1.key1' => 'table2.key1'}, column => $model->column_clause(add => ['key3']), where => {'table1.key1' => 1}); |
|
1699 | 1682 |
is_deeply($result->fetch_hash_first, {key1 => 1, key2 => 2, key3 => 3}); |
1700 | 1683 |
|
1701 | 1684 |
|