From 670513585dfcb9cb600a261e34e69031c5a08d5a Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Sun, 3 Oct 2010 20:02:22 +0100 Subject: [PATCH 1/1] more tag fixes --- lib/ID3FS/DB.pm | 52 ++++++++++++++++++++++++++++++++++------------------ lib/ID3FS/Path.pm | 2 +- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index fd0b7a7..a9d01c7 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -195,25 +195,35 @@ sub tags ") AS subselect\n" . "INNER JOIN files_x_tags ON subselect.files_id=files_x_tags.files_id\n" . "INNER JOIN tags t2 ON files_x_tags.tags_id=t2.id\n"); - my ($tags, $tags_vals)=$self->constraints_tag_list(@constraints); + my ($tags, $tags_vals, $parent)=$self->constraints_tag_list(@constraints); my @tags=@$tags; my @tags_vals=@$tags_vals;; - my @clauses=(); + my @orclauses=(); + my @andclauses=(); use Data::Dumper; print "TAGS: ", Dumper \@tags; print "VALS: ", Dumper \@tags_vals; + if(defined($parent)) + { + push(@andclauses, "( t2.parents_id=$parent )"); + } if(@tags) { - push(@clauses, "( t2.parents_id='' AND t2.id NOT IN ( " . join(', ', @tags) ." ) )"); + push(@orclauses, "( t2.parents_id='' AND t2.id NOT IN ( " . join(', ', @tags) ." ) )"); } for my $pair (@tags_vals) { my($tag, $val)=@$pair; - push(@clauses, "( NOT (t2.parents_id=$tag AND t2.id=$val ) )"); + push(@orclauses, "( NOT (t2.parents_id=$tag AND t2.id=$val ) )"); } - if(@clauses) + if(@orclauses) { - $sql .= "WHERE\n\t\t" . join("\n\t\tAND ", @clauses) . "\n"; + push(@andclauses, join("\n\tOR ", @orclauses)); + } + if(@andclauses) + { + $sql .= "\tWHERE\n\t\t"; + $sql .= join("\n\tAND ", @andclauses) . "\n"; } $sql .= "GROUP BY t2.name;"; print "SQL: $sql\n"; @@ -384,25 +394,35 @@ sub filename sub tags_subselect { my($self,@constraints)=@_; - my ($tags, $tags_vals)=$self->constraints_tag_list(@constraints); + my ($tags, $tags_vals, $parent)=$self->constraints_tag_list(@constraints); my @tags=@$tags; my @tags_vals=@$tags_vals;; my $sql=("\tSELECT files_x_tags.files_id FROM tags t1\n" . "\tINNER JOIN files_x_tags ON t1.id=files_x_tags.tags_id\n"); - my @clauses=(); + my @orclauses=(); + my @andclauses=(); if(@tags) { - push(@clauses, "(t1.parents_id='' AND t1.id IN ( " . join(', ', @tags) ." ) )"); + push(@orclauses, "( t1.parents_id='' AND t1.id IN ( " . join(', ', @tags) ." ) )"); } for my $pair (@tags_vals) { my($tag, $val)=@$pair; - push(@clauses, "( t1.parents_id=$tag AND t1.id=$val )"); + push(@orclauses, "( t1.parents_id=$tag AND t1.id=$val )"); + } + if($parent) + { + push(@andclauses, "( t1.parents_id=$parent )"); + } + if(@orclauses) + { + push(@andclauses, join("\n\t\tOR ", @orclauses)); } - if(@clauses) + if(@andclauses) { - $sql .= "\tWHERE\n\t\t" . join("\n\t\tOR ", @clauses) . "\n"; + $sql .= "\tWHERE\n\t\t"; + $sql .= join("\n\t\tAND ", @andclauses) . "\n"; } $sql .= "\tGROUP BY files_x_tags.files_id\n"; return $sql; @@ -437,17 +457,13 @@ sub constraints_tag_list } } } - # handle dangling tag with unspecified value - if(defined($lasttag)) - { - push(@tags, $lasttag); - } unless($self->{postgres}) { @tags=map{ "\"$_\""; } @tags; @tags_vals=map( { [ map({ "\"$_\""; } @$_ ) ] } @tags_vals); + $lasttag="\"$lasttag\"" if defined($lasttag); } - return(\@tags, \@tags_vals); + return(\@tags, \@tags_vals, $lasttag); } diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index 0be7c45..de55ce1 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -76,7 +76,7 @@ sub dirents ref($tag) eq "ID3FS::PathElement::Tag" && $self->{db}->tag_has_values($tag->{id})) { - @dents=$self->{db}->tag_values($tag->{id}); + @dents=$self->{db}->tags(@{$self->{elements}}); } else { -- 2.11.0