Merge 'resultsetcolumn_custom_columns' into 'trunk'
Norbert Buchmuller [Mon, 17 Nov 2008 02:11:42 +0000 (03:11 +0100)]
r5165@vger:  mendel | 2008-11-16 20:11:42 +0100
 * Merged in changes from 'resultsetcolumn_custom_columns' branch,

1  2 
lib/DBIx/Class/ResultSetColumn.pm

@@@ -2,6 -2,7 +2,7 @@@ package DBIx::Class::ResultSetColumn
  use strict;
  use warnings;
  use base 'DBIx::Class';
+ use List::Util;
  
  =head1 NAME
  
@@@ -36,8 -37,16 +37,19 @@@ sub new 
    my ($class, $rs, $column) = @_;
    $class = ref $class if ref $class;
    my $new_parent_rs = $rs->search_rs; # we don't want to mess up the original, so clone it
-   $new_parent_rs->{attrs}->{prefetch} = undef; # prefetch causes additional columns to be fetched
-   my $new = bless { _column => $column, _parent_resultset => $new_parent_rs }, $class;
+   my $attrs = $new_parent_rs->_resolved_attrs;
+   $new_parent_rs->{attrs}->{$_} = undef for qw(prefetch include_columns +select +as); # prefetch, include_columns, +select, +as cause additional columns to be fetched
++  # If $column can be found in the 'as' list of the parent resultset, use the
++  # corresponding element of its 'select' list (to keep any custom column
++  # definition set up with 'select' or '+select' attrs), otherwise use $column
++  # (to create a new column definition on-the-fly).
+   my $as_list = $attrs->{as} || [];
+   my $select_list = $attrs->{select} || [];
+   my $as_index = List::Util::first { ($as_list->[$_] || "") eq $column } 0..$#$as_list;
 -
+   my $select = defined $as_index ? $select_list->[$as_index] : $column;
+   my $new = bless { _select => $select, _as => $column, _parent_resultset => $new_parent_rs }, $class;
    $new->throw_exception("column must be supplied") unless $column;
    return $new;
  }
@@@ -62,8 -71,7 +74,7 @@@ one value
  
  sub next {
    my $self = shift;
-   $self->{_resultset} = $self->{_parent_resultset}->search(undef, {select => [$self->{_column}], as => [$self->{_column}]}) unless ($self->{_resultset});
-   my ($row) = $self->{_resultset}->cursor->next;
+   my ($row) = $self->_resultset->cursor->next;
    return $row;
  }
  
@@@ -87,7 -95,53 +98,53 @@@ than row objects
  
  sub all {
    my $self = shift;
-   return map {$_->[0]} $self->{_parent_resultset}->search(undef, {select => [$self->{_column}], as => [$self->{_column}]})->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<DBIx::Class::ResultSet/reset>.
+ =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<undef> if there is none).
+ Much like L<DBIx::Class::ResultSet/first> but just returning the one value.
+ =cut
+ sub first {
+   my $self = shift;
+   my ($row) = $self->_resultset->cursor->reset->next;
+   return $row;
  }
  
  =head2 min
@@@ -175,7 -229,7 +232,7 @@@ value. Produces the following SQL
  
  sub func {
    my ($self,$function) = @_;
-   my $cursor = $self->{_parent_resultset}->search(undef, {select => {$function => $self->{_column}}, as => [$self->{_column}]})->cursor;
+   my $cursor = $self->{_parent_resultset}->search(undef, {select => {$function => $self->{_select}}, as => [$self->{_as}]})->cursor;
    
    if( wantarray ) {
      return map { $_->[ 0 ] } $cursor->all;
    return ( $cursor->next )[ 0 ];
  }
  
+ =head2 throw_exception
+ See L<DBIx::Class::Schema/throw_exception> for details.
+   
+ =cut 
+     
+ sub throw_exception {
+   my $self=shift;
+   if (ref $self && $self->{_parent_resultset}) {
+     $self->{_parent_resultset}->throw_exception(@_)
+   } else {
+     croak(@_);
+   }
+ }
+ # _resultset
+ #
+ # Arguments: none
+ #
+ # Return Value: $resultset
+ #
+ #  $year_col->_resultset->next
+ #
+ # Returns the underlying resultset. Creates it from the parent resultset if
+ # necessary.
+ # 
+ sub _resultset {
+   my $self = shift;
+   return $self->{_resultset} ||= $self->{_parent_resultset}->search(undef,
+     {
+       select => [$self->{_select}],
+       as => [$self->{_as}]
+     }
+   );
+ }
  1;
  
  =head1 AUTHORS