Added pager support, same syntax as Sweet. Also fixed a few issues with ResultSet...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSet.pm
CommitLineData
89c0a5a2 1package DBIx::Class::ResultSet;
2
3use strict;
4use warnings;
5use overload
6 '0+' => 'count',
7 fallback => 1;
8
9sub new {
7624b19f 10 my ($it_class, $db_class, $attrs) = @_;
89c0a5a2 11 #use Data::Dumper; warn Dumper(@_);
12 $it_class = ref $it_class if ref $it_class;
13 $attrs = { %{ $attrs || {} } };
7624b19f 14 my $cols = [ $db_class->_select_columns ];
15 my $cursor = $db_class->storage->select($db_class->_table_name,$cols,
89c0a5a2 16 $attrs->{where},$attrs);
89c0a5a2 17 my $new = {
18 class => $db_class,
19 cursor => $cursor,
20 cols => $cols,
89c0a5a2 21 cond => $attrs->{where},
22 attrs => $attrs };
23 return bless ($new, $it_class);
24}
25
26sub slice {
27 my ($self, $min, $max) = @_;
28 my $attrs = { %{ $self->{attrs} || {} } };
29 $self->{class}->throw("Can't slice without where") unless $attrs->{where};
30 $attrs->{offset} = $min;
31 $attrs->{rows} = ($max ? ($max - $min + 1) : 1);
7624b19f 32 my $slice = $self->new($self->{class}, $attrs);
89c0a5a2 33 return (wantarray ? $slice->all : $slice);
34}
35
36sub next {
37 my ($self) = @_;
38 my @row = $self->{cursor}->next;
39 return unless (@row);
40 return $self->{class}->_row_to_object($self->{cols}, \@row);
41}
42
43sub count {
44 my ($self) = @_;
7624b19f 45 my $db_class = $self->{class};
59f8e584 46
47 # offset breaks COUNT(*), so remove it
48 my $attrs = { %{ $self->{attrs} } };
49 delete $attrs->{offset};
50
7624b19f 51 my @cols = 'COUNT(*)';
1a14aa3f 52 my ($c) = $db_class->storage->select_single($db_class->_table_name, \@cols,
59f8e584 53 $self->{cond}, $attrs);
54 return 0 unless $c;
55 return ( $attrs->{rows} && $attrs->{rows} < $c )
56 ? $attrs->{rows}
57 : $c;
89c0a5a2 58}
59
60sub all {
61 my ($self) = @_;
1a14aa3f 62 return map { $self->{class}->_row_to_object($self->{cols}, $_); }
63 $self->{cursor}->all;
89c0a5a2 64}
65
66sub reset {
67 my ($self) = @_;
68 $self->{cursor}->reset;
69 return $self;
70}
71
72sub first {
73 return $_[0]->reset->next;
74}
75
28927b50 76sub delete {
89c0a5a2 77 my ($self) = @_;
78 $_->delete for $self->all;
79 return 1;
80}
81
28927b50 82*delete_all = \&delete; # Yeah, yeah, yeah ...
83
89c0a5a2 841;