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, $andlevel)=@_;
62 $andlevel=1 unless(defined($andlevel));
63 my ($leftandlevel, $rightandlevel);
64 my ($leftstr, $rightstr);
66 my $left=$self->left();
67 my $right=$self->right();
68 return ("", $andlevel) unless($left || $right);
69 ($leftstr, $leftandlevel) = $self->node_to_sql($left, $parent, $andlevel);
70 # print "LEFT: $leftstr\n";
71 $andlevel=$self->max($andlevel, $leftandlevel);
74 if(ref($op) eq "ID3FS::PathElement::Boolean")
76 # print "Op: Bool: ", $op->{name}, "\n";
83 if(defined($op) && (($op->{name} eq "AND") || ($op->{name} eq "NOT")))
87 ($rightstr, $rightandlevel) = $self->node_to_sql($right, $parent, $andlevel);
88 # print "RIGHT: $rightstr\n";
90 $str .= (" " . $op->{name} . " ") if($op);
92 if($op || ($left && $right))
94 $str="(" . $str . ")";
96 # print "STR: $str\n";
97 return($str, $self->max($leftandlevel, $rightandlevel));
102 my($self, $node, $parent, $andlevel)=@_;
103 return ("", $andlevel) unless(defined($node));
104 return $node->to_sql($parent, $andlevel) if(ref($node) eq "ID3FS::Path::Node");
105 # if((ref($node->op()) ne "ID3FS::Path::Element") &&
108 # print("Hit node: " . $node->{name}. "(" .
109 # (defined($node->{parents_id}) ? $node->{parents_id} : "") .
111 if(defined($node->{parents_id}))
113 # print "HIT PARENTS_ID: $node->{parents_id}\n";
114 $sql= "(t$andlevel.parents_id='$node->{parents_id}'";
115 $sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
119 # print "HIT \$parent\n";
120 # $sql= "(t$andlevel.parents_id='$parent')";
124 # print "HIT NORMAL\n";
125 $sql= "(t$andlevel.parents_id=''";
126 $sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
128 return ($sql, $andlevel);
134 my @used=(grep { defined; } ($self->node_used_tags($self->left()),
135 $self->node_used_tags($self->right())));
142 return (undef) unless(defined($node));
143 return $node->used_tags() if(ref($node) eq "ID3FS::Path::Node");
144 if(defined($node->{parents_id}))
146 return([ $node->{parents_id}, $node->{id} ]);
154 my($self, $a, $b)=@_;
155 return(($a > $b) ? $a : $b);