DBIx-DBStag
view release on metacpan or search on metacpan
DBIx/DBStag.pm view on Meta::CPAN
0;
});
}
return;
}
# ----------------------------------------
sub elt_card {
my $e = shift;
my $c = '';
if ($e =~ /(.*)([\+\?\*])/) {
($e, $c) = ($1, $2);
}
# make the element RDB-safe
$e =~ s/\-//g;
return ($e, $c);
}
sub source_transforms {
my $self = shift;
$self->{_source_transforms} = shift if @_;
return $self->{_source_transforms};
}
sub autotemplate {
my $self = shift;
my $schema = shift;
return () unless grep {!stag_isterminal($_)} $schema->subnodes;
my @J = ();
my @W = ();
my @EXAMPLE = ();
my ($tname) = elt_card($schema->element);
my %joinpaths = ();
$schema->iterate(sub {
my $n = shift;
my $parent = shift;
my ($tbl, $card) = elt_card($n->element);
if (!$parent) {
push(@J, $tbl);
# $joinpaths{$tbl} = $tbl;
return;
}
my ($ptbl) = elt_card($parent->element);
if (stag_isterminal($n)) {
my $v = $ptbl.'_'.$tbl;
my $w = "$ptbl.$tbl => \&$v\&";
if ($ptbl eq $tname) {
push(@W,
"[ $w ]");
}
else {
my $pk = $tname.'_id';
my $subselect =
"SELECT $pk FROM $joinpaths{$ptbl}".
" WHERE $w";
push(@W,
"[ $pk IN ($subselect) ]");
}
# produce example formula for non-ints
if ($n->data eq 's') {
push(@EXAMPLE,
"$v => SELECT DISTINCT $tbl FROM $ptbl");
}
}
else {
my $jtype = 'INNER JOIN';
if ($card eq '*' || $card eq '?') {
$jtype = 'LEFT OUTER JOIN';
}
my $jcol = $ptbl.'_id';
push(@J,
"$jtype $tbl USING ($jcol)");
if ($joinpaths{$ptbl}) {
$joinpaths{$tbl} =
"$joinpaths{$ptbl} INNER JOIN $tbl USING ($jcol)";
}
else {
$joinpaths{$tbl} = $tbl;
}
}
return;
});
my $from = join("\n ", @J);
my $where = join("\n ", @W);
my $nesting = $schema->duplicate;
$nesting->iterate(sub {
my $n = shift;
if (stag_isterminal($n)) {
return;
}
my ($tbl, $card) = elt_card($n->element);
$n->element($tbl);
my @sn = $n->kids;
@sn =
grep {
my ($tbl, $card) = elt_card($_->element);
$_->element($tbl);
!stag_isterminal($_)
} @sn;
if (@sn) {
$n->kids(@sn);
}
else {
$n->data([]);
}
});
$nesting = Data::Stag->new(set=>[$nesting]);
my $nstr = $nesting->sxpr;
$nstr =~ s/^\'//;
my $tt =
join("\n",
":SELECT *",
":FROM $from",
":WHERE $where",
":USE NESTING",
"$nstr",
"",
"// ---- METADATA ----",
"schema:",
( run in 0.825 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )