has
'_join'
=> (
is
=>
'rw'
,
isa
=> Str,
);
has
'_from_tables'
=> (
is
=>
'bare'
,
isa
=> HashRef,
default
=>
sub
{ { } },
traits
=> [
qw( Hash )
],
handles
=> {
'_set_from_table'
=>
'set'
,
'_from_tables'
=>
'values'
,
}
);
sub
_from {
my
(
$self
,
@tables
) =
@_
;
$self
->_set_from_table(
$_
->name,
$_
)
for
@tables
;
}
sub
BUILD {
my
$self
=
shift
;
$self
->_from(
$self
->class->meta->storm_table );
}
sub
_sql {
my
(
$self
) =
@_
;
return
join
q[ ]
,
$self
->_select_clause ,
$self
->_from_clause ,
$self
->_where_clause ,
$self
->_order_by_clause,
}
sub
join
{
my
(
$self
,
$table
) =
@_
;
$self
->_set_join(
$table
);
return
$self
;
}
sub
results {
my
(
$self
,
@args
) =
@_
;
my
@params
=
$self
->_combine_bind_params_and_args( [
$self
->bind_params], \
@args
);
my
$results
= Storm::Query::Select::Iterator->new(
$self
,
@params
);
return
$results
;
}
sub
_select_clause {
my
(
$self
) =
@_
;
my
$table
=
$self
->class->meta->storm_table;
return
'SELECT '
. CORE::
join
(
', '
,
map
{
$_
->column->sql(
$table
) }
$self
->attribute_order);
}
sub
_from_clause {
my
(
$self
) =
@_
;
my
$sql
=
'FROM '
;
$sql
.= CORE::
join
(
", "
,
map
{
$_
->sql }
$self
->_from_tables);
$sql
.=
' '
.
$self
->_join_clause
if
$self
->_join;
return
$sql
;
}
sub
_join_clause {
my
(
$self
) =
@_
;
return
if
!
defined
$self
->_join;
return
'INNER JOIN '
.
$self
->_join;
}
sub
bind_params {
my
(
$self
) =
@_
;
return
(
map
{
$_
->bind_params() }
grep
{
$_
->can(
'bind_params'
) }
$self
->where_clause_elements,
$self
->order_by_elements
);
}
no
Moose;
__PACKAGE__->meta->make_immutable;
1;