fix /NOT
[id3fs.git] / lib / ID3FS / Path / Node.pm
index b692750..68515e3 100644 (file)
@@ -56,4 +56,104 @@ sub print_node
     return $node->{name};
 }
 
+sub to_sql
+{
+    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 ("", @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))
+    {
+       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);
+       }
+    }
+    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 && !$not);
+    $str .= $rightstr;
+    if($op || ($left && $right))
+    {
+       $str="(" . $str . ")";
+    }
+#    print "STR: $str\n";
+    return($str, @outjoins);
+}
+
+sub node_to_sql
+{
+    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}))
+    {
+       $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} . "'";
+    }
+    if($not)
+    {
+       $sql .= " AND fxt" . scalar(@joins) . ".files_id IS NULL";
+    }
+    $sql .= ")";
+    return ($sql, ());
+}
+
+sub used_tags
+{
+    my($self)=@_;
+    my @used=(grep { defined; }  ($self->node_used_tags($self->left()),
+                                 $self->node_used_tags($self->right())));
+    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");
+    if(defined($node->{parents_id}))
+    {
+       return([ $node->{parents_id}, $node->{id} ]);
+    }
+    return $node->{id};
+}
+
+
+sub max
+{
+    my($self, $a, $b)=@_;
+    return(($a > $b) ? $a : $b);
+}
+
 1;