Refactored pagination into search method, Sweet syntax is now in Compat
[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 $new = {
16     class => $db_class,
17     cols => $cols,
18     cond => $attrs->{where},
19     attrs => $attrs };
20   return bless ($new, $it_class);
21 }
22
23 sub cursor {
24   my ($self) = @_;
25   my ($db_class, $attrs) = @{$self}{qw/class attrs/};
26   return $self->{cursor}
27     ||= $db_class->storage->select($db_class->_table_name, $self->{cols},
28           $attrs->{where},$attrs);
29 }
30
31 sub slice {
32   my ($self, $min, $max) = @_;
33   my $attrs = { %{ $self->{attrs} || {} } };
34   $self->{class}->throw("Can't slice without where") unless $attrs->{where};
35   $attrs->{offset} = $min;
36   $attrs->{rows} = ($max ? ($max - $min + 1) : 1);
37   my $slice = $self->new($self->{class}, $attrs);
38   return (wantarray ? $slice->all : $slice);
39 }
40
41 sub next {
42   my ($self) = @_;
43   my @row = $self->cursor->next;
44   return unless (@row);
45   return $self->{class}->_row_to_object($self->{cols}, \@row);
46 }
47
48 sub count {
49   my ($self) = @_;
50   my $db_class = $self->{class};
51
52   # offset and order by are not needed to count
53   my $attrs = { %{ $self->{attrs} } };
54   delete $attrs->{$_} for qw/offset order_by/;
55       
56   my @cols = 'COUNT(*)';
57   my ($c) = $db_class->storage->select_single($db_class->_table_name, \@cols,
58                                             $self->{cond}, $attrs);
59   return 0 unless $c;
60   return ( $attrs->{rows} && $attrs->{rows} < $c ) 
61     ? $attrs->{rows} 
62     : $c;
63 }
64
65 sub all {
66   my ($self) = @_;
67   return map { $self->{class}->_row_to_object($self->{cols}, $_); }
68            $self->cursor->all;
69 }
70
71 sub reset {
72   my ($self) = @_;
73   $self->cursor->reset;
74   return $self;
75 }
76
77 sub first {
78   return $_[0]->reset->next;
79 }
80
81 sub delete {
82   my ($self) = @_;
83   $_->delete for $self->all;
84   return 1;
85 }
86
87 *delete_all = \&delete; # Yeah, yeah, yeah ...
88
89 1;