Introduce GOVERNANCE document and empty RESOLUTIONS file.
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultClass / HashRefInflator.pm
index a8861bd..65d2adb 100644 (file)
@@ -28,9 +28,9 @@ DBIx::Class::ResultClass::HashRefInflator - Get raw hashrefs from a resultset
 
 =head1 DESCRIPTION
 
-DBIx::Class is faster than older ORMs like Class::DBI but it still isn't 
+DBIx::Class is faster than older ORMs like Class::DBI but it still isn't
 designed primarily for speed. Sometimes you need to quickly retrieve the data
-from a massive resultset, while skipping the creation of fancy row objects.
+from a massive resultset, while skipping the creation of fancy result objects.
 Specifying this class as a C<result_class> for a resultset will change C<< $rs->next >>
 to return a plain data hash-ref (or a list of such hash-refs if C<< $rs->all >> is used).
 
@@ -64,38 +64,28 @@ recommended.
 # Arguments: ($me, $prefetch, $is_root) from inflate_result() below
 my $mk_hash;
 $mk_hash = sub {
-    if (ref $_[0] eq 'ARRAY') {     # multi relationship
-        return [ map { $mk_hash->(@$_) || () } (@_) ];
-    }
-    else {
-        my $hash = {
-            # the main hash could be an undef if we are processing a skipped-over join
-            $_[0] ? %{$_[0]} : (),
-
-            # the second arg is a hash of arrays for each prefetched relation
-            map
-                { $_ => $mk_hash->( @{$_[1]->{$_}} ) }
-                ( $_[1] ? (keys %{$_[1]}) : () )
-        };
-
-        # if there is at least one defined column *OR* we are at the root of
-        # the resultset - consider the result real (and not an emtpy has_many
-        # rel containing one empty hashref)
-        # an empty arrayref is an empty multi-sub-prefetch - don't consider
-        # those either
-        return $hash if $_[2];
-
-        for (values %$hash) {
-            if (ref $_ eq 'ARRAY') {
-              return $hash if @$_;
-            }
-            elsif (defined $_) {
-              return $hash;
-            }
-        }
-
-        return undef;
-    }
+
+  my $hash = {
+
+    # the main hash could be an undef if we are processing a skipped-over join
+    $_[0] ? %{$_[0]} : (),
+
+    # the second arg is a hash of arrays for each prefetched relation
+    map { $_ => (
+
+      # null-branch or not
+      ref $_[1]->{$_} eq $DBIx::Class::ResultSource::RowParser::Util::null_branch_class
+
+        ? ref $_[1]->{$_}[0] eq 'ARRAY' ? [] : undef
+
+        : ref $_[1]->{$_}[0] eq 'ARRAY'
+          ? [ map { $mk_hash->( @$_ ) || () } @{$_[1]->{$_}} ]
+          : $mk_hash->( @{$_[1]->{$_}} )
+
+    ) } ($_[1] ? keys %{$_[1]} : ())
+  };
+
+  ($_[2] || keys %$hash) ? $hash : undef;
 };
 
 =head1 METHODS
@@ -110,10 +100,12 @@ Inflates the result and prefetched data into a hash-ref (invoked by L<DBIx::Clas
 # inflate_result is invoked as:
 # HRI->inflate_result ($resultsource_instance, $main_data_hashref, $prefetch_data_hashref)
 sub inflate_result {
-    return $mk_hash->($_[2], $_[3], 'is_root');
-
+  return $mk_hash->($_[2], $_[3], 'is_root');
 }
 
+1;
+
+__END__
 
 =head1 CAVEATS
 
@@ -128,9 +120,9 @@ following:
 
  my $cds = $artist->cds;
  $cds->result_class('DBIx::Class::ResultClass::HashRefInflator');
- my $first = $cds->first; 
+ my $first = $cds->first;
 
-C<$first> will B<not> be a hashref, it will be a normal CD row since 
+C<$first> will B<not> be a hashref, it will be a normal CD row since
 HashRefInflator only affects resultsets at inflation time, and prefetch causes
 relations to be inflated when the master C<$artist> row is inflated.
 
@@ -142,6 +134,13 @@ The returned hash contains the raw database values.
 
 =back
 
-=cut
+=head1 FURTHER QUESTIONS?
 
-1;
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
+
+=head1 COPYRIGHT AND LICENSE
+
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.