X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FDBIx%2FClass.pm;h=bd3d3ba6b274bea8c60ccdebfdb7ba0b70f6235d;hb=c418c5cc5d3e8b3b456ea0daf7569f4ac3ef7cd4;hp=3a5d918ba881eae8c2b5938221e26cb011aaa0bb;hpb=c9304c0522f5cc186066acd3fba3437f3734f33c;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/SQL/Translator/Parser/DBIx/Class.pm b/lib/SQL/Translator/Parser/DBIx/Class.pm index 3a5d918..bd3d3ba 100644 --- a/lib/SQL/Translator/Parser/DBIx/Class.pm +++ b/lib/SQL/Translator/Parser/DBIx/Class.pm @@ -299,17 +299,22 @@ EOW } my %views; + my @views = map { $dbicschema->source($_) } keys %view_monikers; + + my $view_dependencies = { + map { + $_ => _resolve_view_deps( $dbicschema->source($_), \%view_monikers ) + } ( keys %view_monikers ) + }; my @view_sources = - sort { - keys %{ $a->deploy_depends_on || {} } - <=> - keys %{ $b->deploy_depends_on || {} } - || - $a->source_name cmp $b->source_name - } - map { $dbicschema->source($_) } - keys %view_monikers; + sort { + keys %{ $view_dependencies->{ $a->source_name } || {} } <=> + keys %{ $view_dependencies->{ $b->source_name } || {} } + || $a->source_name cmp $b->source_name + } + map { $dbicschema->source($_) } + keys %view_monikers; foreach my $source (@view_sources) { @@ -380,6 +385,32 @@ sub _resolve_deps { return $ret; } +sub _resolve_view_deps { + my ( $view, $monikers, $seen ) = @_; + + my $ret = {}; + $seen ||= {}; + + # copy and bump all deps by one (so we can reconstruct the chain) + my %seen = map { $_ => $seen->{$_} + 1 } ( keys %$seen ); + $seen{ $view->source_name } = 1; + for my $dep ( keys %{ $view->{deploy_depends_on} } ) { + if ( $seen->{$dep} ) { + return {}; + } + my ($new_source_name) = + grep { $view->schema->source($_)->name eq $dep } + @{ [ $view->schema->sources ] }; + my $subdeps = + _resolve_view_deps( $view->schema->source($new_source_name), + $monikers, \%seen, ); + $ret->{$_} += $subdeps->{$_} for ( keys %$subdeps ); + + ++$ret->{$dep}; + } + return $ret; +} + 1; =head1 NAME @@ -454,15 +485,9 @@ Limit the amount of parsed sources by supplying an explicit list of source names L, L -=head1 AUTHOR - -Jess Robinson - -=head2 CONTRIBUTORS +=head1 AUTHORS -Matt Trout -Ash Berlin -Amiri Barksdale +See L. =head1 LICENSE