1 package ID3FS::Path::Node;
9 my $class=ref($proto) || $proto;
16 $self->{parents_id}=shift;
17 if($self->{type} ne "boolean")
19 my $table=ucfirst($self->{type});
20 $table .= "s" unless($table=~/s$/);
21 $self->{id}=$db->lookup_id($table, $self->{name}, $self->{parents_id});
22 return undef unless(defined($self->{id}));
29 my($self, $name, $val)=@_;
34 return $self->{$name};
37 sub left { return shift->set("left", shift); }
38 sub right { return shift->set("right", shift); }
39 sub name { return shift->set("name", shift); }
40 sub type { return shift->set("type", shift); }
41 sub id { return shift->set("id", shift); }
42 sub parents_id { return shift->set("parents_id", shift); }
48 my $left=$self->left();
49 my $right=$self->right();
50 return "" unless($left || $right);
51 my $str .= $self->print_node($left);
52 $str .= (" " . $op . " ") if($op);
53 $str .= $self->print_node($right);
54 if($op || ($left && $right))
56 $str="(" . $str . ")";
64 return "" unless(defined($node));
65 return $node->print() if(ref($node) eq "ID3FS::Path::Node");
71 my($self, $hasvals, $not, @joins)=@_;
72 $not=0 unless(defined($not));
77 @outjoins = @joins = ("INNER");
79 my $left=$self->left();
80 my $right=$self->right();
81 return ("", @outjoins) unless($left || $right);
82 my ($leftstr, @leftjoins) = $self->node_to_sql($left, $hasvals, $not, @joins);
83 push(@joins, @leftjoins);
84 push(@outjoins, @leftjoins);
86 if(defined($op) && $self->type() eq "boolean")
88 # if we are ANDing, add an inner join
89 # also if we are NOTing, but we are looking for a tag *value*
90 if( ($op eq "AND") || ($hasvals && ($op eq "NOT")))
92 # hack - if right child is a NOT, we don't need extra join/brackets
93 # NOT will do the same and we will end up with an extra one
94 unless($right && $right->name() && $right->name() eq "NOT")
96 push(@joins, "INNER");
97 push(@outjoins, "INNER");
103 push(@joins, "LEFT");
104 push(@outjoins, "LEFT");
105 # print("LEFT: ", $left->print(), "\n") if ($left);
106 # print("RIGHT: ", $right->print(), "\n") if($right);
109 my ($rightstr, @rightjoins) = $self->node_to_sql($right, $hasvals, $not, @joins);
110 push(@outjoins, @rightjoins);
111 # print "LEFT (", scalar(@leftjoins), "): $leftstr\n";
112 # print "RIGHT (", scalar(@rightjoins), "): $rightstr\n";
114 $str .= " $op " if($op && !$not);
116 if($op || ($left && $right))
118 $str="(" . $str . ")";
120 # print "STR: $str\n";
121 return($str, @outjoins);
126 my($self, $node, $hasvals, $not, @joins)=@_;
127 return ("", ()) unless(defined($node));
128 return $node->to_sql($hasvals, $not, @joins) if($node->type() eq "boolean");
130 my $cnt=scalar(@joins)+1;
131 $sql .= "t" . scalar(@joins) . ".id='" . $node->{id} . "'";
132 if($not && !$hasvals)
134 $sql .= " AND fxt" . scalar(@joins) . ".files_id IS NULL";
142 if($self->type() eq "boolean")
145 push(@used, $self->left()->used_tags()) if($self->left());
146 push(@used, $self->right()->used_tags()) if($self->right());
147 return(grep { defined; } @used);