File: AutoRemoveColumns.pm

package info (click to toggle)
libdbix-class-helpers-perl 2.013002-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 420 kB
  • sloc: perl: 1,931; sql: 73; makefile: 2
file content (154 lines) | stat: -rw-r--r-- 3,479 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package DBIx::Class::Helper::ResultSet::AutoRemoveColumns;
{
  $DBIx::Class::Helper::ResultSet::AutoRemoveColumns::VERSION = '2.013002';
}

# ABSTRACT: Automatically remove columns from a ResultSet

use parent 'DBIx::Class::Helper::ResultSet::RemoveColumns', 'DBIx::Class';

__PACKAGE__->mk_group_accessors(inherited => '_fetchable_columns');

my %dont_fetch = (
   text  => 1,
   ntext => 1,
   blob  => 1,
   clob  => 1,
   bytea  => 1,
);

sub _should_column_fetch {
   my ( $self, $column ) = @_;

   my $info = $self->result_source->column_info($column);

   if (!defined $info->{remove_column}) {
      if (defined $info->{data_type} &&
          $dont_fetch{lc $info->{data_type}}
      ) {
         $info->{remove_column} = 1;
      } else {
         $info->{remove_column} = 0;
      }
   }

   return $info->{remove_column};
}

sub fetchable_columns {
   my $self = shift;
   if (!$self->_fetchable_columns) {
     $self->_fetchable_columns([
        grep $self->_should_column_fetch($_),
           $self->result_source->columns
      ]);
   }
   return $self->_fetchable_columns;
}

sub _resolved_attrs {
   local $_[0]->{attrs}{remove_columns} =
      $_[0]->{attrs}{remove_columns} || $_[0]->fetchable_columns;

   return $_[0]->next::method;
}

1;


__END__
=pod

=head1 NAME

DBIx::Class::Helper::ResultSet::AutoRemoveColumns - Automatically remove columns from a ResultSet

=head1 VERSION

version 2.013002

=head1 SYNOPSIS

 package MySchema::Result::Bar;

 use strict;
 use warnings;

 use parent 'DBIx::Class::Core';

 __PACKAGE__->table('KittenRobot');
 __PACKAGE__->add_columns(
    id => {
       data_type         => 'integer',
       is_auto_increment => 1,
    },
    kitten => {
       data_type         => 'integer',
    },
    robot => {
       data_type         => 'text',
       is_nullable       => 1,
    },
    your_mom => {
       data_type         => 'blob',
       is_nullable       => 1,
       remove_column     => 0,
    },
 );

 1;

 package MySchema::ResultSet::Bar;

 use strict;
 use warnings;

 use parent 'DBIx::Class::ResultSet';

 __PACKAGE__->load_components('Helper::ResultSet::AutoRemoveColumns');

=head1 DESCRIPTION

This component automatically removes "heavy-weight" columns.  To be specific,
columns of type C<text>, C<ntext>, C<blob>, C<clob>, or C<bytea>.  You may
use the C<remove_column> key in the column info to specify directly whether or
not to remove the column automatically. See
L<DBIx::Class::Helper::ResultSet/NOTE> for a nice way to apply it to your
entire schema.

=head1 METHODS

=head2 _should_column_fetch

 $self->_should_column_fetch('kitten')

returns true if a column should be fetched or not.  This fetches a column if it
is not of type C<text>, C<ntext>, C<blob>, C<clob>, or C<bytea> or the
C<remove_column> is set to true.  If you only wanted to explicitly state which
columns to remove you might override this method like this:

 sub _should_column_fetch {
    my ( $self, $column ) = @_;

    my $info = $self->column_info($column);

    return !defined $info->{remove_column} || $info->{remove_column};
 }

=head2 fetchable_columns

simply returns a list of columns that are fetchable.

=head1 AUTHOR

Arthur Axel "fREW" Schmidt <frioux+cpan@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Arthur Axel "fREW" Schmidt.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut