From 3b83e0afa68f15baa1a1ee0fddae969fa5a637c2 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Sat, 23 Oct 2010 19:27:35 +0100 Subject: [PATCH] tweak number_joins --- lib/ID3FS/Path.pm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index c800bdb..e54c7e2 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -370,12 +370,11 @@ sub parse sub number_joins { my($self, @elements)=@_; - my @joins=qw(INNER); + my @joins=("INNER"); my $table=1; my $nextjoin=undef; my $lastop=undef; return (@joins) unless(@elements); - $table++ if(($elements[0]->type() == $TYPE_BOOL) && ($elements[0]->name eq "NOT")); while(my $thing=shift @elements) { if($thing->type() == $TYPE_BOOL) @@ -391,31 +390,32 @@ sub number_joins } elsif($op eq "OR") { + # NOT/foo/OR needs an extra join $nextjoin="INNER" if($lastop && $lastop eq "NOT"); } $lastop=$op; } else { - # if the expression ends in a tag that has a value - # (ie we have the tag and want the value) - # use an inner join if(@elements) { + # if tag has a value, eat the tag, shifting to the value $thing=shift(@elements) if($elements[0]->type() == $TYPE_TAG); } elsif($self->{db}->tag_has_values($thing->id())) { + # if the expression ends in a tag that has a value + # (ie we have the tag and want the value) + # use an INNER join even if we were in a NOT $nextjoin="INNER" if($nextjoin); } - $table++ if($nextjoin && $nextjoin eq "INNER"); - $thing->table($table); if($nextjoin) { - $table++ if($nextjoin eq "LEFT"); + $table++; push(@joins, $nextjoin); $nextjoin=undef; } + $thing->table($table); } } return @joins; -- 2.11.0