[Bast-commits] r5075 - in DBIx-Class/0.08/branches/column_attr: . lib/DBIx/Class

nigel at dev.catalyst.perl.org nigel at dev.catalyst.perl.org
Fri Nov 7 17:23:43 GMT 2008


Author: nigel
Date: 2008-11-07 17:23:43 +0000 (Fri, 07 Nov 2008)
New Revision: 5075

Modified:
   DBIx-Class/0.08/branches/column_attr/
   DBIx-Class/0.08/branches/column_attr/lib/DBIx/Class/ResultSet.pm
Log:
 r10064 at hex:  nigel | 2008-11-07 17:23:32 +0000
 Reworked _resolved_attrs() to allow columns to include hashes (with
 as => select elements), and to add +columns (same syntax).
 Current state:
   2 broken tests in CDBI emulation:-
     t/cdbi-t/max_min_value_of                      (Wstat: 512 Tests: 2 Failed: 2)
       Failed tests:  1-2
       Non-zero exit status: 2
 Other tests work (suprisingly).
 Documentation to be done.
 Interaction between columns/select may be different....



Property changes on: DBIx-Class/0.08/branches/column_attr
___________________________________________________________________
Name: svk:merge
   - 168d5346-440b-0410-b799-f706be625ff1:/DBIx-Class-current:2207
462d4d0c-b505-0410-bf8e-ce8f877b3390:/local/bast/DBIx-Class:3159
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class:32260
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class-CDBICompat:54993
9c88509d-e914-0410-b01c-b9530614cbfe:/vendor/DBIx-Class:31122
bd5ac9a7-f185-4d95-9186-dbb8b392a572:/local/os/bast/DBIx-Class/0.08/trunk:2798
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/cdbicompat_integration:4160
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/complex_join_rels:4589
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/file_column:3920
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/on_disconnect_do:3694
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/oracle_sequence:4173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/parser_fk_index:4485
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/replication_dedux:4600
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/savepoints:4223
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/storage-ms-access:4142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioned_enhancements:4125
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioning:4578
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-C3:318
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-current:2222
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-joins:173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-resultset:570
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/datetime:1716
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_compat:1855
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_unique_query_fixes:2142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/inflate:1988
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/many_to_many:2025
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/re_refactor_bugfix:1944
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/reorganize_tests:1827
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset-new-refactor:1766
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_2_electric_boogaloo:2175
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_cleanup:2102
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/sqlt_tests_refactor:2043
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/trunk/DBIx-Class:3606
fe160bb6-dc1c-0410-9f2b-d64a711b54a5:/local/DBIC-trunk-0.08:10510
   + 168d5346-440b-0410-b799-f706be625ff1:/DBIx-Class-current:2207
462d4d0c-b505-0410-bf8e-ce8f877b3390:/local/bast/DBIx-Class:3159
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class:32260
9c88509d-e914-0410-b01c-b9530614cbfe:/local/DBIx-Class-CDBICompat:54993
9c88509d-e914-0410-b01c-b9530614cbfe:/vendor/DBIx-Class:31122
ab17426e-7cd3-4704-a2a2-80b7c0a611bb:/local/dbic_column_attr:10064
bd5ac9a7-f185-4d95-9186-dbb8b392a572:/local/os/bast/DBIx-Class/0.08/trunk:2798
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/cdbicompat_integration:4160
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/complex_join_rels:4589
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/file_column:3920
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/on_disconnect_do:3694
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/oracle_sequence:4173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/parser_fk_index:4485
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/replication_dedux:4600
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/savepoints:4223
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/storage-ms-access:4142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioned_enhancements:4125
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/branches/versioning:4578
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/DBIx-Class/0.08/trunk:5073
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-C3:318
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-current:2222
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-joins:173
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class-resultset:570
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/datetime:1716
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_compat:1855
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/find_unique_query_fixes:2142
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/inflate:1988
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/many_to_many:2025
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/re_refactor_bugfix:1944
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/reorganize_tests:1827
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset-new-refactor:1766
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_2_electric_boogaloo:2175
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/resultset_cleanup:2102
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/branches/DBIx-Class/sqlt_tests_refactor:2043
bd8105ee-0ff8-0310-8827-fb3f25b6796d:/trunk/DBIx-Class:3606
fe160bb6-dc1c-0410-9f2b-d64a711b54a5:/local/DBIC-trunk-0.08:10510

Modified: DBIx-Class/0.08/branches/column_attr/lib/DBIx/Class/ResultSet.pm
===================================================================
--- DBIx-Class/0.08/branches/column_attr/lib/DBIx/Class/ResultSet.pm	2008-11-07 13:10:11 UTC (rev 5074)
+++ DBIx-Class/0.08/branches/column_attr/lib/DBIx/Class/ResultSet.pm	2008-11-07 17:23:43 UTC (rev 5075)
@@ -2070,103 +2070,147 @@
 }
 
 sub _resolved_attrs {
-  my $self = shift;
-  return $self->{_attrs} if $self->{_attrs};
+    my $self = shift;
+    return $self->{_attrs} if $self->{_attrs};
 
-  my $attrs = { %{$self->{attrs}||{}} };
-  my $source = $self->result_source;
-  my $alias = $attrs->{alias};
+    my $attrs  = { %{ $self->{attrs} || {} } };
+    my $source = $self->result_source;
+    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 $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'}) {
-    $adds = [$adds] unless ref $adds eq 'ARRAY';
-    push(@{$attrs->{select}},
-           map { /\./ || ref $_ ? $_ : "${alias}.$_" } @$adds);
-  }
-  if (my $adds = delete $attrs->{'+as'}) {
-    $adds = [$adds] unless ref $adds eq 'ARRAY';
-    push(@{$attrs->{as}}, @$adds);
-  }
+    $attrs->{columns} ||= delete $attrs->{cols} if exists $attrs->{cols};
+    $attrs->{columns} ||= [ $source->columns ] unless ( $attrs->{select} );
+    if ( $attrs->{columns} ) {
 
-  $attrs->{from} ||= [ { 'me' => $source->from } ];
+        # if columns is set we overwrite select & as
+        $attrs->{select} = [];
+        $attrs->{as}     = [];
+        foreach my $colbit ( @{ $attrs->{columns} } ) {
+            if ( ref($_) eq 'HASH' ) {
+                push(
+                    @{ $attrs->{select} },
+                    map { ref($_) ? $_ : m/\./ ? $_ : "${alias}.$_" }
+                      values( %{$colbit} )
+                );
+                push(
+                    @{ $attrs->{as} },
+                    map { m/^\Q${alias}.\E(.+)$/ ? $1 : $_ } keys( %{$colbit} )
+                );
+            }
+            else {
+                push(
+                    @{ $attrs->{select} },
+                    ( $colbit =~ m/\./ ) ? $colbit : "${alias}.${colbit}"
+                );
+                push(
+                    @{ $attrs->{as} },
+                    ( $colbit =~ m/^\Q${alias}.\E(.+)$/ ) ? $1 : $colbit
+                );
+            }
+        }
+        delete $attrs->{columns};
+    }
+    else {
+        $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->{'+columns'} ) {
+        $adds = [$adds] unless ref $adds eq 'ARRAY';
+        push(
+            @{ $attrs->{select} },
+            map { ref($_) eq 'HASH' ? values( %{$_} ) : $_ } @$adds
+        );
+        push(
+            @{ $attrs->{as} },
+            map { ref($_) eq 'HASH' ? keys( %{$_} ) : $_ } @$adds
+        );
+    }
+    if ( $adds = delete $attrs->{'+select'} ) {
+        $adds = [$adds] unless ref $adds eq 'ARRAY';
+        push(
+            @{ $attrs->{select} },
+            map { /\./ || ref $_ ? $_ : "${alias}.$_" } @$adds
+        );
+    }
+    if ( $adds = delete $attrs->{'+as'} ) {
+        $adds = [$adds] unless ref $adds eq 'ARRAY';
+        push( @{ $attrs->{as} }, @$adds );
+    }
 
-  if (exists $attrs->{join} || exists $attrs->{prefetch}) {
-    my $join = delete $attrs->{join} || {};
+    $attrs->{from} ||= [ { 'me' => $source->from } ];
 
-    if (defined $attrs->{prefetch}) {
-      $join = $self->_merge_attr(
-        $join, $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} );
+
+        }
+
+        $attrs->{from} =    # have to copy here to avoid corrupting the original
+          [
+            @{ $attrs->{from} },
+            $source->resolve_join(
+                $join, $alias, { %{ $attrs->{seen_join} || {} } }
+            )
+          ];
+
     }
 
-    $attrs->{from} =   # have to copy here to avoid corrupting the original
-      [
-        @{$attrs->{from}}, 
-        $source->resolve_join($join, $alias, { %{$attrs->{seen_join}||{}} })
-      ];
+    $attrs->{group_by} ||= $attrs->{select} if delete $attrs->{distinct};
+    if ( $attrs->{order_by} ) {
+        $attrs->{order_by} = (
+            ref( $attrs->{order_by} ) eq 'ARRAY'
+            ? [ @{ $attrs->{order_by} } ]
+            : [ $attrs->{order_by} ]
+        );
+    }
+    else {
+        $attrs->{order_by} = [];
+    }
 
-  }
+    my $collapse = $attrs->{collapse} || {};
+    if ( my $prefetch = delete $attrs->{prefetch} ) {
+        $prefetch = $self->_merge_attr( {}, $prefetch );
+        my @pre_order;
+        my $seen = $attrs->{seen_join} || {};
+        foreach my $p ( ref $prefetch eq 'ARRAY' ? @$prefetch : ($prefetch) ) {
 
-  $attrs->{group_by} ||= $attrs->{select} if delete $attrs->{distinct};
-  if ($attrs->{order_by}) {
-    $attrs->{order_by} = (ref($attrs->{order_by}) eq 'ARRAY'
-                           ? [ @{$attrs->{order_by}} ]
-                           : [ $attrs->{order_by} ]);
-  } else {
-    $attrs->{order_by} = [];    
-  }
+            # 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 );
+        }
+        push( @{ $attrs->{order_by} }, @pre_order );
+    }
+    $attrs->{collapse} = $collapse;
 
-  my $collapse = $attrs->{collapse} || {};
-  if (my $prefetch = delete $attrs->{prefetch}) {
-    $prefetch = $self->_merge_attr({}, $prefetch);
-    my @pre_order;
-    my $seen = $attrs->{seen_join} || {};
-    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);
+    if ( $attrs->{page} ) {
+        $attrs->{offset} ||= 0;
+        $attrs->{offset} += ( $attrs->{rows} * ( $attrs->{page} - 1 ) );
     }
-    push(@{$attrs->{order_by}}, @pre_order);
-  }
-  $attrs->{collapse} = $collapse;
 
-  if ($attrs->{page}) {
-    $attrs->{offset} ||= 0;
-    $attrs->{offset} += ($attrs->{rows} * ($attrs->{page} - 1));
-  }
-
-  return $self->{_attrs} = $attrs;
+    return $self->{_attrs} = $attrs;
 }
 
 sub _rollout_attr {




More information about the Bast-commits mailing list