Initial full test pass - all fetches are eager for now
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Row.pm
index edc4b1c..c59f70a 100644 (file)
@@ -1139,43 +1139,33 @@ sub inflate_result {
 
   foreach my $pre (keys %{$prefetch||{}}) {
 
-    my (@pre_vals, $is_multi);
-    if (ref $prefetch->{$pre}[0] eq 'ARRAY') {
-      $is_multi = 1;
+    my @pre_vals;
+    if (! @{$prefetch->{$pre}}) {
+      # nothing, empty @pre_vals is put in the caches
+    }
+    elsif (ref $prefetch->{$pre}[0] eq 'ARRAY') {
       @pre_vals = @{$prefetch->{$pre}};
     }
     else {
       @pre_vals = $prefetch->{$pre};
     }
 
-    my $pre_source = try {
-      $source->related_source($pre)
-    }
-    catch {
-      $class->throw_exception(sprintf
-
-        "Can't inflate manual prefetch into non-existent relationship '%s' from '%s', "
-      . "check the inflation specification (columns/as) ending in '%s.%s'.",
-
-        $pre,
-        $source->source_name,
-        $pre,
-        (keys %{$pre_vals[0][0]})[0] || 'something.something...',
-      );
-    };
+    my $pre_source = $source->related_source($pre);
 
     my $accessor = $source->relationship_info($pre)->{attrs}{accessor}
-      or $class->throw_exception("No accessor type declared for prefetched $pre");
-
-    if (! $is_multi and $accessor eq 'multi') {
-      $class->throw_exception("Manual prefetch (via select/columns) not supported with accessor 'multi'");
-    }
+      or $class->throw_exception("No accessor type declared for prefetched relationship '$pre'");
 
     my @pre_objects;
     for my $me_pref (@pre_vals) {
-        push @pre_objects, $pre_source->result_class->inflate_result(
-          $pre_source, @$me_pref
-        );
+
+      # FIXME SUBOPTIMAL - the new row parsers can very well optimize
+      # this away entirely, and *never* return such empty rows.
+      # For now we maintain inflate_result API backcompat
+      next unless first { defined $_ } values %{$me_pref->[0]};
+
+      push @pre_objects, $pre_source->result_class->inflate_result(
+        $pre_source, @$me_pref
+      );
     }
 
     if ($accessor eq 'single') {