X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FID3FS%2FPath%2FNode.pm;h=11e2de35ef4590c1058c8b9de2fd19b77304aada;hb=dfa48c6258f1e0db4b1b17719c2ad84065335b90;hp=9fc4570a91a1ff3dde4df154a647595dcc9653e9;hpb=8c6c420ca9104a94e92f470ef7cca8b4ef242ab5;p=id3fs.git diff --git a/lib/ID3FS/Path/Node.pm b/lib/ID3FS/Path/Node.pm index 9fc4570..11e2de3 100644 --- a/lib/ID3FS/Path/Node.pm +++ b/lib/ID3FS/Path/Node.pm @@ -58,22 +58,37 @@ sub print_node sub to_sql { - my($self, $andlevel, $parent_is_tag)=@_; - $andlevel=1 unless(defined($andlevel)); - $parent_is_tag=0 unless(defined($parent_is_tag)); - 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, $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, $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, $andlevel); + 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; @@ -81,15 +96,28 @@ sub to_sql { $str="(" . $str . ")"; } - return($str, $self->max($leftandlevel, $rightandlevel)); +# print "STR: $str\n"; + return($str, @outjoins); } sub node_to_sql { - my($self, $node, $andlevel)=@_; - return ("", $andlevel) unless(defined($node)); - return $node->to_sql($andlevel) if(ref($node) eq "ID3FS::Path::Node"); - return( ( "fxt${andlevel}.tags_id=\"" . $node->{id} . "\""), $andlevel); + my($self, $node, $parent, @joins)=@_; + return ("", ()) unless(defined($node)); + return $node->to_sql($parent, @joins) if(ref($node) eq "ID3FS::Path::Node"); + my $sql; + my $cnt=scalar(@joins)+1; + if(defined($node->{parents_id})) + { + $sql= "(t" . scalar(@joins) . ".parents_id='$node->{parents_id}'"; + $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')"; + } + else + { + $sql= "(t" . scalar(@joins) .".parents_id=''"; + $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')"; + } + return ($sql, ()); } sub used_tags @@ -97,7 +125,6 @@ sub used_tags my($self)=@_; my @used=(grep { defined; } ($self->node_used_tags($self->left()), $self->node_used_tags($self->right()))); - print "used_tags: ", join(", ", @used), "\n"; return(@used); } @@ -106,8 +133,11 @@ sub node_used_tags my($self, $node)=@_; return (undef) unless(defined($node)); return $node->used_tags() if(ref($node) eq "ID3FS::Path::Node"); - print $node->{id}, "\n"; - return($node->{id}); + if(defined($node->{parents_id})) + { + return([ $node->{parents_id}, $node->{id} ]); + } + return $node->{id}; }