Merge 'DBIx-Class-joins' into 'trunk'
[dbsrgits/DBIx-Class-Historic.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;
3c5b25c5 8use Data::Page;
89c0a5a2 9
10sub new {
7624b19f 11 my ($it_class, $db_class, $attrs) = @_;
89c0a5a2 12 #use Data::Dumper; warn Dumper(@_);
13 $it_class = ref $it_class if ref $it_class;
14 $attrs = { %{ $attrs || {} } };
7624b19f 15 my $cols = [ $db_class->_select_columns ];
89c0a5a2 16 my $new = {
17 class => $db_class,
89c0a5a2 18 cols => $cols,
89c0a5a2 19 cond => $attrs->{where},
3c5b25c5 20 count => undef,
21 pager => undef,
89c0a5a2 22 attrs => $attrs };
9229f20a 23 bless ($new, $it_class);
24 $new->pager if ($attrs->{page});
25 return $new;
89c0a5a2 26}
27
73f58123 28sub cursor {
29 my ($self) = @_;
30 my ($db_class, $attrs) = @{$self}{qw/class attrs/};
3c5b25c5 31 if ($attrs->{page}) {
32 $attrs->{rows} = $self->pager->entries_per_page;
33 $attrs->{offset} = $self->pager->skipped;
34 }
73f58123 35 return $self->{cursor}
36 ||= $db_class->storage->select($db_class->_table_name, $self->{cols},
37 $attrs->{where},$attrs);
38}
39
89c0a5a2 40sub slice {
41 my ($self, $min, $max) = @_;
42 my $attrs = { %{ $self->{attrs} || {} } };
43 $self->{class}->throw("Can't slice without where") unless $attrs->{where};
44 $attrs->{offset} = $min;
45 $attrs->{rows} = ($max ? ($max - $min + 1) : 1);
7624b19f 46 my $slice = $self->new($self->{class}, $attrs);
89c0a5a2 47 return (wantarray ? $slice->all : $slice);
48}
49
50sub next {
51 my ($self) = @_;
73f58123 52 my @row = $self->cursor->next;
89c0a5a2 53 return unless (@row);
54 return $self->{class}->_row_to_object($self->{cols}, \@row);
55}
56
57sub count {
58 my ($self) = @_;
7624b19f 59 my $db_class = $self->{class};
59f8e584 60 my $attrs = { %{ $self->{attrs} } };
3c5b25c5 61 unless ($self->{count}) {
62 # offset and order by are not needed to count
63 delete $attrs->{$_} for qw/offset order_by/;
64
65 my @cols = 'COUNT(*)';
66 $self->{count} = $db_class->storage->select_single($db_class->_table_name, \@cols,
67 $self->{cond}, $attrs);
68 }
69 return 0 unless $self->{count};
9229f20a 70 return $self->{pager}->entries_on_this_page if ($self->{pager});
3c5b25c5 71 return ( $attrs->{rows} && $attrs->{rows} < $self->{count} )
59f8e584 72 ? $attrs->{rows}
3c5b25c5 73 : $self->{count};
89c0a5a2 74}
75
76sub all {
77 my ($self) = @_;
1a14aa3f 78 return map { $self->{class}->_row_to_object($self->{cols}, $_); }
73f58123 79 $self->cursor->all;
89c0a5a2 80}
81
82sub reset {
83 my ($self) = @_;
73f58123 84 $self->cursor->reset;
89c0a5a2 85 return $self;
86}
87
88sub first {
89 return $_[0]->reset->next;
90}
91
28927b50 92sub delete {
89c0a5a2 93 my ($self) = @_;
94 $_->delete for $self->all;
95 return 1;
96}
97
28927b50 98*delete_all = \&delete; # Yeah, yeah, yeah ...
99
3c5b25c5 100sub pager {
101 my ($self) = @_;
102 my $attrs = $self->{attrs};
103 delete $attrs->{offset};
104 my $rows_per_page = delete $attrs->{rows} || 10;
105 $self->{pager} ||= Data::Page->new(
106 $self->count, $rows_per_page, $attrs->{page} || 1);
107 $attrs->{rows} = $rows_per_page;
108 return $self->{pager};
109}
110
111sub page {
112 my ($self, $page) = @_;
113 my $attrs = $self->{attrs};
114 $attrs->{page} = $page;
115 return $self->new($self->{class}, $attrs);
116}
117
89c0a5a2 1181;