From b2f0890522f6172d809b9f74d18346b77372f3d0 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Tue, 12 Oct 2010 05:54:18 +0100 Subject: [PATCH] use list of join types instead of count --- lib/ID3FS/Path.pm | 3 ++- lib/ID3FS/Path/Node.pm | 52 +++++++++++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index 319e147..d3a99a4 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -723,7 +723,8 @@ sub tags_subselect } my ($sqlclause, @joins)=(undef, ()); ($sqlclause, @joins) = $tree->to_sql($tag) if($tree); - print "JOINS: ", join(", ", @joins), "\n"; + @joins=("INNER") unless(@joins); + print "JOINS: ", scalar(@joins), "\n"; # print "SQL(" . scalar(@joins) .": $sqlclause\n"; my $sql="\tSELECT fxt1.files_id FROM tags t1"; my @crosses=(); diff --git a/lib/ID3FS/Path/Node.pm b/lib/ID3FS/Path/Node.pm index 8362f34..87b1b6e 100644 --- a/lib/ID3FS/Path/Node.pm +++ b/lib/ID3FS/Path/Node.pm @@ -58,32 +58,41 @@ sub print_node sub to_sql { - my($self, $parent, @joins)=@_; - @joins=("INNER") unless(@joins); - my @newjoins=(); + my($self, $parent, @injoins)=@_; + my @childjoins=@injoins; + my @outjoins=(); + # init + unless(@injoins) + { + print "\nSTART\n"; + @outjoins = @childjoins = ("INNER"); + } + print "OUT: ", join(', ', @outjoins), "\n"; + print "CLD: ", join(', ', @childjoins), "\n"; my (@leftjoins, @rightjoins); my ($leftstr, $rightstr); my $op=$self->op(); my $left=$self->left(); my $right=$self->right(); - return ("", @joins) unless($left || $right); - ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @joins); -# print "LEFT: $leftstr\n"; + return ("", @outjoins) unless($left || $right); + ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @childjoins); # $andlevel=$self->max($andlevel, $leftandlevel); if(defined($op)) { if($op->{name} eq "AND") { - push(@newjoins, "INNER"); + push(@childjoins, "INNER"); + push(@outjoins, "INNER"); } elsif($op->{name} eq "NOT") { - push(@newjoins, "LEFT"); + push(@childjoins, "LEFT"); + push(@outjoins, "LEFT"); } } - push(@joins, @newjoins); - ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @joins); -# print "RIGHT: $rightstr\n"; + ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @leftjoins, @childjoins); + print "LEFT (", scalar(@leftjoins), "): $leftstr\n"; + print "RIGHT (", scalar(@rightjoins), "): $rightstr\n"; my $str=$leftstr; $str .= (" " . $op->{name} . " ") if($op); $str .= $rightstr; @@ -91,20 +100,23 @@ sub to_sql { $str="(" . $str . ")"; } -# print "LEFTJOINS: ", join(', ', @leftjoins), "\n"; -# print "RIGHTJOINS:", join(', ', @rightjoins), "\n"; -# print "NEWJOINS: ", join(', ', @newjoins), "\n"; -# print "STR: $str\n"; + print "STR: $str\n"; # return($str, $self->max($leftandlevel, $rightandlevel)); - my @sidejoins=((scalar(@leftjoins) > scalar(@rightjoins)) ? @leftjoins : @rightjoins); - my @alljoins=(@newjoins, @sidejoins); - return($str, @alljoins); + my @oldout=@outjoins; + @outjoins = (@leftjoins, @outjoins, @rightjoins); + if($op) + { + print "ME (", (defined($op) ? $op->{name} : ""), "): "; + print(scalar(@outjoins), " = " , scalar(@leftjoins), " + ", scalar(@oldout), + " + ", scalar(@rightjoins), "\n"); + } + return($str, @outjoins); } sub node_to_sql { my($self, $node, $parent, @joins)=@_; - return ("", @joins) unless(defined($node)); + return ("", ()) unless(defined($node)); return $node->to_sql($parent, @joins) if(ref($node) eq "ID3FS::Path::Node"); my $sql; my $cnt=scalar(@joins)+1; @@ -118,7 +130,7 @@ sub node_to_sql $sql= "(t" . scalar(@joins) .".parents_id=''"; $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')"; } - return ($sql, @joins); + return ($sql, ()); } sub used_tags -- 2.11.0