sub to_sql
{
- my($self, $parent, @joins)=@_;
- @joins=("INNER") unless(@joins);
- my @newjoins=();
+ my($self, $parent, @injoins)=@_;
+ my @childjoins=@injoins;
+ my @outjoins=();
+ # init
+ unless(@injoins)
+ {
+ print "\nSTART\n";
+ @outjoins = @childjoins = ("INNER");
+ }
+ print "OUT: ", join(', ', @outjoins), "\n";
+ print "CLD: ", join(', ', @childjoins), "\n";
my (@leftjoins, @rightjoins);
my ($leftstr, $rightstr);
my $op=$self->op();
my $left=$self->left();
my $right=$self->right();
- return ("", @joins) unless($left || $right);
- ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @joins);
-# print "LEFT: $leftstr\n";
+ return ("", @outjoins) unless($left || $right);
+ ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @childjoins);
# $andlevel=$self->max($andlevel, $leftandlevel);
if(defined($op))
{
if($op->{name} eq "AND")
{
- push(@newjoins, "INNER");
+ push(@childjoins, "INNER");
+ push(@outjoins, "INNER");
}
elsif($op->{name} eq "NOT")
{
- push(@newjoins, "LEFT");
+ push(@childjoins, "LEFT");
+ push(@outjoins, "LEFT");
}
}
- push(@joins, @newjoins);
- ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @joins);
-# print "RIGHT: $rightstr\n";
+ ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @leftjoins, @childjoins);
+ print "LEFT (", scalar(@leftjoins), "): $leftstr\n";
+ print "RIGHT (", scalar(@rightjoins), "): $rightstr\n";
my $str=$leftstr;
$str .= (" " . $op->{name} . " ") if($op);
$str .= $rightstr;
{
$str="(" . $str . ")";
}
-# print "LEFTJOINS: ", join(', ', @leftjoins), "\n";
-# print "RIGHTJOINS:", join(', ', @rightjoins), "\n";
-# print "NEWJOINS: ", join(', ', @newjoins), "\n";
-# print "STR: $str\n";
+ print "STR: $str\n";
# return($str, $self->max($leftandlevel, $rightandlevel));
- my @sidejoins=((scalar(@leftjoins) > scalar(@rightjoins)) ? @leftjoins : @rightjoins);
- my @alljoins=(@newjoins, @sidejoins);
- return($str, @alljoins);
+ my @oldout=@outjoins;
+ @outjoins = (@leftjoins, @outjoins, @rightjoins);
+ if($op)
+ {
+ print "ME (", (defined($op) ? $op->{name} : ""), "): ";
+ print(scalar(@outjoins), " = " , scalar(@leftjoins), " + ", scalar(@oldout),
+ " + ", scalar(@rightjoins), "\n");
+ }
+ return($str, @outjoins);
}
sub node_to_sql
{
my($self, $node, $parent, @joins)=@_;
- return ("", @joins) unless(defined($node));
+ return ("", ()) unless(defined($node));
return $node->to_sql($parent, @joins) if(ref($node) eq "ID3FS::Path::Node");
my $sql;
my $cnt=scalar(@joins)+1;
$sql= "(t" . scalar(@joins) .".parents_id=''";
$sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
}
- return ($sql, @joins);
+ return ($sql, ());
}
sub used_tags