X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FDBIx%2FClass.pm;h=93a39a05472ab8385e353a4a7f0df048350ae77b;hb=51b31bbe7d3359237fd2eb5e1f4aadb133578f25;hp=d69e42c8de8bcae7238f1756515842efa0549c81;hpb=176213794ea19cf2c3c0d52d189d2731411e8d4d;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/SQL/Translator/Parser/DBIx/Class.pm b/lib/SQL/Translator/Parser/DBIx/Class.pm index d69e42c..93a39a0 100644 --- a/lib/SQL/Translator/Parser/DBIx/Class.pm +++ b/lib/SQL/Translator/Parser/DBIx/Class.pm @@ -17,6 +17,7 @@ use SQL::Translator::Utils qw(debug normalize_name); use Carp::Clan qw/^SQL::Translator|^DBIx::Class|^Try::Tiny/; use Scalar::Util 'weaken'; use Try::Tiny; +use Devel::Dwarn; use namespace::clean; use base qw(Exporter); @@ -299,17 +300,26 @@ EOW } my %views; + my @views = map { $dbicschema->source($_) } keys %view_monikers; + my $view_dependencies; - my @view_sources = - sort { - keys %{ $a->deploy_depends_on || {} } - <=> - keys %{ $b->deploy_depends_on || {} } - || - $a->source_name cmp $b->source_name + ### This is a loop instead of a map because + ### passing an object to the sub failed--gave + ### $view->name instead of the $view! + + for my $view (@views) { + $view_dependencies->{ $view->name } = + _resolve_view_deps ( { view => $view }, \%view_monikers ); } - map { $dbicschema->source($_) } - keys %view_monikers; + + my @view_sources = + sort { + keys %{ $view_dependencies->{ $a->name } || {} } <=> + keys %{ $view_dependencies->{ $b->name } || {} } + || $a->source_name cmp $b->source_name + } + map { $dbicschema->source($_) } + keys %view_monikers; foreach my $source (@view_sources) { @@ -380,6 +390,33 @@ sub _resolve_deps { return $ret; } +sub _resolve_view_deps { + my ( $view0, $monikers, $seen ) = @_; + my $view = $view0->{view}; + 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 => $view->schema->source($new_source_name) }, + $monikers, \%seen, ); + $ret->{$_} += $subdeps->{$_} for ( keys %$subdeps ); + + ++$ret->{$dep}; + } + return $ret; +} + 1; =head1 NAME