more tag fixes
authorIan Beckwith <ianb@erislabs.net>
Sun, 3 Oct 2010 19:02:22 +0000 (20:02 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sun, 3 Oct 2010 19:02:22 +0000 (20:02 +0100)
lib/ID3FS/DB.pm
lib/ID3FS/Path.pm

index fd0b7a7..a9d01c7 100644 (file)
@@ -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);
 }
 
 
index 0be7c45..de55ce1 100644 (file)
@@ -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
        {