X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSet.pm;h=5fa0d041a370ac2823ad513a6233f6e7c203e9c0;hb=53d89fc72e729d280d2d8d48d3a862b5ed20dddb;hp=222e17521f08d7e72f12f14a3295dad97dd1703e;hpb=93d7452f38b38b66d6d8282425a928873725f43e;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 222e175..5fa0d04 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -2326,28 +2326,54 @@ sub populate { # populate() arguments went over several incarnations -# What we ultimately support is AoH +# can be any mixture of : +# 1. AoA +# 2. AoH +# 3. AoS(calar) followed buy Arrayrefref (\@cols, $rs->as_query) +# 4. coderef (tuple generator) sub _normalize_populate_args { - my ($self, $arg) = @_; + my ($self, $args) = @_; - if (ref $arg eq 'ARRAY') { - if (!@$arg) { - return []; - } - elsif (ref $arg->[0] eq 'HASH') { - return $arg; - } - elsif (ref $arg->[0] eq 'ARRAY') { - my @ret; - my @colnames = @{$arg->[0]}; - foreach my $values (@{$arg}[1 .. $#$arg]) { - push @ret, { map { $colnames[$_] => $values->[$_] } (0 .. $#colnames) }; + use DDP; + my @normalized; + +ARG: for (my $idx = 0; $idx < $#$args; $idx++) { + my $arg = $args->[$idx]; + + if (ref $arg eq 'ARRAY') { + # AoH + if (ref $arg eq 'ARRAY' && @$arg > 0 && ref $arg->[0] eq 'HASH') { + push @normalized, $arg; + next ARG; + } + # AoA + elsif (ref $arg eq 'ARRAY' && @$arg > 0 && ref $arg->[0] eq 'ARRAY') { + my @ret; + my @colnames = @{$arg->[0]}; + foreach my $values (@{$arg}[1 .. $#$arg]) { + push @ret, { map { $colnames[$_] => $values->[$_] } (0 .. $#colnames) }; + } + push @normalized, \@ret; + next ARG; + } + # AoS, Arrayrefref (subq) + elsif (ref $arg eq 'ARRAY' && ref $arg->[0] eq '') { + push @normalized, $arg, $args->[$idx+1]; + $idx += 1; # we are consuming the next element, skip it next time + } + # Coderef + elsif (ref $arg eq 'CODE') { + push @normalized, $arg; } - return \@ret; } } - $self->throw_exception('Populate expects an arrayref of hashrefs or arrayref of arrayrefs'); + if (scalar @normalized == 0) { + $self->throw_exception('Populate expects some combination of arrayref of hashrefs, arrayref of arrayrefs, array of cols followed by arrayrefref or coderef'); + } + + p @normalized; + return \@normalized; } =head2 pager