X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FID3FS%2FPath%2FNode.pm;h=68515e351a9dd92019cd4f039f73dbe0179d2fc5;hb=01c06662c7cc896ded00a11aca1be4690700f31a;hp=8adb076d51f046aacdc67d7817c9e71d7492df08;hpb=ddb9cbe0dda25dce5fbbd30738e80807d1bd3da1;p=id3fs.git diff --git a/lib/ID3FS/Path/Node.pm b/lib/ID3FS/Path/Node.pm index 8adb076..68515e3 100644 --- a/lib/ID3FS/Path/Node.pm +++ b/lib/ID3FS/Path/Node.pm @@ -58,54 +58,75 @@ sub print_node sub to_sql { - my($self, $parent, $andlevel)=@_; - $andlevel=1 unless(defined($andlevel)); - my ($leftandlevel, $rightandlevel); - my ($leftstr, $rightstr); - my $op=$self->op(); + my($self, $not, @joins)=@_; + $not=0 unless(defined($not)); + 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); - $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, $not, @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") + { + $not=1; + push(@joins, "LEFT"); + push(@outjoins, "LEFT"); + print("LEFT: ", $left->print(), "\n") if ($left); + print("RIGHT: ", $right->print(), "\n") if($right); + } } - ($rightstr, $rightandlevel) = $self->node_to_sql($right, $parent, $andlevel); + my ($rightstr, @rightjoins) = $self->node_to_sql($right, $not, @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 .= (" " . $op->{name} . " ") if($op && !$not); $str .= $rightstr; if($op || ($left && $right)) { $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, $not, @joins)=@_; + return ("", ()) unless(defined($node)); + return $node->to_sql($not, @joins) if(ref($node) eq "ID3FS::Path::Node"); my $sql; + 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} . "'"; + } + if($not) + { + $sql .= " AND fxt" . scalar(@joins) . ".files_id IS NULL"; } - return ($sql, $andlevel); + $sql .= ")"; + return ($sql, ()); } sub used_tags