Norma
view release on metacpan or search on metacpan
lib/Norma/ORM/Collection.pm view on Meta::CPAN
package Norma::ORM::Collection;
our $VERSION = "0.02";
use Moose;
has items => (is => 'ro', isa => 'ArrayRef', auto_deref => 1);
has total_count => (is => 'ro');
has query => (is => 'ro');
has class => (is => 'ro', required => 1);
has limit_offset => (is => 'ro');
has limit_count => (is => 'ro');
sub BUILD {
my ($self, $args) = @_;
my $class = $args->{class};
unless ($class->does('Norma::ORM::Mappable')) {
die "class $class should consume Norma::ORM::Mappable but it doesn't look like it does";
}
my $table = $class->_table;
my $dbh = $self->{_dbh} = $class->_dbh;
my @join_clauses;
my %joins = @{ $args->{join} || [] };
while (my ($table, $association) = each %joins) {
push @join_clauses, "$table on $association";
}
my $query_clauses = {};
$query_clauses->{join} = join ' join ', $table->{name}, @join_clauses;
$self->{_where_clauses} = [];
my $where_clause = join ' and ', sort @{ $self->_parse_criteria($args->{where}) };
$query_clauses->{where} = "where $where_clause" if $where_clause;
my $order_clause = $args->{order_clause} || $class->_defaults->{order_clause} || '';
$query_clauses->{order} = "order by $order_clause" if $order_clause;
my $limit_offset = $args->{limit_offset} || 0;
my $limit_count = $args->{limit_count} || $class->_defaults->{limit_count} || 50;
$query_clauses->{limit} = "limit $limit_offset, $limit_count";
my $selection = $class->_table->select(
table_name => $table->{name},
%$query_clauses
);
$self->{total_count} = $selection->{total_count};
$self->{query} = $selection->{query};
for my $row (@{ $selection->{rows} }) {
my $item = $class->new(%$row);
push @{ $self->{items} }, $item;
}
};
no Moose;
sub _parse_criteria {
my ($self, $criteria) = @_;
( run in 2.364 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )