- Allow specifying the separator when joining database, schema
and table names to form a moniker
- Allow using all the moniker parts in hashref moniker_map
+ - Allow matching all the moniker parts in constraint/exclude
0.07036 2013-07-08
- Fix stray comma in Pg on_delete/on_update => CASCADE (RT#84706)
return $self->_filter_tables(\@tables, $opts);
}
+sub _recurse_constraint {
+ my ($constraint, @parts) = @_;
+
+ my $name = shift @parts;
+
+ # If there are any parts left, the constraint must be an arrayref
+ croak "depth of constraint/exclude array does not match length of moniker_parts"
+ unless !!@parts == !!(ref $constraint eq 'ARRAY');
+
+ # if ths is the last part, use the constraint directly
+ return $name =~ $constraint unless @parts;
+
+ # recurse into the first matching subconstraint
+ foreach (@{$constraint}) {
+ my ($re, $sub) = @{$_};
+ return _recurse_constraint($sub, @parts)
+ if $name =~ $re;
+ }
+ return 0;
+}
+
+sub _check_constraint {
+ my ($include, $constraint, @tables) = @_;
+
+ return @tables unless defined $constraint;
+
+ return grep { !$include xor _recurse_constraint($constraint, @{$_}) } @tables
+ if ref $constraint eq 'ARRAY';
+
+ return grep { !$include xor /$constraint/ } @tables;
+}
+
+
+
# apply constraint/exclude and ignore bad tables and views
sub _filter_tables {
my ($self, $tables, $opts) = @_;
my @filtered_tables;
$opts ||= {};
- my $constraint = $opts->{constraint};
- my $exclude = $opts->{exclude};
-
- @tables = grep { /$constraint/ } @tables if defined $constraint;
- @tables = grep { ! /$exclude/ } @tables if defined $exclude;
+ @tables = _check_constraint(1, $opts->{constraint}, @tables);
+ @tables = _check_constraint(0, $opts->{exclude}, @tables);
TABLE: for my $table (@tables) {
try {
},
);
-# test moniker_part_separator + moniker_map
+# test moniker_part_separator + moniker_map + recursive constraints
$t->dump_test(
classname => 'DBICTest::DumpMore::1',
options => {
use_namespaces => 1,
moniker_map => {
my_schema => { foo => "MySchema::Floop" },
- }
+ },
+ constraint => [ [ qr/my_schema/ => qr/foo|bar/ ] ],
+ exclude => [ [ qr/my_schema/ => qr/bar/ ] ],
},
warnings => [
qr/^db_schema is not supported on SQLite/,
'Result/MySchema/Floop' => [
qr/^package DBICTest::DumpMore::1::Result::MySchema::Floop;$/m,
qr/^\Q__PACKAGE__->table("my_schema.foo");\E/m,
- # the has_many relname should not have the schema in it!
+ ],
+ },
+ neg_regexes => {
+ 'Result/MySchema/Floop' => [
+ # the bar table should not be loaded, so no relationship should exist
qr/^__PACKAGE__->has_many\(\n "bars"/m,
],
},