File Coverage

blib/lib/Alzabo/Table.pm
Criterion Covered Total %
statement 33 133 24.8
branch 0 42 0.0
condition n/a
subroutine 11 29 37.9
pod 18 18 100.0
total 62 222 27.9


line stmt bran cond sub pod time code
1             package Alzabo::Table;
2              
3 11     11   71 use strict;
  11         24  
  11         563  
4 11     11   80 use vars qw($VERSION);
  11         24  
  11         472  
5              
6 11     11   67 use Alzabo;
  11         21  
  11         285  
7              
8 11     11   62 use Params::Validate qw( :all );
  11         24  
  11         3691  
9             Params::Validate::validation_options( on_fail => sub { Alzabo::Exception::Params->throw( error => join '', @_ ) } );
10              
11 11     11   70 use Tie::IxHash;
  11         24  
  11         1328  
12              
13             $VERSION = 2.0;
14              
15             1;
16              
17             sub schema
18             {
19 0     0 1   my $self = shift;
20              
21 0           return $self->{schema};
22             }
23              
24             sub name
25             {
26 0     0 1   my $self = shift;
27              
28 0           return $self->{name};
29             }
30              
31 11     11   64 use constant HAS_COLUMN_SPEC => { type => SCALAR };
  11         23  
  11         14310  
32              
33             sub has_column
34             {
35 0     0 1   my $self = shift;
36              
37 0           validate_pos( @_, HAS_COLUMN_SPEC );
38              
39 0           return $self->{columns}->FETCH(shift);
40             }
41              
42             sub column
43             {
44 0     0 1   my $self = shift;
45 0           my $name = shift;
46              
47 0 0         if ( my $col = $self->{columns}->FETCH($name) )
48             {
49 0           return $col;
50             }
51             else
52             {
53 0           Alzabo::Exception::Params->throw
54             ( error => "Column $name doesn't exist in $self->{name}" );
55             }
56             }
57              
58             sub columns
59             {
60 0     0 1   my $self = shift;
61              
62 0 0         return $self->column(@_) if @_ ==1 ;
63 0 0         return map { $self->column($_) } @_ if @_ > 1;
  0            
64 0           return $self->{columns}->Values;
65             }
66              
67             sub primary_key
68             {
69 0     0 1   my $self = shift;
70              
71 0 0         return unless @{ $self->{pk} };
  0            
72              
73             return ( wantarray ?
74 0 0         $self->{columns}->Values( @{ $self->{pk} } ) :
  0            
75             $self->{columns}->Values( $self->{pk}[0] )
76             );
77             }
78              
79             sub primary_key_size
80             {
81 0     0 1   my $self = shift;
82              
83 0           return scalar @{ $self->{pk} };
  0            
84             }
85              
86 11     11   81 use constant COLUMN_IS_PRIMARY_KEY_SPEC => { isa => 'Alzabo::Column' };
  11         21  
  11         3069  
87              
88             sub column_is_primary_key
89             {
90 0     0 1   my $self = shift;
91              
92 0           validate_pos( @_, COLUMN_IS_PRIMARY_KEY_SPEC );
93              
94 0           my $name = shift->name;
95              
96 0 0         Alzabo::Exception::Params->throw( error => "Column $name doesn't exist in $self->{name}" )
97             unless $self->{columns}->EXISTS($name);
98              
99 0           my $idx = $self->{columns}->Indices($name);
100 0 0         return 1 if grep { $idx == $_ } @{ $self->{pk} };
  0            
  0            
101              
102 0           return 0;
103             }
104              
105             sub attributes
106             {
107 0     0 1   return keys %{ $_[0]->{attributes} };
  0            
108             }
109              
110 11         2015 use constant HAS_ATTRIBUTE_SPEC => { attribute => { type => SCALAR },
111             case_sensitive => { type => SCALAR,
112             default => 0 },
113 11     11   78 };
  11         32  
114              
115             sub has_attribute
116             {
117 0     0 1   my $self = shift;
118 0           my %p = validate( @_, HAS_ATTRIBUTE_SPEC );
119              
120 0 0         if ( $p{case_sensitive} )
121             {
122 0           return exists $self->{attributes}{ $p{attribute} };
123             }
124             else
125             {
126 0 0         return 1 if grep { lc $p{attribute} eq lc $_ } keys %{ $self->{attributes} };
  0            
  0            
127             }
128             }
129              
130 11         3515 use constant FOREIGN_KEYS_SPEC => { column => { isa => 'Alzabo::Column' },
131             table => { isa => 'Alzabo::Table' },
132 11     11   63 };
  11         23  
133              
134             sub foreign_keys
135             {
136 0     0 1   my $self = shift;
137              
138 0           validate( @_, FOREIGN_KEYS_SPEC );
139 0           my %p = @_;
140              
141 0           my $c_name = $p{column}->name;
142 0           my $t_name = $p{table}->name;
143              
144 0 0         Alzabo::Exception::Params->throw( error => "Column $c_name doesn't exist in $self->{name}" )
145             unless $self->{columns}->EXISTS($c_name);
146              
147 0 0         Alzabo::Exception::Params->throw( error => "No foreign keys to $t_name exist in $self->{name}" )
148             unless exists $self->{fk}{$t_name};
149              
150 0 0         Alzabo::Exception::Params->throw( error => "Column $c_name is not a foreign key to $t_name in $self->{name}" )
151             unless exists $self->{fk}{$t_name}{$c_name};
152              
153 0 0         return wantarray ? @{ $self->{fk}{$t_name}{$c_name} } : $self->{fk}{$t_name}{$c_name}[0];
  0            
154             }
155              
156 11     11   70 use constant FOREIGN_KEYS_BY_TABLE_SPEC => { isa => 'Alzabo::Table' };
  11         24  
  11         3002  
157              
158             sub foreign_keys_by_table
159             {
160 0     0 1   my $self = shift;
161              
162 0           validate_pos( @_, FOREIGN_KEYS_BY_TABLE_SPEC );
163 0           my $name = shift->name;
164              
165 0           my $fk = $self->{fk};
166              
167 0           my %fk;
168 0 0         if ( exists $fk->{$name} )
169             {
170 0           foreach my $c ( keys %{ $fk->{$name} } )
  0            
171             {
172 0 0         return $fk->{$name}{$c}[0] unless wantarray;
173              
174 0           $fk{$_} = $_ for @{ $fk->{$name}{$c} };
  0            
175             }
176             }
177              
178 0           return values %fk;
179             }
180              
181 11     11   67 use constant FOREIGN_KEYS_BY_COLUMN_SPEC => { isa => 'Alzabo::Column' };
  11         30  
  11         7300  
182              
183             sub foreign_keys_by_column
184             {
185 0     0 1   my $self = shift;
186              
187 0           my ($col) = validate_pos( @_, FOREIGN_KEYS_BY_COLUMN_SPEC );
188              
189 0 0         Alzabo::Exception::Params->throw( error => "Column " . $col->name . " doesn't exist in $self->{name}" )
190             unless $self->{columns}->EXISTS( $col->name );
191              
192 0           my $fk = $self->{fk};
193              
194 0           my %fk;
195 0           foreach my $t (keys %$fk)
196             {
197 0 0         if ( exists $fk->{$t}{ $col->name } )
198             {
199 0 0         return $fk->{$t}{ $col->name }[0] unless wantarray;
200              
201 0           $fk{$_} = $_ for @{ $fk->{$t}{ $col->name } };
  0            
202             }
203             }
204              
205 0           return values %fk;
206             }
207              
208             sub all_foreign_keys
209             {
210 0     0 1   my $self = shift;
211              
212 0           my %seen;
213             my @fk;
214 0           my $fk = $self->{fk};
215 0           foreach my $t (keys %$fk)
216             {
217 0           foreach my $c ( keys %{ $fk->{$t} } )
  0            
218             {
219 0           foreach my $key ( @{ $fk->{$t}{$c} } )
  0            
220             {
221 0 0         next if $seen{$key};
222 0           push @fk, $key;
223 0           $seen{$key} = 1;
224             }
225             }
226             }
227              
228 0 0         return wantarray ? @fk : $fk[0];
229             }
230              
231             sub index
232             {
233 0     0 1   my $self = shift;
234              
235 0           validate_pos( @_, { type => SCALAR } );
236 0           my $id = shift;
237              
238 0 0         Alzabo::Exception::Params->throw( error => "Index $id doesn't exist in $self->{name}" )
239             unless $self->{indexes}->EXISTS($id);
240              
241 0           return $self->{indexes}->FETCH($id);
242             }
243              
244             sub has_index
245             {
246 0     0 1   my $self = shift;
247              
248 0           validate_pos( @_, { type => SCALAR } );
249 0           my $id = shift;
250              
251 0           return $self->{indexes}->EXISTS($id);
252             }
253              
254             sub indexes
255             {
256 0     0 1   my $self = shift;
257              
258 0           return $self->{indexes}->Values;
259             }
260              
261 0     0 1   sub comment { $_[0]->{comment} }
262              
263             __END__