First go at supporting the populate syntax for resultset objects. Got non void conte...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSet.pm
index ed0f1c7..1c3342b 100644 (file)
@@ -98,8 +98,8 @@ sub new {
   $attrs->{alias} ||= 'me';
 
   my $self = {
-    result_source => $source,
-    result_class => $attrs->{result_class} || $source->result_class,
+    _source_handle => $source,
+    result_class => $attrs->{result_class} || $source->resolve->result_class,
     cond => $attrs->{where},
     count => undef,
     pager => undef,
@@ -350,11 +350,13 @@ sub find {
 
   my (%related, $info);
 
-  foreach my $key (keys %$input_query) {
+  KEY: foreach my $key (keys %$input_query) {
     if (ref($input_query->{$key})
         && ($info = $self->result_source->relationship_info($key))) {
+      my $val = delete $input_query->{$key};
+      next KEY if (ref($val) eq 'ARRAY'); # has_many for multi_create
       my $rel_q = $self->result_source->resolve_condition(
-                    $info->{cond}, delete $input_query->{$key}, $key
+                    $info->{cond}, $val, $key
                   );
       die "Can't handle OR join condition in find" if ref($rel_q) eq 'ARRAY';
       @related{keys %$rel_q} = values %$rel_q;
@@ -826,8 +828,6 @@ sub _collapse_result {
       }
   );
 
-  # THIS BIT STILL NEEDS TO DO THE COLLAPSE
-
   my $alias = $self->{attrs}{alias};
   my $info = [];
 
@@ -1240,6 +1240,70 @@ sub delete_all {
   return 1;
 }
 
+=head2 populate
+
+=over 4
+
+=item Arguments: $source_name, \@data;
+
+=back
+
+Pass an arrayref of hashrefs. Each hashref should be a structure suitable for
+submitting to a $resultset->create(...) method.
+
+In void context, C<insert_bulk> in L<DBIx::Class::Storage::DBI> is used
+to insert the data, as this is a fast method.
+
+Otherwise, each set of data is inserted into the database using
+L<DBIx::Class::ResultSet/create>, and a arrayref of the resulting row
+objects is returned.
+
+i.e.,
+
+  $rs->populate( [
+         { artistid => 4, name => 'Manufactured Crap', cds => [ 
+                 { title => 'My First CD', year => 2006 },
+                 { title => 'Yet More Tweeny-Pop crap', year => 2007 },
+               ] 
+         },
+         { artistid => 5, name => 'Angsty-Whiny Girl', cds => [
+                 { title => 'My parents sold me to a record company' ,year => 2005 },
+                 { title => 'Why Am I So Ugly?', year => 2006 },
+                 { title => 'I Got Surgery and am now Popular', year => 2007 }
+               ]
+         },
+         { name => 'Like I Give a Damn' }
+
+       ] );
+
+=cut
+use Data::Dump qw/dump/;
+
+sub populate {
+  my ($self, $data) = @_;
+  
+  if(defined wantarray) {
+    my @created;
+    foreach my $item (@$data) {
+      push(@created, $self->create($item));
+    }
+    return @created;
+  } 
+  else
+  {
+    my ($first, @rest) = @$data;
+    my @names = keys %$first;
+       
+       warn dump keys %$_ for @$data;
+       
+       #@$data = map { my %unit = %$_; warn dump @unit{qw/cds artistid/}; warn dump %unit; } @$data;
+       
+       die "Void mode not supported yet :)";
+       
+    #$self->result_source->storage->insert_bulk($self->result_source, \@names, $data);
+  }
+}
+
 =head2 pager
 
 =over 4