Merge 'trunk' into 'mssql_top_fixes'
Peter Rabbitson [Fri, 19 Jun 2009 16:41:45 +0000 (16:41 +0000)]
r6690@Thesaurus (orig r6689):  timbunce | 2009-06-16 15:06:07 +0200
Removed wording from txn_do that implies the coderef could be executed more than once.

r6691@Thesaurus (orig r6690):  timbunce | 2009-06-16 15:14:23 +0200
Added doc note that txn_commit does not perform an actual storage commit unless
there's a DBIx::Class transaction currently in effect

r6692@Thesaurus (orig r6691):  timbunce | 2009-06-16 15:40:11 +0200
Reverted doc patch r6689 for now, sadly. I'll open a ticket to explain.

r6694@Thesaurus (orig r6693):  ribasushi | 2009-06-16 17:22:59 +0200
Fix possible regression with prefetch select resolution
r6699@Thesaurus (orig r6698):  wintrmute | 2009-06-17 10:32:30 +0200
Replace vague language around whether load_classes/namespaces is preferred,
with an explanation that load_namespaces() is generally preferred, and explain
when load_classes is appropriate.
r6702@Thesaurus (orig r6701):  caelum | 2009-06-17 19:50:47 +0200
fix page with offset bug
r6704@Thesaurus (orig r6703):  ribasushi | 2009-06-18 08:40:18 +0200
Cleanup attribute handling - I deal with resolved attributes throughout, no point in complicating things further
r6705@Thesaurus (orig r6704):  abraxxa | 2009-06-18 12:30:01 +0200
added test for nested has_many prefetch without entries

r6707@Thesaurus (orig r6706):  ribasushi | 2009-06-18 12:43:36 +0200
HRI fix
r6708@Thesaurus (orig r6707):  ribasushi | 2009-06-18 14:05:42 +0200
wtf
r6714@Thesaurus (orig r6713):  caelum | 2009-06-19 01:03:01 +0200
fix broken link in manual
r6726@Thesaurus (orig r6725):  ribasushi | 2009-06-19 17:25:19 +0200
 r6706@Thesaurus (orig r6705):  ribasushi | 2009-06-18 12:30:08 +0200
 Branch to attempt prefetch with limit fix
 r6709@Thesaurus (orig r6708):  ribasushi | 2009-06-18 15:54:38 +0200
 This seems to be the prefetch+limit fix - ugly as hell but appears to work
 r6710@Thesaurus (orig r6709):  ribasushi | 2009-06-18 16:13:31 +0200
 More comments
 r6717@Thesaurus (orig r6716):  ribasushi | 2009-06-19 15:39:43 +0200
 single() throws with has_many prefetch
 r6718@Thesaurus (orig r6717):  ribasushi | 2009-06-19 15:40:38 +0200
 Rename test
 r6719@Thesaurus (orig r6718):  ribasushi | 2009-06-19 15:44:26 +0200
 cleanup svn attrs
 r6720@Thesaurus (orig r6719):  ash | 2009-06-19 16:31:11 +0200
 Add extra test for prefetch+has_many

 r6721@Thesaurus (orig r6720):  ribasushi | 2009-06-19 16:33:49 +0200
 no need to slice as use_prefetch already has a limit
 r6722@Thesaurus (orig r6721):  ribasushi | 2009-06-19 16:36:08 +0200
 throw in an extra limit, sophisticate test a bit
 r6723@Thesaurus (orig r6722):  ribasushi | 2009-06-19 16:36:54 +0200
 Fix the fix
 r6725@Thesaurus (orig r6724):  ribasushi | 2009-06-19 17:24:23 +0200
 Fix dubious optimization

1  2 
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/Storage/DBI.pm

@@@ -2595,27 -2605,28 +2605,30 @@@ sub _resolved_attrs 
    # Although this is needed only if the order_by is not defined, it is
    # actually cheaper to just populate this rather than properly examining
    # order_by (stuf like [ {} ] and the like)
 -  $attrs->{_virtual_order_by} = [ $self->result_source->primary_columns ];
 -
 +  my $prefix = $alias . ($source->schema->storage->_sql_maker_opts->{name_sep} || '.');
 +  $attrs->{_virtual_order_by} = [
 +    map { $prefix . $_ } ($source->primary_columns)
 +  ];
  
-   my $collapse = $attrs->{collapse} || {};
+   $attrs->{collapse} ||= {};
    if ( my $prefetch = delete $attrs->{prefetch} ) {
      $prefetch = $self->_merge_attr( {}, $prefetch );
-     my @pre_order;
-     foreach my $p ( ref $prefetch eq 'ARRAY' ? @$prefetch : ($prefetch) ) {
-       # bring joins back to level of current class
-       my $join_map = $self->_joinpath_aliases ($attrs->{from}, $attrs->{seen_join});
-       my @prefetch =
-         $source->_resolve_prefetch( $p, $alias, $join_map, \@pre_order, $collapse );
-       push( @{ $attrs->{select} }, map { $_->[0] } @prefetch );
-       push( @{ $attrs->{as} },     map { $_->[1] } @prefetch );
-     }
-     push( @{ $attrs->{order_by} }, @pre_order );
+     my $prefetch_ordering = [];
+     my $join_map = $self->_joinpath_aliases ($attrs->{from}, $attrs->{seen_join});
+     my @prefetch =
+       $source->_resolve_prefetch( $prefetch, $alias, $join_map, $prefetch_ordering, $attrs->{collapse} );
+     push( @{ $attrs->{select} }, map { $_->[0] } @prefetch );
+     push( @{ $attrs->{as} },     map { $_->[1] } @prefetch );
+     push( @{ $attrs->{order_by} }, @$prefetch_ordering );
+     $attrs->{_collapse_order_by} = \@$prefetch_ordering;
    }
  
    if (delete $attrs->{distinct}) {
      $attrs->{group_by} ||= [ grep { !ref($_) || (ref($_) ne 'HASH') } @{$attrs->{select}} ];
    }
@@@ -1226,21 -1226,13 +1226,15 @@@ sub _select_args_to_query 
  }
  
  sub _select_args {
-   my ($self, $ident, $select, $condition, $attrs) = @_;
+   my ($self, $ident, $select, $where, $attrs) = @_;
  
    my $sql_maker = $self->sql_maker;
 +  $sql_maker->{_dbic_rs_attrs} = $attrs;
 +
-   my $order = { map
-     { $attrs->{$_} ? ( $_ => $attrs->{$_} ) : ()  }
-     (qw/order_by group_by having _virtual_order_by/ )
-   };
-   my $bind_attrs = {};
    my $alias2source = $self->_resolve_ident_sources ($ident);
  
+   # calculate bind_attrs before possible $ident mangling
+   my $bind_attrs = {};
    for my $alias (keys %$alias2source) {
      my $bindtypes = $self->source_bind_attributes ($alias2source->{$alias}) || {};
      for my $col (keys %$bindtypes) {