use tagtree in queries
[id3fs.git] / lib / ID3FS / Path / Node.pm
index 08c2088..9fc4570 100644 (file)
@@ -37,9 +37,9 @@ sub print
     my $op=$self->op();
     my $left=$self->left();
     my $right=$self->right();
-    return undef unless($left || $right);
+    return "" unless($left || $right);
     my $str .= $self->print_node($left);
-    $str .= " $op " if($op);
+    $str .= (" " . $op->{name} . " ") if($op);
     $str .= $self->print_node($right);
     if($op || ($left && $right))
     {
@@ -53,7 +53,68 @@ sub print_node
     my($self, $node)=@_;
     return "" unless(defined($node));
     return $node->print() if(ref($node) eq "ID3FS::Path::Node");
-    return $node;
+    return $node->{name};
+}
+
+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 $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")))
+    {
+       $andlevel++;
+    }
+    ($rightstr, $rightandlevel) = $self->node_to_sql($right, $andlevel);
+    my $str=$leftstr;
+    $str .= (" " . $op->{name} . " ") if($op);
+    $str .= $rightstr;
+    if($op || ($left && $right))
+    {
+       $str="(" . $str . ")";
+    }
+    return($str, $self->max($leftandlevel, $rightandlevel));
+}
+
+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);
+}
+
+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);
+}
+
+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});
+}
+
+
+sub max
+{
+    my($self, $a, $b)=@_;
+    return(($a > $b) ? $a : $b);
 }
 
 1;