From: Norbert Buchmuller Date: Sat, 15 Nov 2008 03:18:53 +0000 (+0100) Subject: * Added ->first and ->reset implementation to ResultSetColumn. X-Git-Tag: v0.08240~237^2~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=66521001058c038fdd23f9a0b304acac381d04e7;p=dbsrgits%2FDBIx-Class.git * Added ->first and ->reset implementation to ResultSetColumn. * A bit of refactoring/cleanup of ResultSetColumn. --- diff --git a/lib/DBIx/Class/ResultSetColumn.pm b/lib/DBIx/Class/ResultSetColumn.pm index 3780853..3585d17 100644 --- a/lib/DBIx/Class/ResultSetColumn.pm +++ b/lib/DBIx/Class/ResultSetColumn.pm @@ -2,7 +2,7 @@ package DBIx::Class::ResultSetColumn; use strict; use warnings; use base 'DBIx::Class'; -use List::Util qw(first); +use List::Util; =head1 NAME @@ -41,7 +41,7 @@ sub new { $new_parent_rs->{attrs}->{$_} = undef for qw(prefetch include_columns +select +as); # prefetch, include_columns, +select, +as cause additional columns to be fetched my ($select, $as) = map { defined $_ ? ($attrs->{select}->[$_], $attrs->{as}->[$_]) : ($column, $column) } - first { ($attrs->{as} || [])->[$_] eq $column } + List::Util::first { ($attrs->{as} || [])->[$_] eq $column } 0..$#{$attrs->{as} || []}; my $new = bless { _select => $select, _as => $as, _parent_resultset => $new_parent_rs }, $class; $new->throw_exception("column must be supplied") unless $column; @@ -68,8 +68,7 @@ one value. sub next { my $self = shift; - $self->{_resultset} = $self->{_parent_resultset}->search(undef, {select => [$self->{_select}], as => [$self->{_as}]}) unless ($self->{_resultset}); - my ($row) = $self->{_resultset}->cursor->next; + my ($row) = $self->_resultset->cursor->next; return $row; } @@ -93,7 +92,53 @@ than row objects. sub all { my $self = shift; - return map {$_->[0]} $self->{_parent_resultset}->search(undef, {select => [$self->{_select}], as => [$self->{_as}]})->cursor->all; + return map { $_->[0] } $self->_resultset->cursor->all; +} + +=head2 reset + +=over 4 + +=item Arguments: none + +=item Return Value: $self + +=back + +Resets the underlying resultset's cursor, so you can iterate through the +elements of the column again. + +Much like L. + +=cut + +sub reset { + my $self = shift; + $self->_resultset->cursor->reset; + return $self; +} + +=head2 first + +=over 4 + +=item Arguments: none + +=item Return Value: $value + +=back + +Resets the underlying resultset and returns the next value of the column in the +resultset (or C if there is none). + +Much like L but just returning the one value. + +=cut + +sub first { + my $self = shift; + my ($row) = $self->{_resultset}->cursor->reset->next; + return $row; } =head2 min @@ -205,6 +250,34 @@ sub throw_exception { } } +=head2 _resultset + +=over 4 + +=item Arguments: none + +=item Return Value: $resultset + +=back + + $year_col->_resultset->next + +Returns the underlying resultset. Creates it from the parent resultset if +necessary. + +=cut + +sub _resultset { + my $self = shift; + + return $self->{_resultset} ||= $self->{_parent_resultset}->search(undef, + { + select => [$self->{_select}], + as => [$self->{_as}] + } + ); +} + 1; diff --git a/t/88result_set_column.t b/t/88result_set_column.t index 67262f0..66169f3 100644 --- a/t/88result_set_column.t +++ b/t/88result_set_column.t @@ -8,10 +8,10 @@ use DBICTest; my $schema = DBICTest->init_schema(); -plan tests => 16; +plan tests => 18; my $cd; -my $rs = $cd = $schema->resultset("CD")->search({}); +my $rs = $cd = $schema->resultset("CD")->search({}, { order_by => 'cdid' }); my $rs_title = $rs->get_column('title'); my $rs_year = $rs->get_column('year'); @@ -29,6 +29,11 @@ is($rs_title->min, 'Caterwaulin\' Blues', "min okay for title"); cmp_ok($rs_year->sum, '==', 9996, "three artists returned"); +$rs_year->reset; +is($rs_year->next, 1999, "reset okay"); + +is($rs_year->first, 1999, "first okay"); + # test +select/+as for single column my $psrs = $schema->resultset('CD')->search({}, {