—package
Fey::Table::Alias;
use
strict;
use
warnings;
use
Fey::Validate
qw( validate validate_pos
SCALAR_TYPE
TABLE_TYPE )
;
use
Fey::Table;
use
Moose;
has
'table'
=>
(
is
=>
'ro'
,
isa
=>
'Fey::Table'
,
handles
=> [
'schema'
,
'name'
],
);
has
'alias_name'
=>
(
is
=>
'ro'
,
isa
=>
'Str'
,
lazy
=> 1,
default
=> \
&_default_alias_name
,
);
{
my
%Numbers
;
sub
_default_alias_name
{
my
$self
=
shift
;
my
$name
=
$self
->name();
$Numbers
{
$name
} ||= 0;
return
$name
. ++
$Numbers
{
$name
};
}
}
{
my
$spec
= (SCALAR_TYPE);
sub
column
{
my
$self
=
shift
;
my
(
$name
) = validate_pos(
@_
,
$spec
);
return
$self
->{columns}{
$name
}
if
$self
->{columns}{
$name
};
my
$col
=
$self
->table()->column(
$name
)
or
return
;
my
$clone
=
$col
->_clone();
$clone
->_set_table(
$self
);
return
$self
->{columns}{
$name
} =
$clone
;
}
}
sub
columns
{
my
$self
=
shift
;
my
@cols
=
@_
?
@_
:
map
{
$_
->name() }
$self
->table()->columns();
return
map
{
$self
->column(
$_
) }
@cols
;
}
sub
primary_key {
return
$_
[0]->columns(
map
{
$_
->name() }
$_
[0]->table()->primary_key ) }
sub
is_alias { 1 }
sub
sql_with_alias
{
return
(
$_
[1]->quote_identifier(
$_
[0]->table()->name() )
.
' AS '
.
$_
[1]->quote_identifier(
$_
[0]->alias_name() )
);
}
sub
id {
$_
[0]->alias_name() }
no
Moose;
__PACKAGE__->meta()->make_immutable();
1;
__END__
=head1 NAME
Fey::Table - Represents an alias for a table
=head1 SYNOPSIS
my $alias = $user_table->alias();
my $alias = $user_table->alias( alias_name => 'User2' );
=head1 DESCRIPTION
This class represents an alias for a table. Table aliases allow you to
join the same table more than once in a query, which makes certain
types of queries simpler to express.
=head1 METHODS
This class provides the following methods:
=head2 Fey::Table::Alias->new()
This method constructs a new C<Fey::Table::Alias> object. It takes the
following parameters:
=over 4
=item * table - required
This is the C<Fey::Table> object which we are aliasing.
=item * alias_name - optional
This should be a valid table name for your DBMS. If not provided, a
unique name is automatically created.
=back
=head2 $alias->table()
Returns the C<Fey::Table> object for which this object is an alias.
=head2 $alias->alias_name()
Returns the name for this alias.
=head2 $alias->name()
=head2 $alias->schema()
These methods work like the corresponding methods in
C<Fey::Table>. The C<name()> method returns the real table name.
=head2 $alias->column($name)
=head2 $alias->columns()
=head2 $alias->columns(@names)
=head2 $alias->primary_key()
These methods work like the corresponding methods in
C<Fey::Table>. However, the columns they return will return the alias
object when C<< $column->table() >> is called.
=head2 $alias->is_alias()
Always returns true.
=head2 $alias->sql_with_alias()
Returns the appropriate SQL snippet for the alias.
=head2 $alias->id()
Returns a unique string identifying the alias.
=head1 ROLES
This class does the C<Fey::Role::Joinable> role.
=head1 AUTHOR
Dave Rolsky, <autarch@urth.org>
=head1 BUGS
See L<Fey> for details on how to report bugs.
=head1 COPYRIGHT & LICENSE
Copyright 2006-2008 Dave Rolsky, All Rights Reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut