From: Ian Beckwith Date: Tue, 19 Oct 2010 18:36:01 +0000 (+0100) Subject: tidy Path and Node X-Git-Tag: debian/1.0-1~20 X-Git-Url: http://erislabs.net/gitweb/?p=id3fs.git;a=commitdiff_plain;h=52a0cfd789ebdf54b1da18dbc442b71e252a7c5e tidy Path and Node --- diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index 629c02a..2d96265 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -398,7 +398,6 @@ sub sort_elements my ($self, @input)=@_; my @opstack=(); my @output=(); -# print "INPUT: ", join(', ', map { $_->{name}; } @input), "\n"; while(my $thing = shift @input) { if($self->is($TYPE_TAG, $thing)) @@ -424,7 +423,6 @@ sub sort_elements { push(@output, pop(@opstack)); } -# print "STACK: ", join(', ', map { $_->{name}; } @output), "\n"; return @output; } @@ -501,8 +499,6 @@ sub tags } my $hasvals=$self->expecting_values(); my $parent=$self->trailing_tag_parent(); -# print "THASVALS: $hasvals\n"; -# print "TPARENT: ", (defined($parent)? $parent : "NO"), "\n"; my @ids=(); my $sql="SELECT tags.name FROM "; if($self->in_or()) @@ -685,23 +681,10 @@ sub tags_subselect my($self)=@_; my $hasvals=$self->expecting_values(); my $tree=$self->{tagtree}; - my $parent=$self->trailing_tag_parent(); - - my $tag=undef; - if($hasvals) - { - $tag=$self->trailing_tag_id(); -# print "Trailing id: $tag\n"; - } - my ($sqlclause, @joins)=(undef, ()); - ($sqlclause, @joins) = $tree->to_sql($hasvals) if($tree); -# use Data::Dumper; -# print Dumper $tree if($tree); -# print "SQL(" . scalar(@joins) ."): $sqlclause\n"; + my ($sqlclause, @joins)=$tree->to_sql($hasvals) if($tree); my $sql="\tSELECT fxt1.files_id FROM tags t1"; my @crosses=(); my @inners=(); -# $joinsneeded++ if($tag); for(my $i=0; $i <= $#joins; $i++) { my $cnt=$i+1; @@ -718,10 +701,6 @@ sub tags_subselect $sql .= ("\n\t" . join(" ", @crosses)) if(@crosses); $sql .= ("\n" . join("\n", @inners)) if(@inners); $sql .= "\n\tWHERE $sqlclause" if($sqlclause); -# if($tag) -# { -# $sql .= " AND t${joinsneeded}.parents_id='$tag'"; -# } $sql .= "\n\tGROUP BY fxt1.files_id\n"; return $sql; } diff --git a/lib/ID3FS/Path/Node.pm b/lib/ID3FS/Path/Node.pm index 6254600..720d12f 100644 --- a/lib/ID3FS/Path/Node.pm +++ b/lib/ID3FS/Path/Node.pm @@ -90,73 +90,50 @@ sub to_sql my $left=$self->left(); my $right=$self->right(); return ("", @outjoins) unless($left || $right); + my ($leftstr, @leftjoins) = $left->to_sql($hasvals, $not, @joins) if($left); push(@joins, @leftjoins); push(@outjoins, @leftjoins); + my $op=$self->name(); - print "op: $op type: ", $self->type(), " not: $not\n"; if(defined($op)) { + my $left_is_not =($left && $left->name() && $left->name() eq "NOT"); + my $right_is_not=($right && $right->name() && $right->name() eq "NOT"); + my $join=undef; # if we are ANDing, add an inner join # also if we are NOTing, but we are looking for a tag *value* if($op eq "AND") { - print "AND\n"; - # hack - if right child is a NOT, we don't need extra join/brackets + # if right child is a NOT, we don't need extra join/brackets # NOT will do the same and we will end up with an extra one - unless($right && $right->name() && $right->name() eq "NOT") - { - push(@joins, "INNER"); - push(@outjoins, "INNER"); - } + $join= "INNER" unless($right_is_not); } elsif($op eq "NOT") { - print "NOT (was $not)\n"; $not=1; # as above - if right child is a NOT, we don't need extra join/brackets # NOT will do the same and we will end up with an extra one - unless($right && $right->name() && $right->name() eq "NOT") - { - if($hasvals) - { - push(@joins, "INNER"); - push(@outjoins, "INNER"); - } - else - { - push(@joins, "LEFT"); - push(@outjoins, "LEFT"); - } - } + $join = ($hasvals ? "INNER" : "LEFT") unless($right_is_not); } elsif($op eq "OR") { - print "OR\n"; # if left child is a NOT, we need an extra (inner) join # unless right child is also a NOT - if(($left && $left->name() && $left->name() eq "NOT") && - !($right && $right->name() && $right->name() eq "NOT")) - { - push(@joins, "INNER"); - push(@outjoins, "INNER"); - } + $join="INNER" if($left_is_not && ! $right_is_not) + } + if($join) + { + push(@joins, $join); + push(@outjoins, $join); } } my ($rightstr, @rightjoins) = $right->to_sql($hasvals, $not, @joins) if($right); push(@outjoins, @rightjoins); -# print "LEFT (", scalar(@leftjoins), "): $leftstr\n"; -# print "RIGHT (", scalar(@rightjoins), "): $rightstr\n"; - $str=$leftstr; + $str = $leftstr; $str .= " $op " if($op && !$not); $str .= $rightstr; - if($op && $left && $right) - { - $str="(" . $str . ")"; - } -# print "STR: $str\n"; -# my @all=(@joins, @rightjoins); -# print "JOINS: RETURN ", scalar(@outjoins), " ALL ", scalar(@all), "\n"; + $str=("(" . $str . ")") if($op && $left && $right); return($str, @outjoins); }