Merge 'trunk' into 'column_attr'
Nigel Metheringham [Mon, 23 Feb 2009 18:58:19 +0000 (18:58 +0000)]
r10942@hex:  nigel | 2009-02-23 12:58:19 +0000
Merged in all changes from trunk to current point

1  2 
lib/DBIx/Class/ResultSet.pm
t/60core.t
t/68inflate_resultclass_hashrefinflator.t

@@@ -2073,90 -2283,64 +2283,90 @@@ sub _resolved_attrs 
    my $self = shift;
    return $self->{_attrs} if $self->{_attrs};
  
 -  my $attrs = { %{$self->{attrs}||{}} };
 +  my $attrs  = { %{ $self->{attrs} || {} } };
    my $source = $self->result_source;
 -  my $alias = $attrs->{alias};
 +  my $alias  = $attrs->{alias};
  
    $attrs->{columns} ||= delete $attrs->{cols} if exists $attrs->{cols};
 -  if ($attrs->{columns}) {
 -    delete $attrs->{as};
 -  } elsif (!$attrs->{select}) {
 -    $attrs->{columns} = [ $source->columns ];
 -  }
 - 
 -  $attrs->{select} = 
 -    ($attrs->{select}
 -      ? (ref $attrs->{select} eq 'ARRAY'
 -          ? [ @{$attrs->{select}} ]
 -          : [ $attrs->{select} ])
 -      : [ map { m/\./ ? $_ : "${alias}.$_" } @{delete $attrs->{columns}} ]
 -    );
 -  $attrs->{as} =
 -    ($attrs->{as}
 -      ? (ref $attrs->{as} eq 'ARRAY'
 -          ? [ @{$attrs->{as}} ]
 -          : [ $attrs->{as} ])
 -      : [ map { m/^\Q${alias}.\E(.+)$/ ? $1 : $_ } @{$attrs->{select}} ]
 +  my @colbits;
 +
 +  # build columns (as long as select isn't set) into a set of as/select hashes
 +  unless ( $attrs->{select} ) {
 +      @colbits = map {
 +          ( ref($_) eq 'HASH' ) ? $_
 +            : {
 +              (
 +                  /^\Q${alias}.\E(.+)$/ ? $1
 +                  : $_
 +                ) => ( /\./ ? $_ : "${alias}.$_" )
 +            }
 +      } ( ref($attrs->{columns}) eq 'ARRAY' ) ? @{ delete $attrs->{columns}} : (delete $attrs->{columns} || $source->columns );
 +  }
 +  # add the additional columns on
 +  foreach ( 'include_columns', '+columns' ) {
 +      push @colbits, map {
 +          ( ref($_) eq 'HASH' )
 +            ? $_
 +            : { ( split( /\./, $_ ) )[-1] => ( /\./ ? $_ : "${alias}.$_" ) }
 +      } ( ref($attrs->{$_}) eq 'ARRAY' ) ? @{ delete $attrs->{$_} } : delete $attrs->{$_} if ( $attrs->{$_} );
 +  }
 +
 +  # start with initial select items
 +  if ( $attrs->{select} ) {
 +    $attrs->{select} =
 +        ( ref $attrs->{select} eq 'ARRAY' )
 +      ? [ @{ $attrs->{select} } ]
 +      : [ $attrs->{select} ];
 +    $attrs->{as} = (
 +      $attrs->{as}
 +      ? (
 +        ref $attrs->{as} eq 'ARRAY'
 +        ? [ @{ $attrs->{as} } ]
 +        : [ $attrs->{as} ]
 +        )
 +      : [ map { m/^\Q${alias}.\E(.+)$/ ? $1 : $_ } @{ $attrs->{select} } ]
      );
 -  
 -  my $adds;
 -  if ($adds = delete $attrs->{include_columns}) {
 -    $adds = [$adds] unless ref $adds eq 'ARRAY';
 -    push(@{$attrs->{select}}, @$adds);
 -    push(@{$attrs->{as}}, map { m/([^.]+)$/; $1 } @$adds);
    }
 -  if ($adds = delete $attrs->{'+select'}) {
 +  else {
 +
 +    # otherwise we intialise select & as to empty
 +    $attrs->{select} = [];
 +    $attrs->{as}     = [];
 +  }
 +
 +  # now add colbits to select/as
 +  push( @{ $attrs->{select} }, map { values( %{$_} ) } @colbits );
 +  push( @{ $attrs->{as} },     map { keys( %{$_} ) } @colbits );
 +
 +  my $adds;
 +  if ( $adds = delete $attrs->{'+select'} ) {
      $adds = [$adds] unless ref $adds eq 'ARRAY';
 -    push(@{$attrs->{select}},
 -           map { /\./ || ref $_ ? $_ : "${alias}.$_" } @$adds);
 +    push(
 +      @{ $attrs->{select} },
 +      map { /\./ || ref $_ ? $_ : "${alias}.$_" } @$adds
 +    );
    }
 -  if (my $adds = delete $attrs->{'+as'}) {
 +  if ( $adds = delete $attrs->{'+as'} ) {
      $adds = [$adds] unless ref $adds eq 'ARRAY';
 -    push(@{$attrs->{as}}, @$adds);
 +    push( @{ $attrs->{as} }, @$adds );
    }
  
-   $attrs->{from} ||= [ { 'me' => $source->from } ];
+   $attrs->{from} ||= [ { $self->{attrs}{alias} => $source->from } ];
  
 -  if (exists $attrs->{join} || exists $attrs->{prefetch}) {
 +  if ( exists $attrs->{join} || exists $attrs->{prefetch} ) {
      my $join = delete $attrs->{join} || {};
  
 -    if (defined $attrs->{prefetch}) {
 -      $join = $self->_merge_attr(
 -        $join, $attrs->{prefetch}
 -      );
 -      
 +    if ( defined $attrs->{prefetch} ) {
 +      $join = $self->_merge_attr( $join, $attrs->{prefetch} );
 +
      }
  
 -    $attrs->{from} =   # have to copy here to avoid corrupting the original
 +    $attrs->{from} =    # have to copy here to avoid corrupting the original
        [
 -        @{$attrs->{from}}, 
 -        $source->resolve_join($join, $alias, { %{$attrs->{seen_join}||{}} })
 +      @{ $attrs->{from} },
 +      $source->resolve_join(
 +        $join, $alias, { %{ $attrs->{seen_join} || {} } }
 +      )
        ];
  
    }
    }
  
    my $collapse = $attrs->{collapse} || {};
 -  if (my $prefetch = delete $attrs->{prefetch}) {
 -    $prefetch = $self->_merge_attr({}, $prefetch);
 +  if ( my $prefetch = delete $attrs->{prefetch} ) {
 +    $prefetch = $self->_merge_attr( {}, $prefetch );
      my @pre_order;
-     my $seen = $attrs->{seen_join} || {};
+     my $seen = { %{ $attrs->{seen_join} || {} } };
 -    foreach my $p (ref $prefetch eq 'ARRAY' ? @$prefetch : ($prefetch)) {
 +    foreach my $p ( ref $prefetch eq 'ARRAY' ? @$prefetch : ($prefetch) ) {
 +
        # bring joins back to level of current class
 -      my @prefetch = $source->resolve_prefetch(
 -        $p, $alias, $seen, \@pre_order, $collapse
 -      );
 -      push(@{$attrs->{select}}, map { $_->[0] } @prefetch);
 -      push(@{$attrs->{as}}, map { $_->[1] } @prefetch);
 +      my @prefetch =
 +        $source->resolve_prefetch( $p, $alias, $seen, \@pre_order, $collapse );
 +      push( @{ $attrs->{select} }, map { $_->[0] } @prefetch );
 +      push( @{ $attrs->{as} },     map { $_->[1] } @prefetch );
      }
 -    push(@{$attrs->{order_by}}, @pre_order);
 +    push( @{ $attrs->{order_by} }, @pre_order );
    }
    $attrs->{collapse} = $collapse;
  
diff --cc t/60core.t
@@@ -7,7 -8,7 +8,7 @@@ use DBICTest
  
  my $schema = DBICTest->init_schema();
  
- plan tests => 89;
 -plan tests => 90;
++plan tests => 95;
  
  eval { require DateTime::Format::MySQL };
  my $NO_DTFM = $@ ? 1 : 0;