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