Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/Runtime/Table.pm view on Meta::CPAN
params_exception "Column " . $col->name . " doesn't exist in $self->{name}"
unless $self->has_column( $col->name );
next if $col->is_primary_key;
$self->{groups}{ $col->name } = \@names;
}
}
sub group_by_column
{
my $self = shift;
my $col = shift;
return exists $self->{groups}{$col} ? @{ $self->{groups}{$col} } : $col;
}
my $alias_num = '000000000';
sub alias
{
my $self = shift;
my $clone;
%$clone = %$self;
bless $clone, ref $self;
$clone->{alias_name} = $self->name . ++$alias_num;
$clone->{real_table} = $self;
$clone->{columns} = Tie::IxHash->new( map { $_->name => $_ } $self->columns );
# Force clone of primary key columns right away.
$clone->column($_) foreach map { $_->name } $self->primary_key;
return $clone;
}
#
# Since its unlikely that a user will end up needing clones of more
# than 1-2 columns each time an alias is used, we only make copies as
# needed.
#
sub column
{
my $self = shift;
# I'm an alias, make an alias column
if ( $self->{alias_name} )
{
my $name = shift;
my $col = $self->SUPER::column($name);
# not previously cloned
unless ( $col->table eq $self )
{
# replace our copy of this column with a clone
$col = $col->alias_clone( table => $self );
my $index = $self->{columns}->Indices($name);
$self->{columns}->Replace( $index, $col, $name );
Scalar::Util::weaken( $col->{table} );
delete $self->{pk_array} if $col->is_primary_key;
}
return $col;
}
else
{
return $self->SUPER::column(@_);
}
}
sub alias_name
{
# intentionally don't call $_[0]->name for a noticeable
# performance boost
return $_[0]->{alias_name} || $_[0]->{name};
}
sub real_table
{
return $_[0]->{real_table} || $_[0];
}
# This gets called a _lot_ so doing this sort of 'memoization' helps
sub primary_key
{
my $self = shift;
$self->{pk_array} ||= [ $self->SUPER::primary_key ];
return ( wantarray ?
@{ $self->{pk_array} } :
$self->{pk_array}->[0]
);
}
1;
__END__
=head1 NAME
Alzabo::Runtime::Table - Table objects
=head1 SYNOPSIS
my $table = $schema->table('foo');
my $row = $table->row_by_pk( pk => 1 );
my $row_cursor =
$table->rows_where
( where =>
[ Alzabo::Column object, '=', 5 ] );
=head1 DESCRIPTION
This object is able to create rows, either by making objects based on
existing data or inserting new data to make new rows.
( run in 2.385 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )