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 )