| ... | ... | 
                  @@ -1,4 +1,5 @@  | 
              
| 1 | 1 | 
                  0.1691  | 
              
| 2 | 
                  + - EXPERIMETAL column method and table_alias think about "-" separator  | 
              |
| 2 | 3 | 
                  - EXPERIMTANL column method think about separator  | 
              
| 3 | 4 | 
                  - removed EXPERIMENTAL col method.  | 
              
| 4 | 5 | 
                  - added EXPERIMENTAL separater method  | 
              
| ... | ... | 
                  @@ -79,76 +79,6 @@ sub AUTOLOAD {
                 | 
              
| 79 | 79 | 
                  }  | 
              
| 80 | 80 | 
                  }  | 
              
| 81 | 81 | 
                   | 
              
| 82 | 
                  -sub apply_filter { shift->_apply_filter(@_) }
                 | 
              |
| 83 | 
                  -  | 
              |
| 84 | 
                  -sub _apply_filter {
                 | 
              |
| 85 | 
                  - my ($self, $table, @cinfos) = @_;  | 
              |
| 86 | 
                  -  | 
              |
| 87 | 
                  - # Initialize filters  | 
              |
| 88 | 
                  -    $self->{filter} ||= {};
                 | 
              |
| 89 | 
                  -    $self->{filter}{out} ||= {};
                 | 
              |
| 90 | 
                  -    $self->{filter}{in} ||= {};
                 | 
              |
| 91 | 
                  -    $self->{filter}{end} ||= {};
                 | 
              |
| 92 | 
                  -  | 
              |
| 93 | 
                  - # Usage  | 
              |
| 94 | 
                  -    my $usage = "Usage: \$dbi->apply_filter(" .
                 | 
              |
| 95 | 
                  -                "TABLE, COLUMN1, {in => INFILTER1, out => OUTFILTER1, end => ENDFILTER1}, " .
                 | 
              |
| 96 | 
                  -                "COLUMN2, {in => INFILTER2, out => OUTFILTER2, end => ENDFILTER2}, ...)";
                 | 
              |
| 97 | 
                  -  | 
              |
| 98 | 
                  - # Apply filter  | 
              |
| 99 | 
                  -    for (my $i = 0; $i < @cinfos; $i += 2) {
                 | 
              |
| 100 | 
                  -  | 
              |
| 101 | 
                  - # Column  | 
              |
| 102 | 
                  - my $column = $cinfos[$i];  | 
              |
| 103 | 
                  -        if (ref $column eq 'ARRAY') {
                 | 
              |
| 104 | 
                  -            foreach my $c (@$column) {
                 | 
              |
| 105 | 
                  - push @cinfos, $c, $cinfos[$i + 1];  | 
              |
| 106 | 
                  - }  | 
              |
| 107 | 
                  - next;  | 
              |
| 108 | 
                  - }  | 
              |
| 109 | 
                  -  | 
              |
| 110 | 
                  - # Filter infomation  | 
              |
| 111 | 
                  -        my $finfo = $cinfos[$i + 1] || {};
                 | 
              |
| 112 | 
                  - croak "$usage (table: $table) " . _subname  | 
              |
| 113 | 
                  - unless ref $finfo eq 'HASH';  | 
              |
| 114 | 
                  -        foreach my $ftype (keys %$finfo) {
                 | 
              |
| 115 | 
                  - croak "$usage (table: $table) " . _subname  | 
              |
| 116 | 
                  - unless $ftype eq 'in' || $ftype eq 'out' || $ftype eq 'end';  | 
              |
| 117 | 
                  - }  | 
              |
| 118 | 
                  -  | 
              |
| 119 | 
                  - # Set filters  | 
              |
| 120 | 
                  -        foreach my $way (qw/in out end/) {
                 | 
              |
| 121 | 
                  -  | 
              |
| 122 | 
                  - # Filter  | 
              |
| 123 | 
                  -            my $filter = $finfo->{$way};
                 | 
              |
| 124 | 
                  -  | 
              |
| 125 | 
                  - # Filter state  | 
              |
| 126 | 
                  -            my $state = !exists $finfo->{$way} ? 'not_exists'
                 | 
              |
| 127 | 
                  - : !defined $filter ? 'not_defined'  | 
              |
| 128 | 
                  - : ref $filter eq 'CODE' ? 'code'  | 
              |
| 129 | 
                  - : 'name';  | 
              |
| 130 | 
                  -  | 
              |
| 131 | 
                  - # Filter is not exists  | 
              |
| 132 | 
                  - next if $state eq 'not_exists';  | 
              |
| 133 | 
                  -  | 
              |
| 134 | 
                  - # Check filter name  | 
              |
| 135 | 
                  -            croak qq{Filter "$filter" is not registered } . _subname
                 | 
              |
| 136 | 
                  - if $state eq 'name'  | 
              |
| 137 | 
                  -               && ! exists $self->filters->{$filter};
                 | 
              |
| 138 | 
                  -  | 
              |
| 139 | 
                  - # Set filter  | 
              |
| 140 | 
                  - my $f = $state eq 'not_defined' ? undef  | 
              |
| 141 | 
                  - : $state eq 'code' ? $filter  | 
              |
| 142 | 
                  -                  : $self->filters->{$filter};
                 | 
              |
| 143 | 
                  -            $self->{filter}{$way}{$table}{$column} = $f;
                 | 
              |
| 144 | 
                  -            $self->{filter}{$way}{$table}{"$table.$column"} = $f;
                 | 
              |
| 145 | 
                  -            $self->{filter}{$way}{$table}{"${table}__$column"} = $f;
                 | 
              |
| 146 | 
                  - }  | 
              |
| 147 | 
                  - }  | 
              |
| 148 | 
                  -  | 
              |
| 149 | 
                  - return $self;  | 
              |
| 150 | 
                  -}  | 
              |
| 151 | 
                  -  | 
              |
| 152 | 82 | 
                   sub assign_param {
                 | 
              
| 153 | 83 | 
                  my ($self, $param) = @_;  | 
              
| 154 | 84 | 
                   | 
              
| ... | ... | 
                  @@ -375,14 +305,14 @@ sub create_model {
                 | 
              
| 375 | 305 | 
                  my $filter = ref $model->filter eq 'HASH'  | 
              
| 376 | 306 | 
                                  ? [%{$model->filter}]
                 | 
              
| 377 | 307 | 
                  : $model->filter;  | 
              
| 378 | 
                  - $self->apply_filter($model->table, @$filter);  | 
              |
| 308 | 
                  + $self->_apply_filter($model->table, @$filter);  | 
              |
| 379 | 309 | 
                  my $result_filter = ref $model->result_filter eq 'HASH'  | 
              
| 380 | 310 | 
                                  ? [%{$model->result_filter}]
                 | 
              
| 381 | 311 | 
                  : $model->result_filter;  | 
              
| 382 | 312 | 
                       for (my $i = 1; $i < @$result_filter; $i += 2) {
                 | 
              
| 383 | 313 | 
                           $result_filter->[$i] = {in => $result_filter->[$i]};
                 | 
              
| 384 | 314 | 
                  }  | 
              
| 385 | 
                  - $self->apply_filter($model->table, @$result_filter);  | 
              |
| 315 | 
                  + $self->_apply_filter($model->table, @$result_filter);  | 
              |
| 386 | 316 | 
                   | 
              
| 387 | 317 | 
                  # Associate table with model  | 
              
| 388 | 318 | 
                  croak "Table name is duplicated " . _subname  | 
              
| ... | ... | 
                  @@ -478,6 +408,7 @@ sub execute {
                 | 
              
| 478 | 408 | 
                  my $filter_name_alias = $filter_name;  | 
              
| 479 | 409 | 
                  $filter_name_alias =~ s/^$alias\./$table\./;  | 
              
| 480 | 410 | 
                                   $filter_name_alias =~ s/^${alias}__/${table}__/; 
                 | 
              
| 411 | 
                  +                $filter_name_alias =~ s/^${alias}-/${table}-/; 
                 | 
              |
| 481 | 412 | 
                                   $self->{filter}{$type}{$table}{$filter_name_alias}
                 | 
              
| 482 | 413 | 
                                     = $self->{filter}{$type}{$alias}{$filter_name}
                 | 
              
| 483 | 414 | 
                  }  | 
              
| ... | ... | 
                  @@ -1182,6 +1113,75 @@ sub where {
                 | 
              
| 1182 | 1113 | 
                  );  | 
              
| 1183 | 1114 | 
                  }  | 
              
| 1184 | 1115 | 
                   | 
              
| 1116 | 
                  +sub _apply_filter {
                 | 
              |
| 1117 | 
                  + my ($self, $table, @cinfos) = @_;  | 
              |
| 1118 | 
                  +  | 
              |
| 1119 | 
                  + # Initialize filters  | 
              |
| 1120 | 
                  +    $self->{filter} ||= {};
                 | 
              |
| 1121 | 
                  +    $self->{filter}{out} ||= {};
                 | 
              |
| 1122 | 
                  +    $self->{filter}{in} ||= {};
                 | 
              |
| 1123 | 
                  +    $self->{filter}{end} ||= {};
                 | 
              |
| 1124 | 
                  +  | 
              |
| 1125 | 
                  + # Usage  | 
              |
| 1126 | 
                  +    my $usage = "Usage: \$dbi->apply_filter(" .
                 | 
              |
| 1127 | 
                  +                "TABLE, COLUMN1, {in => INFILTER1, out => OUTFILTER1, end => ENDFILTER1}, " .
                 | 
              |
| 1128 | 
                  +                "COLUMN2, {in => INFILTER2, out => OUTFILTER2, end => ENDFILTER2}, ...)";
                 | 
              |
| 1129 | 
                  +  | 
              |
| 1130 | 
                  + # Apply filter  | 
              |
| 1131 | 
                  +    for (my $i = 0; $i < @cinfos; $i += 2) {
                 | 
              |
| 1132 | 
                  +  | 
              |
| 1133 | 
                  + # Column  | 
              |
| 1134 | 
                  + my $column = $cinfos[$i];  | 
              |
| 1135 | 
                  +        if (ref $column eq 'ARRAY') {
                 | 
              |
| 1136 | 
                  +            foreach my $c (@$column) {
                 | 
              |
| 1137 | 
                  + push @cinfos, $c, $cinfos[$i + 1];  | 
              |
| 1138 | 
                  + }  | 
              |
| 1139 | 
                  + next;  | 
              |
| 1140 | 
                  + }  | 
              |
| 1141 | 
                  +  | 
              |
| 1142 | 
                  + # Filter infomation  | 
              |
| 1143 | 
                  +        my $finfo = $cinfos[$i + 1] || {};
                 | 
              |
| 1144 | 
                  + croak "$usage (table: $table) " . _subname  | 
              |
| 1145 | 
                  + unless ref $finfo eq 'HASH';  | 
              |
| 1146 | 
                  +        foreach my $ftype (keys %$finfo) {
                 | 
              |
| 1147 | 
                  + croak "$usage (table: $table) " . _subname  | 
              |
| 1148 | 
                  + unless $ftype eq 'in' || $ftype eq 'out' || $ftype eq 'end';  | 
              |
| 1149 | 
                  + }  | 
              |
| 1150 | 
                  +  | 
              |
| 1151 | 
                  + # Set filters  | 
              |
| 1152 | 
                  +        foreach my $way (qw/in out end/) {
                 | 
              |
| 1153 | 
                  +  | 
              |
| 1154 | 
                  + # Filter  | 
              |
| 1155 | 
                  +            my $filter = $finfo->{$way};
                 | 
              |
| 1156 | 
                  +  | 
              |
| 1157 | 
                  + # Filter state  | 
              |
| 1158 | 
                  +            my $state = !exists $finfo->{$way} ? 'not_exists'
                 | 
              |
| 1159 | 
                  + : !defined $filter ? 'not_defined'  | 
              |
| 1160 | 
                  + : ref $filter eq 'CODE' ? 'code'  | 
              |
| 1161 | 
                  + : 'name';  | 
              |
| 1162 | 
                  +  | 
              |
| 1163 | 
                  + # Filter is not exists  | 
              |
| 1164 | 
                  + next if $state eq 'not_exists';  | 
              |
| 1165 | 
                  +  | 
              |
| 1166 | 
                  + # Check filter name  | 
              |
| 1167 | 
                  +            croak qq{Filter "$filter" is not registered } . _subname
                 | 
              |
| 1168 | 
                  + if $state eq 'name'  | 
              |
| 1169 | 
                  +               && ! exists $self->filters->{$filter};
                 | 
              |
| 1170 | 
                  +  | 
              |
| 1171 | 
                  + # Set filter  | 
              |
| 1172 | 
                  + my $f = $state eq 'not_defined' ? undef  | 
              |
| 1173 | 
                  + : $state eq 'code' ? $filter  | 
              |
| 1174 | 
                  +                  : $self->filters->{$filter};
                 | 
              |
| 1175 | 
                  +            $self->{filter}{$way}{$table}{$column} = $f;
                 | 
              |
| 1176 | 
                  +            $self->{filter}{$way}{$table}{"$table.$column"} = $f;
                 | 
              |
| 1177 | 
                  +            $self->{filter}{$way}{$table}{"${table}__$column"} = $f;
                 | 
              |
| 1178 | 
                  +            $self->{filter}{$way}{$table}{"${table}-$column"} = $f;
                 | 
              |
| 1179 | 
                  + }  | 
              |
| 1180 | 
                  + }  | 
              |
| 1181 | 
                  +  | 
              |
| 1182 | 
                  + return $self;  | 
              |
| 1183 | 
                  +}  | 
              |
| 1184 | 
                  +  | 
              |
| 1185 | 1185 | 
                   sub _create_bind_values {
                 | 
              
| 1186 | 1186 | 
                  my ($self, $params, $columns, $filter, $type) = @_;  | 
              
| 1187 | 1187 | 
                   | 
              
| ... | ... | 
                  @@ -1424,6 +1424,17 @@ sub _where_to_obj {
                 | 
              
| 1424 | 1424 | 
                  return $obj;  | 
              
| 1425 | 1425 | 
                  }  | 
              
| 1426 | 1426 | 
                   | 
              
| 1427 | 
                  +# DEPRECATED!  | 
              |
| 1428 | 
                  +sub apply_filter {
                 | 
              |
| 1429 | 
                  + my $self = shift;  | 
              |
| 1430 | 
                  +  | 
              |
| 1431 | 
                  + warn "apply_filter is DEPRECATED! " .  | 
              |
| 1432 | 
                  + "use type_rule method, DBIx::Custom::Result filter method, " .  | 
              |
| 1433 | 
                  + "and DBIx::Custom::Model result_filter method instead";  | 
              |
| 1434 | 
                  +  | 
              |
| 1435 | 
                  + return $self->_apply_filter(@_);  | 
              |
| 1436 | 
                  +}  | 
              |
| 1437 | 
                  +  | 
              |
| 1427 | 1438 | 
                  # DEPRECATED!  | 
              
| 1428 | 1439 | 
                  our %SELECT_AT_ARGS = (%SELECT_ARGS, where => 1, primary_key => 1);  | 
              
| 1429 | 1440 | 
                   sub select_at {
                 | 
              
| ... | ... | 
                  @@ -1544,19 +1555,18 @@ sub register_tag {
                 | 
              
| 1544 | 1555 | 
                  }  | 
              
| 1545 | 1556 | 
                   | 
              
| 1546 | 1557 | 
                  # DEPRECATED!  | 
              
| 1547 | 
                  -__PACKAGE__->attr('data_source');
                 | 
              |
| 1558 | 
                  +has 'data_source';  | 
              |
| 1548 | 1559 | 
                   | 
              
| 1549 | 1560 | 
                  # DEPRECATED!  | 
              
| 1550 | 
                  -__PACKAGE__->attr(  | 
              |
| 1551 | 
                  -    dbi_options => sub { {} },
                 | 
              |
| 1552 | 
                  - filter_check => 1  | 
              |
| 1553 | 
                  -);  | 
              |
| 1561 | 
                  +has dbi_options => sub { {} },
                 | 
              |
| 1562 | 
                  + filter_check => 1;  | 
              |
| 1563 | 
                  +  | 
              |
| 1554 | 1564 | 
                   | 
              
| 1555 | 1565 | 
                  # DEPRECATED!  | 
              
| 1556 | 1566 | 
                   sub default_bind_filter {
                 | 
              
| 1557 | 1567 | 
                  my $self = shift;  | 
              
| 1558 | 1568 | 
                   | 
              
| 1559 | 
                  - warn "default_bind_filter is DEPRECATED! use apply_filter instead\n";  | 
              |
| 1569 | 
                  + warn "default_bind_filter is DEPRECATED!";  | 
              |
| 1560 | 1570 | 
                   | 
              
| 1561 | 1571 | 
                       if (@_) {
                 | 
              
| 1562 | 1572 | 
                  my $fname = $_[0];  | 
              
| ... | ... | 
                  @@ -1580,7 +1590,7 @@ sub default_bind_filter {
                 | 
              
| 1580 | 1590 | 
                   sub default_fetch_filter {
                 | 
              
| 1581 | 1591 | 
                  my $self = shift;  | 
              
| 1582 | 1592 | 
                   | 
              
| 1583 | 
                  - warn "default_fetch_filter is DEPRECATED! use apply_filter instead\n";  | 
              |
| 1593 | 
                  + warn "default_fetch_filter is DEPRECATED!";  | 
              |
| 1584 | 1594 | 
                   | 
              
| 1585 | 1595 | 
                       if (@_) {
                 | 
              
| 1586 | 1596 | 
                  my $fname = $_[0];  | 
              
| ... | ... | 
                  @@ -1696,6 +1706,7 @@ DBIx::Custom - Useful database access, respecting SQL!  | 
              
| 1696 | 1706 | 
                  # Select  | 
              
| 1697 | 1707 | 
                  my $result = $dbi->select(  | 
              
| 1698 | 1708 | 
                  table => 'book',  | 
              
| 1709 | 
                  + column => ['title', 'author'],  | 
              |
| 1699 | 1710 | 
                           where  => {author => 'Ken'},
                 | 
              
| 1700 | 1711 | 
                  );  | 
              
| 1701 | 1712 | 
                   | 
              
| ... | ... | 
                  @@ -1703,8 +1714,8 @@ DBIx::Custom - Useful database access, respecting SQL!  | 
              
| 1703 | 1714 | 
                  my $result = $dbi->select(  | 
              
| 1704 | 1715 | 
                  table => 'book',  | 
              
| 1705 | 1716 | 
                  column => [  | 
              
| 1706 | 
                  - 'book.author as book__author',  | 
              |
| 1707 | 
                  - 'company.name as company__name'  | 
              |
| 1717 | 
                  +            {book => [qw/title author/]},
                 | 
              |
| 1718 | 
                  +            {company => ['name']}
                 | 
              |
| 1708 | 1719 | 
                  ],  | 
              
| 1709 | 1720 | 
                           where  => {'book.author' => 'Ken'},
                 | 
              
| 1710 | 1721 | 
                  join => ['left outer join company on book.company_id = company.id'],  | 
              
| ... | ... | 
                  @@ -1897,7 +1908,7 @@ and implements the following new ones.  | 
              
| 1897 | 1908 | 
                   | 
              
| 1898 | 1909 | 
                  Get available data type.  | 
              
| 1899 | 1910 | 
                   | 
              
| 1900 | 
                  -=head2 C<apply_filter>  | 
              |
| 1911 | 
                  +=head2 C<apply_filter> DEPRECATED!  | 
              |
| 1901 | 1912 | 
                   | 
              
| 1902 | 1913 | 
                  $dbi->apply_filter(  | 
              
| 1903 | 1914 | 
                  'book',  | 
              
| ... | ... | 
                  @@ -1924,6 +1935,7 @@ Filter is applied to the follwoing tree column name pattern.  | 
              
| 1924 | 1935 | 
                  1. Column : author  | 
              
| 1925 | 1936 | 
                  2. Table.Column : book.author  | 
              
| 1926 | 1937 | 
                  3. Table__Column : book__author  | 
              
| 1938 | 
                  + 4. Table-Column : book-author  | 
              |
| 1927 | 1939 | 
                   | 
              
| 1928 | 1940 | 
                  If column name is duplicate with other table,  | 
              
| 1929 | 1941 | 
                  Main filter specified by C<table> option is used.  | 
              
| ... | ... | 
                  @@ -1949,24 +1961,29 @@ Create assign parameter.  | 
              
| 1949 | 1961 | 
                   | 
              
| 1950 | 1962 | 
                  This is equal to C<update_param> exept that set is not added.  | 
              
| 1951 | 1963 | 
                   | 
              
| 1952 | 
                  -=head2 C<col> EXPERIMETNAL  | 
              |
| 1964 | 
                  +=head2 C<column> EXPERIMETNAL  | 
              |
| 1953 | 1965 | 
                   | 
              
| 1954 | 
                  - my $column = $model->col(book => ['author', 'title']);  | 
              |
| 1966 | 
                  + my $column = $dbi->column(book => ['author', 'title']);  | 
              |
| 1955 | 1967 | 
                   | 
              
| 1956 | 1968 | 
                  Create column clause. The follwoing column clause is created.  | 
              
| 1957 | 1969 | 
                   | 
              
| 1958 | 1970 | 
                  book.author as "book.author",  | 
              
| 1959 | 1971 | 
                  book.title as "book.title"  | 
              
| 1960 | 1972 | 
                   | 
              
| 1961 | 
                  -=head2 C<column> EXPERIMETNAL  | 
              |
| 1962 | 
                  -  | 
              |
| 1963 | 
                  - my $column = $dbi->column(book => ['author', 'title']);  | 
              |
| 1973 | 
                  +You can change separator by C<separator> method.  | 
              |
| 1964 | 1974 | 
                   | 
              
| 1965 | 
                  -Create column clause. The follwoing column clause is created.  | 
              |
| 1966 | 
                  -  | 
              |
| 1967 | 
                  - book.author as book__author,  | 
              |
| 1968 | 
                  - book.title as book__title  | 
              |
| 1975 | 
                  + # Separator is double underbar  | 
              |
| 1976 | 
                  +    $dbi->separator('__');
                 | 
              |
| 1977 | 
                  +  | 
              |
| 1978 | 
                  + book.author as "book__author",  | 
              |
| 1979 | 
                  + book.title as "book__title"  | 
              |
| 1969 | 1980 | 
                   | 
              
| 1981 | 
                  + # Separator is hyphen  | 
              |
| 1982 | 
                  +    $dbi->separator('-');
                 | 
              |
| 1983 | 
                  +  | 
              |
| 1984 | 
                  + book.author as "book-author",  | 
              |
| 1985 | 
                  + book.title as "book-title"  | 
              |
| 1986 | 
                  +  | 
              |
| 1970 | 1987 | 
                  =head2 C<connect>  | 
              
| 1971 | 1988 | 
                   | 
              
| 1972 | 1989 | 
                  my $dbi = DBIx::Custom->connect(  | 
              
| ... | ... | 
                  @@ -2433,14 +2450,57 @@ Register filters, used by C<filter> option of many methods.  | 
              
| 2433 | 2450 | 
                   | 
              
| 2434 | 2451 | 
                  Filtering rule when data is send into and get from database.  | 
              
| 2435 | 2452 | 
                  This has a little complex problem.  | 
              
| 2453 | 
                  +  | 
              |
| 2436 | 2454 | 
                  In C<into> you can specify type name as same as type name defined  | 
              
| 2437 | 2455 | 
                  by create table, such as C<DATETIME> or C<DATE>.  | 
              
| 2438 | 
                  -but in C<from> you can't specify type name defined by create table.  | 
              |
| 2456 | 
                  +Type rule of C<into> is enabled on the following pattern.  | 
              |
| 2457 | 
                  +  | 
              |
| 2458 | 
                  +=over 4  | 
              |
| 2459 | 
                  +  | 
              |
| 2460 | 
                  +=item 1. column name  | 
              |
| 2461 | 
                  +  | 
              |
| 2462 | 
                  + issue_date  | 
              |
| 2463 | 
                  + issue_datetime  | 
              |
| 2464 | 
                  +  | 
              |
| 2465 | 
                  +=item 2. table name and column name, separator is dot  | 
              |
| 2466 | 
                  +  | 
              |
| 2467 | 
                  + book.issue_date  | 
              |
| 2468 | 
                  + book.issue_datetime  | 
              |
| 2469 | 
                  +  | 
              |
| 2470 | 
                  +=back  | 
              |
| 2471 | 
                  +  | 
              |
| 2472 | 
                  +In C<from> you can't specify type name defined by create table.  | 
              |
| 2439 | 2473 | 
                  You must specify data type, this is internal one.  | 
              
| 2440 | 2474 | 
                  You get all data type by C<available_data_type>.  | 
              
| 2441 | 2475 | 
                   | 
              
| 2442 | 2476 | 
                  print $dbi->available_data_type;  | 
              
| 2443 | 2477 | 
                   | 
              
| 2478 | 
                  +Type rule of C<from> is enabled on the following pattern.  | 
              |
| 2479 | 
                  +  | 
              |
| 2480 | 
                  +=item 1. column name  | 
              |
| 2481 | 
                  +  | 
              |
| 2482 | 
                  + issue_date  | 
              |
| 2483 | 
                  + issue_datetime  | 
              |
| 2484 | 
                  +  | 
              |
| 2485 | 
                  +=item 2. table name and column name, separator is dot  | 
              |
| 2486 | 
                  +  | 
              |
| 2487 | 
                  + book.issue_date  | 
              |
| 2488 | 
                  + book.issue_datetime  | 
              |
| 2489 | 
                  +  | 
              |
| 2490 | 
                  +=item 3. table name and column name, separator is double underbar  | 
              |
| 2491 | 
                  +  | 
              |
| 2492 | 
                  + book__issue_date  | 
              |
| 2493 | 
                  + book__issue_datetime  | 
              |
| 2494 | 
                  +  | 
              |
| 2495 | 
                  +=item 4. table name and column name, separator is hyphen  | 
              |
| 2496 | 
                  +  | 
              |
| 2497 | 
                  + book-issue_date  | 
              |
| 2498 | 
                  + book-issue_datetime  | 
              |
| 2499 | 
                  +  | 
              |
| 2500 | 
                  +This is useful in HTML.  | 
              |
| 2501 | 
                  +  | 
              |
| 2502 | 
                  +=back  | 
              |
| 2503 | 
                  +  | 
              |
| 2444 | 2504 | 
                  You can also specify multiple types  | 
              
| 2445 | 2505 | 
                   | 
              
| 2446 | 2506 | 
                  $dbi->type_rule(  | 
              
| ... | ... | 
                  @@ -2565,7 +2625,7 @@ join clausees needed when SQL is created is used automatically.  | 
              
| 2565 | 2625 | 
                   | 
              
| 2566 | 2626 | 
                  $dbi->select(  | 
              
| 2567 | 2627 | 
                  table => 'book',  | 
              
| 2568 | 
                  - column => ['company.location_id as company__location_id'],  | 
              |
| 2628 | 
                  + column => ['company.location_id as location_id'],  | 
              |
| 2569 | 2629 | 
                           where => {'company.name' => 'Orange'},
                 | 
              
| 2570 | 2630 | 
                  join => [  | 
              
| 2571 | 2631 | 
                  'left outer join company on book.company_id = company.id',  | 
              
| ... | ... | 
                  @@ -2576,10 +2636,10 @@ join clausees needed when SQL is created is used automatically.  | 
              
| 2576 | 2636 | 
                  In above select, column and where clause contain "company" table,  | 
              
| 2577 | 2637 | 
                  the following SQL is created  | 
              
| 2578 | 2638 | 
                   | 
              
| 2579 | 
                  - select company.location_id as company__location_id  | 
              |
| 2639 | 
                  + select company.location_id as location_id  | 
              |
| 2580 | 2640 | 
                  from book  | 
              
| 2581 | 2641 | 
                  left outer join company on book.company_id = company.id  | 
              
| 2582 | 
                  - where company.name = Orange  | 
              |
| 2642 | 
                  + where company.name = ?;  | 
              |
| 2583 | 2643 | 
                   | 
              
| 2584 | 2644 | 
                  =item C<primary_key>  | 
              
| 2585 | 2645 | 
                   | 
              
| ... | ... | 
                  @@ -574,8 +574,9 @@ Generally Class name is model name, and table name is model name.  | 
              
| 574 | 574 | 
                  You can change model name.  | 
              
| 575 | 575 | 
                   | 
              
| 576 | 576 | 
                  package MyModel::book;  | 
              
| 577 | 
                  + use MyModel -base;  | 
              |
| 577 | 578 | 
                   | 
              
| 578 | 
                  - __PACAKGE__->attr(name => 'book_model');  | 
              |
| 579 | 
                  + has name => 'book_model';  | 
              |
| 579 | 580 | 
                   | 
              
| 580 | 581 | 
                  CLASS MODEL TABLE  | 
              
| 581 | 582 | 
                  book book_model (MODEL) -> book_model  | 
              
| ... | ... | 
                  @@ -587,8 +588,9 @@ Model name is the name used by L<model> of L<DBIx::Custom>.  | 
              
| 587 | 588 | 
                  You can change table name.  | 
              
| 588 | 589 | 
                   | 
              
| 589 | 590 | 
                  package MyModel::book;  | 
              
| 591 | 
                  + use MyModel -base;  | 
              |
| 590 | 592 | 
                   | 
              
| 591 | 
                  - __PACAKGE__->attr(table => 'book_table');  | 
              |
| 593 | 
                  + has table => 'book_table';  | 
              |
| 592 | 594 | 
                   | 
              
| 593 | 595 | 
                  CLASS MODEL TABLE  | 
              
| 594 | 596 | 
                  book (CLASS) -> book book_table  | 
              
| ... | ... | 
                  @@ -602,7 +604,7 @@ Table name is the table really accessed.  | 
              
| 602 | 604 | 
                  To create column clause automatically, use C<mycolumn>.  | 
              
| 603 | 605 | 
                  Valude of C<table> and C<columns> is used.  | 
              
| 604 | 606 | 
                   | 
              
| 605 | 
                  - my $column_clause = $model->mycolumn;  | 
              |
| 607 | 
                  + my $mycolumns = $model->mycolumn;  | 
              |
| 606 | 608 | 
                   | 
              
| 607 | 609 | 
                  If C<table> is 'book'AC<column> is ['id', 'name'],  | 
              
| 608 | 610 | 
                  the following clause is created.  | 
              
| ... | ... | 
                  @@ -613,34 +615,12 @@ These column name is for removing column name ambiguities.  | 
              
| 613 | 615 | 
                   | 
              
| 614 | 616 | 
                  You can create column clause from columns of other table.  | 
              
| 615 | 617 | 
                   | 
              
| 616 | 
                  -    my $column_clause = $model->column('company');
                 | 
              |
| 618 | 
                  +    my $columns = $model->column('company');
                 | 
              |
| 617 | 619 | 
                   | 
              
| 618 | 
                  -If C<table> is 'company'AC<column> is ['id', 'name'],  | 
              |
| 620 | 
                  +If C<table> is "company", C<column> return ['id', 'name'],  | 
              |
| 619 | 621 | 
                  the following clause is created.  | 
              
| 620 | 622 | 
                   | 
              
| 621 | 
                  - company.id as company__id, company.name as company__name  | 
              |
| 622 | 
                  -  | 
              |
| 623 | 
                  -=head2 Create column clause automatically : column_clause  | 
              |
| 624 | 
                  -  | 
              |
| 625 | 
                  -To create column clause automatically, use C<column_clause>.  | 
              |
| 626 | 
                  -Valude of C<table> and C<columns> is used.  | 
              |
| 627 | 
                  -  | 
              |
| 628 | 
                  - my $column_clause = $model->column_clause;  | 
              |
| 629 | 
                  -  | 
              |
| 630 | 
                  -If C<table> is 'book'AC<column> is ['id', 'name'],  | 
              |
| 631 | 
                  -the following clause is created.  | 
              |
| 632 | 
                  -  | 
              |
| 633 | 
                  - book.id as id, book.name as name  | 
              |
| 634 | 
                  -  | 
              |
| 635 | 
                  -These column name is for removing column name ambiguities.  | 
              |
| 636 | 
                  -  | 
              |
| 637 | 
                  -If you remove some columns, use C<remove> option.  | 
              |
| 638 | 
                  -  | 
              |
| 639 | 
                  - my $column_clause = $model->column_clause(remove => ['id']);  | 
              |
| 640 | 
                  -  | 
              |
| 641 | 
                  -If you add some column, use C<add> option.  | 
              |
| 642 | 
                  -  | 
              |
| 643 | 
                  - my $column_clause = $model->column_clause(add => ['company.id as company__id']);  | 
              |
| 623 | 
                  + company.id as "company.id", company.name as "company.name"  | 
              |
| 644 | 624 | 
                   | 
              
| 645 | 625 | 
                  =head2 Model Examples  | 
              
| 646 | 626 | 
                   | 
              
| ... | ... | 
                  @@ -228,24 +228,12 @@ and implements the following new ones.  | 
              
| 228 | 228 | 
                  my $column = $model->column(book => ['author', 'title']);  | 
              
| 229 | 229 | 
                       my $column = $model->column('book');
                 | 
              
| 230 | 230 | 
                   | 
              
| 231 | 
                  -Create column clause. The follwoing column clause is created.  | 
              |
| 232 | 
                  -  | 
              |
| 233 | 
                  - book.author as book__author,  | 
              |
| 234 | 
                  - book.title as book__title  | 
              |
| 235 | 
                  -  | 
              |
| 236 | 
                  -If column names is omitted, C<columns> attribute of the model is used.  | 
              |
| 237 | 
                  -  | 
              |
| 238 | 
                  -=head2 C<col> EXPERIMETNAL  | 
              |
| 239 | 
                  -  | 
              |
| 240 | 
                  - my $column = $model->col(book => ['author', 'title']);  | 
              |
| 241 | 
                  -    my $column = $model->col('book');
                 | 
              |
| 242 | 
                  -  | 
              |
| 243 | 231 | 
                  Create column clause. The follwoing column clause is created.  | 
              
| 244 | 232 | 
                   | 
              
| 245 | 233 | 
                  book.author as "book.author",  | 
              
| 246 | 234 | 
                  book.title as "book.title"  | 
              
| 247 | 235 | 
                   | 
              
| 248 | 
                  -If column names is omitted, C<columns> attribute of the model is used.  | 
              |
| 236 | 
                  +If Second argument is ommited, all columns set by C<columns> is used.  | 
              |
| 249 | 237 | 
                   | 
              
| 250 | 238 | 
                  =head2 C<delete>  | 
              
| 251 | 239 | 
                   | 
              
| ... | ... | 
                  @@ -1,5 +1,4 @@  | 
              
| 1 | 1 | 
                  package DBIx::Custom::Query;  | 
              
| 2 | 
                  -  | 
              |
| 3 | 2 | 
                  use Object::Simple -base;  | 
              
| 4 | 3 | 
                   | 
              
| 5 | 4 | 
                  use Carp 'croak';  | 
              
| ... | ... | 
                  @@ -60,7 +59,7 @@ sub filter {
                 | 
              
| 60 | 59 | 
                  }  | 
              
| 61 | 60 | 
                   | 
              
| 62 | 61 | 
                  # DEPRECATED!  | 
              
| 63 | 
                  -__PACKAGE__->attr('default_filter');
                 | 
              |
| 62 | 
                  +has 'default_filter';  | 
              |
| 64 | 63 | 
                   | 
              
| 65 | 64 | 
                  1;  | 
              
| 66 | 65 | 
                   | 
              
| ... | ... | 
                  @@ -89,7 +89,7 @@ sub _parse_parameter {
                 | 
              
| 89 | 89 | 
                  }  | 
              
| 90 | 90 | 
                   | 
              
| 91 | 91 | 
                  # DEPRECATED!  | 
              
| 92 | 
                  -__PACKAGE__->attr('tags' => sub { {} });
                 | 
              |
| 92 | 
                  +has tags => sub { {} };
                 | 
              |
| 93 | 93 | 
                   | 
              
| 94 | 94 | 
                  # DEPRECATED!  | 
              
| 95 | 95 | 
                   sub register_tag {
                 | 
              
| ... | ... | 
                  @@ -335,7 +335,7 @@ sub _parse_tag {
                 | 
              
| 335 | 335 | 
                  }  | 
              
| 336 | 336 | 
                   | 
              
| 337 | 337 | 
                  # DEPRECATED!  | 
              
| 338 | 
                  -__PACKAGE__->attr('tag_processors' => sub { {} });
                 | 
              |
| 338 | 
                  +has tag_processors => sub { {} };
                 | 
              |
| 339 | 339 | 
                   | 
              
| 340 | 340 | 
                  # DEPRECATED!  | 
              
| 341 | 341 | 
                   sub register_tag_processor {
                 | 
              
| ... | ... | 
                  @@ -116,7 +116,7 @@ sub fetch {
                 | 
              
| 116 | 116 | 
                  my $column = $columns->[$i];  | 
              
| 117 | 117 | 
                           my $f  = exists $filter->{$column}
                 | 
              
| 118 | 118 | 
                                  ? $filter->{$column}
                 | 
              
| 119 | 
                  - : $self->default_filter;  | 
              |
| 119 | 
                  + : $self->_default_filter;  | 
              |
| 120 | 120 | 
                           my $ef = $end_filter->{$column};
                 | 
              
| 121 | 121 | 
                   | 
              
| 122 | 122 | 
                  # Filtering  | 
              
| ... | ... | 
                  @@ -186,7 +186,7 @@ sub fetch_hash {
                 | 
              
| 186 | 186 | 
                  my $column = $columns->[$i];  | 
              
| 187 | 187 | 
                           my $f  = exists $filter->{$column}
                 | 
              
| 188 | 188 | 
                                  ? $filter->{$column}
                 | 
              
| 189 | 
                  - : $self->default_filter;  | 
              |
| 189 | 
                  + : $self->_default_filter;  | 
              |
| 190 | 190 | 
                           my $ef = $end_filter->{$column};
                 | 
              
| 191 | 191 | 
                   | 
              
| 192 | 192 | 
                  # Filtering  | 
              
| ... | ... | 
                  @@ -266,25 +266,39 @@ sub fetch_multi {
                 | 
              
| 266 | 266 | 
                   | 
              
| 267 | 267 | 
                  *one = \&fetch_hash_first;  | 
              
| 268 | 268 | 
                   | 
              
| 269 | 
                  +# DEPRECATED!  | 
              |
| 269 | 270 | 
                   sub remove_end_filter {
                 | 
              
| 270 | 271 | 
                  my $self = shift;  | 
              
| 271 | 272 | 
                   | 
              
| 273 | 
                  + warn "remove_end_filter is DEPRECATED! use filter_off attribute instead";  | 
              |
| 274 | 
                  +  | 
              |
| 272 | 275 | 
                       $self->{end_filter} = {};
                 | 
              
| 273 | 276 | 
                   | 
              
| 274 | 277 | 
                  return $self;  | 
              
| 275 | 278 | 
                  }  | 
              
| 276 | 279 | 
                   | 
              
| 280 | 
                  +# DEPRECATED!  | 
              |
| 277 | 281 | 
                   sub remove_filter {
                 | 
              
| 278 | 282 | 
                  my $self = shift;  | 
              
| 283 | 
                  +  | 
              |
| 284 | 
                  + warn "remove_filter is DEPRECATED! use filter_off attribute instead";  | 
              |
| 279 | 285 | 
                   | 
              
| 280 | 286 | 
                       $self->{filter} = {};
                 | 
              
| 281 | 287 | 
                   | 
              
| 282 | 288 | 
                  return $self;  | 
              
| 283 | 289 | 
                  }  | 
              
| 284 | 290 | 
                   | 
              
| 285 | 
                  -# Deprecated  | 
              |
| 291 | 
                  +# DEPRECATED!  | 
              |
| 286 | 292 | 
                   sub default_filter {
                 | 
              
| 287 | 293 | 
                  my $self = shift;  | 
              
| 294 | 
                  + warn "default_filter is DEPRECATED!";  | 
              |
| 295 | 
                  + return $self->_default_filter(@_)  | 
              |
| 296 | 
                  +}  | 
              |
| 297 | 
                  +  | 
              |
| 298 | 
                  +# DEPRECATED!  | 
              |
| 299 | 
                  +sub _default_filter {
                 | 
              |
| 300 | 
                  + my $self = shift;  | 
              |
| 301 | 
                  +  | 
              |
| 288 | 302 | 
                   | 
              
| 289 | 303 | 
                       if (@_) {
                 | 
              
| 290 | 304 | 
                  my $fname = $_[0];  | 
              
| ... | ... | 
                  @@ -305,7 +319,7 @@ sub default_filter {
                 | 
              
| 305 | 319 | 
                  }  | 
              
| 306 | 320 | 
                   | 
              
| 307 | 321 | 
                  # DEPRECATED!  | 
              
| 308 | 
                  -__PACKAGE__->attr('filter_check'); 
                 | 
              |
| 322 | 
                  +has 'filter_check';  | 
              |
| 309 | 323 | 
                   | 
              
| 310 | 324 | 
                  1;  | 
              
| 311 | 325 | 
                   | 
              
| ... | ... | 
                  @@ -489,7 +503,7 @@ L<DBIx::Custom>.  | 
              
| 489 | 503 | 
                   | 
              
| 490 | 504 | 
                  This is alias for C<fetch_hash_first>.  | 
              
| 491 | 505 | 
                   | 
              
| 492 | 
                  -=head2 C<remove_end_filter>  | 
              |
| 506 | 
                  +=head2 C<remove_end_filter> DEPRECATED!  | 
              |
| 493 | 507 | 
                   | 
              
| 494 | 508 | 
                  $result->remove_end_filter;  | 
              
| 495 | 509 | 
                   | 
              
| ... | ... | 
                  @@ -6,7 +6,7 @@ use utf8;  | 
              
| 6 | 6 | 
                  use Encode qw/encode_utf8 decode_utf8/;  | 
              
| 7 | 7 | 
                  use Data::Dumper;  | 
              
| 8 | 8 | 
                   | 
              
| 9 | 
                  -$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
                 | 
              |
| 9 | 
                  +#$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
                 | 
              |
| 10 | 10 | 
                   | 
              
| 11 | 11 | 
                   BEGIN {
                 | 
              
| 12 | 12 | 
                       eval { require DBD::SQLite; 1 }
                 | 
              
| ... | ... | 
                  @@ -2187,6 +2187,26 @@ $result = $model->select(  | 
              
| 2187 | 2187 | 
                  is_deeply($result->one,  | 
              
| 2188 | 2188 | 
                             {'table2_alias.key1' => 1, 'table2_alias.key3' => 48});
                 | 
              
| 2189 | 2189 | 
                   | 
              
| 2190 | 
                  +$dbi->separator('__');
                 | 
              |
| 2191 | 
                  +$result = $model->select(  | 
              |
| 2192 | 
                  + column => [  | 
              |
| 2193 | 
                  +        $model->column('table2_alias')
                 | 
              |
| 2194 | 
                  + ],  | 
              |
| 2195 | 
                  +    where => {'table2_alias.key3' => 2}
                 | 
              |
| 2196 | 
                  +);  | 
              |
| 2197 | 
                  +is_deeply($result->one,  | 
              |
| 2198 | 
                  +          {'table2_alias__key1' => 1, 'table2_alias__key3' => 48});
                 | 
              |
| 2199 | 
                  +  | 
              |
| 2200 | 
                  +$dbi->separator('-');
                 | 
              |
| 2201 | 
                  +$result = $model->select(  | 
              |
| 2202 | 
                  + column => [  | 
              |
| 2203 | 
                  +        $model->column('table2_alias')
                 | 
              |
| 2204 | 
                  + ],  | 
              |
| 2205 | 
                  +    where => {'table2_alias.key3' => 2}
                 | 
              |
| 2206 | 
                  +);  | 
              |
| 2207 | 
                  +is_deeply($result->one,  | 
              |
| 2208 | 
                  +          {'table2_alias-key1' => 1, 'table2_alias-key3' => 48});
                 | 
              |
| 2209 | 
                  +  | 
              |
| 2190 | 2210 | 
                  test 'type() option';  | 
              
| 2191 | 2211 | 
                  $dbi = DBIx::Custom->connect(  | 
              
| 2192 | 2212 | 
                  data_source => 'dbi:SQLite:dbname=:memory:',  | 
              
| ... | ... | 
                  @@ -2768,6 +2788,19 @@ is_deeply($result->one,  | 
              
| 2768 | 2788 | 
                             {key1 => 2, key2 => 2, 'table2__key1' => 3, 'table2__key3' => 9});
                 | 
              
| 2769 | 2789 | 
                   is_deeply($model2->select->one, {key1 => 3, key3 => 9});
                 | 
              
| 2770 | 2790 | 
                   | 
              
| 2791 | 
                  +$dbi->separator('-');
                 | 
              |
| 2792 | 
                  +$model = $dbi->model('table1');
                 | 
              |
| 2793 | 
                  +$result = $model->select(  | 
              |
| 2794 | 
                  + column => [  | 
              |
| 2795 | 
                  + $model->mycolumn,  | 
              |
| 2796 | 
                  +        {table2 => [qw/key1 key3/]}
                 | 
              |
| 2797 | 
                  + ],  | 
              |
| 2798 | 
                  +    where => {'table1.key1' => 1}
                 | 
              |
| 2799 | 
                  +);  | 
              |
| 2800 | 
                  +is_deeply($result->one,  | 
              |
| 2801 | 
                  +          {key1 => 2, key2 => 2, 'table2-key1' => 3, 'table2-key3' => 9});
                 | 
              |
| 2802 | 
                  +is_deeply($model2->select->one, {key1 => 3, key3 => 9});
                 | 
              |
| 2803 | 
                  +  | 
              |
| 2771 | 2804 | 
                   | 
              
| 2772 | 2805 | 
                  test 'filter_off';  | 
              
| 2773 | 2806 | 
                   $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
                 | 
              
| ... | ... | 
                  @@ -1,5 +1,4 @@  | 
              
| 1 | 1 | 
                  package MyModel8;  | 
              
| 2 | 
                  -  | 
              |
| 3 | 
                  -use base 'DBIx::Custom::Model';  | 
              |
| 2 | 
                  +use DBIx::Custom::Model -base;  | 
              |
| 4 | 3 | 
                   | 
              
| 5 | 4 | 
                  1;  | 
              
| ... | ... | 
                  @@ -1,10 +1,8 @@  | 
              
| 1 | 1 | 
                  package MyModel8::table1;  | 
              
| 2 | 
                  +use MyModel8 -base;  | 
              |
| 2 | 3 | 
                   | 
              
| 3 | 
                  -use base 'MyModel8';  | 
              |
| 4 | 
                  -  | 
              |
| 5 | 
                  -__PACKAGE__->attr(join => sub { ['left join table2 as table2_alias on table1.key1 = table2_alias.key1'] });
                 | 
              |
| 6 | 
                  -  | 
              |
| 7 | 
                  -__PACKAGE__->attr(table_alias => sub { {'table2_alias' => 'table2'} });
                 | 
              |
| 4 | 
                  +has join => sub { ['left join table2 as table2_alias on table1.key1 = table2_alias.key1'] };
                 | 
              |
| 5 | 
                  +has table_alias => sub { {'table2_alias' => 'table2'} };
                 | 
              |
| 8 | 6 | 
                   | 
              
| 9 | 7 | 
                   | 
              
| 10 | 8 | 
                  1;  | 
              
| ... | ... | 
                  @@ -1,11 +1,10 @@  | 
              
| 1 | 1 | 
                  package MyModel8::table2;  | 
              
| 2 | 
                  +use MyModel8 -base;  | 
              |
| 2 | 3 | 
                   | 
              
| 3 | 
                  -use base 'MyModel8';  | 
              |
| 4 | 
                  -  | 
              |
| 5 | 
                  -__PACKAGE__->attr(filter => sub {
                 | 
              |
| 4 | 
                  +has filter => sub {
                 | 
              |
| 6 | 5 | 
                       {
                 | 
              
| 7 | 6 | 
                           key3 => {out => sub { $_[0] * 2}, in => sub { $_[0] * 3}, end => sub { $_[0] * 4 }}
                 | 
              
| 8 | 7 | 
                  }  | 
              
| 9 | 
                  -});  | 
              |
| 8 | 
                  +};  | 
              |
| 10 | 9 | 
                   | 
              
| 11 | 10 | 
                  1;  |