sub to_sql
{
- my($self, $parent, $andlevel)=@_;
- $andlevel=1 unless(defined($andlevel));
- my ($leftandlevel, $rightandlevel);
- my ($leftstr, $rightstr);
- my $op=$self->op();
+ my($self, $parent, @joins)=@_;
+ my @outjoins=();
+ # init
+ unless(@joins)
+ {
+ @outjoins = @joins = ("INNER");
+ }
my $left=$self->left();
my $right=$self->right();
- return ("", $andlevel) unless($left || $right);
- ($leftstr, $leftandlevel) = $self->node_to_sql($left, $parent, $andlevel);
-# print "LEFT: $leftstr\n";
- $andlevel=$self->max($andlevel, $leftandlevel);
- if(defined($op) && (($op->{name} eq "AND") || ($op->{name} eq "NOT")))
+ return ("", @outjoins) unless($left || $right);
+ my ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @joins);
+ push(@joins, @leftjoins);
+ push(@outjoins, @leftjoins);
+ my $op=$self->op();
+ if(defined($op))
{
- $andlevel++;
+ if($op->{name} eq "AND")
+ {
+ push(@joins, "INNER");
+ push(@outjoins, "INNER");
+ }
+ elsif($op->{name} eq "NOT")
+ {
+ push(@joins, "LEFT");
+ push(@outjoins, "LEFT");
+ }
}
- ($rightstr, $rightandlevel) = $self->node_to_sql($right, $parent, $andlevel);
-# print "RIGHT: $rightstr\n";
+ my ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @joins);
+ push(@outjoins, @rightjoins);
+# print "LEFT (", scalar(@leftjoins), "): $leftstr\n";
+# print "RIGHT (", scalar(@rightjoins), "): $rightstr\n";
my $str=$leftstr;
$str .= (" " . $op->{name} . " ") if($op);
$str .= $rightstr;
{
$str="(" . $str . ")";
}
- return($str, $self->max($leftandlevel, $rightandlevel));
+# print "STR: $str\n";
+ return($str, @outjoins);
}
sub node_to_sql
{
- my($self, $node, $parent, $andlevel)=@_;
- return ("", $andlevel) unless(defined($node));
- return $node->to_sql($parent, $andlevel) if(ref($node) eq "ID3FS::Path::Node");
+ my($self, $node, $parent, @joins)=@_;
+ return ("", ()) unless(defined($node));
+ return $node->to_sql($parent, @joins) if(ref($node) eq "ID3FS::Path::Node");
my $sql;
-# print("Hit node: " . $node->{name}. "(" .
-# (defined($node->{parents_id}) ? $node->{parents_id} : "") .
-# ")\n");
+ my $cnt=scalar(@joins)+1;
if(defined($node->{parents_id}))
{
-# print "HIT PARENTS_ID: $node->{parents_id}\n";
- $sql= "(t$andlevel.parents_id='$node->{parents_id}'";
- $sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
+ $sql= "(t" . scalar(@joins) . ".parents_id='$node->{parents_id}'";
+ $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
}
-# elsif($parent)
-# {
-# print "HIT \$parent\n";
-# $sql= "(t$andlevel.parents_id='$parent')";
-# }
else
{
- $sql= "(t$andlevel.parents_id=''";
- $sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
+ $sql= "(t" . scalar(@joins) .".parents_id=''";
+ $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
}
- return ($sql, $andlevel);
+ return ($sql, ());
}
sub used_tags