1 package ID3FS::Path::Node;
9 my $class=ref($proto) || $proto;
22 my($self, $name, $val)=@_;
27 return $self->{$name};
30 sub left { return shift->set("left", shift); }
31 sub right { return shift->set("right", shift); }
32 sub op { return shift->set("op", shift); }
38 my $left=$self->left();
39 my $right=$self->right();
40 return "" unless($left || $right);
41 my $str .= $self->print_node($left);
42 $str .= (" " . $op->{name} . " ") if($op);
43 $str .= $self->print_node($right);
44 if($op || ($left && $right))
46 $str="(" . $str . ")";
54 return "" unless(defined($node));
55 return $node->print() if(ref($node) eq "ID3FS::Path::Node");
61 my($self, $parent, @joins)=@_;
62 @joins=("INNER") unless(@joins);
64 my (@leftjoins, @rightjoins);
65 my ($leftstr, $rightstr);
67 my $left=$self->left();
68 my $right=$self->right();
69 return ("", @joins) unless($left || $right);
70 ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @joins);
71 # print "LEFT: $leftstr\n";
72 # $andlevel=$self->max($andlevel, $leftandlevel);
75 if($op->{name} eq "AND")
77 push(@newjoins, "INNER");
79 elsif($op->{name} eq "NOT")
81 push(@newjoins, "LEFT");
84 push(@joins, @newjoins);
85 ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @joins);
86 # print "RIGHT: $rightstr\n";
88 $str .= (" " . $op->{name} . " ") if($op);
90 if($op || ($left && $right))
92 $str="(" . $str . ")";
94 # print "LEFTJOINS: ", join(', ', @leftjoins), "\n";
95 # print "RIGHTJOINS:", join(', ', @rightjoins), "\n";
96 # print "NEWJOINS: ", join(', ', @newjoins), "\n";
97 # print "STR: $str\n";
98 # return($str, $self->max($leftandlevel, $rightandlevel));
99 my @sidejoins=((scalar(@leftjoins) > scalar(@rightjoins)) ? @leftjoins : @rightjoins);
100 my @alljoins=(@newjoins, @sidejoins);
101 return($str, @alljoins);
106 my($self, $node, $parent, @joins)=@_;
107 return ("", @joins) unless(defined($node));
108 return $node->to_sql($parent, @joins) if(ref($node) eq "ID3FS::Path::Node");
110 my $cnt=scalar(@joins)+1;
111 if(defined($node->{parents_id}))
113 $sql= "(t" . scalar(@joins) . ".parents_id='$node->{parents_id}'";
114 $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
118 $sql= "(t" . scalar(@joins) .".parents_id=''";
119 $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
121 return ($sql, @joins);
127 my @used=(grep { defined; } ($self->node_used_tags($self->left()),
128 $self->node_used_tags($self->right())));
135 return (undef) unless(defined($node));
136 return $node->used_tags() if(ref($node) eq "ID3FS::Path::Node");
137 if(defined($node->{parents_id}))
139 return([ $node->{parents_id}, $node->{id} ]);
147 my($self, $a, $b)=@_;
148 return(($a > $b) ? $a : $b);