OR: show all unused tags
[id3fs.git] / lib / ID3FS / Path.pm
index e3aac80..4cf5fc2 100644 (file)
@@ -14,6 +14,8 @@ our $PATH_ALLTRACKS= "TRACKS";
 our $PATH_NOARTIST = "NOARTIST";
 our $PATH_NOALBUM  = "NOALBUM";
 
+our $ENABLE_FILTER = 1;
+
 sub new
 {
     my $proto=shift;
@@ -92,7 +94,9 @@ sub dirents
            {
                @dents=qw(AND OR);
            }
-           push(@dents, $self->filter($PATH_ALLTRACKS, $PATH_NOARTIST));
+           push(@dents, ($ENABLE_FILTER ?
+                         $self->filter($PATH_ALLTRACKS, $PATH_NOARTIST) :
+                         ($PATH_ALLTRACKS, $PATH_NOARTIST)));
            push(@dents, $self->artists());
        }
     }
@@ -500,11 +504,19 @@ sub tags
 #    print "THASVALS: $hasvals\n";
 #    print "TPARENT: ", (defined($parent)? $parent : "NO"), "\n";
     my @ids=();
-    my $sql=("SELECT tags.name FROM (\n" .
-            $self->tags_subselect() .
-            ") AS subselect\n" .
-            "INNER JOIN files_x_tags ON subselect.files_id=files_x_tags.files_id\n" .
-            "INNER JOIN tags ON files_x_tags.tags_id=tags.id\n");
+    my $sql="SELECT tags.name FROM ";
+    if($self->in_or())
+    {
+       $sql .= "files_x_tags\n";
+    }
+    else
+    {
+       $sql .= ("(\n" .
+                $self->tags_subselect() .
+                ") AS subselect\n" .
+                "INNER JOIN files_x_tags ON subselect.files_id=files_x_tags.files_id\n");
+    }
+    $sql .= "INNER JOIN tags ON files_x_tags.tags_id=tags.id\n";
     my @andclauses=();
     my $id=$self->trailing_tag_id();
 
@@ -675,9 +687,12 @@ sub tags_subselect
     my $hasvals=$self->expecting_values();
     if($self->{in_all})
     {
+       # FIXME: is this used?
+       die "IN_ALL CALLED!!\n";
        return "\tSELECT id FROM files AS files_id\n";
     }
     my $tree=$self->{tagtree};
+    # FIXME
     print "UNDEF!!\n" unless($self->{tagtree});
     my $parent=$self->trailing_tag_parent();
 
@@ -691,7 +706,7 @@ sub tags_subselect
     }
     my ($sqlclause, @joins)=(undef, ());
     ($sqlclause, @joins) = $tree->to_sql($hasvals) if($tree);
-#    print "SQL(" . scalar(@joins) .": $sqlclause\n";
+#    print "SQL(" . scalar(@joins) ."): $sqlclause\n";
     my $sql="\tSELECT fxt1.files_id FROM tags t1";
     my @crosses=();
     my @inners=();
@@ -738,7 +753,7 @@ sub sql_start
     return $sql;
 }
 
-
+# FIXME: remove
 sub constraints_tag_list
 {
     my($self, @constraints)=@_;
@@ -780,8 +795,6 @@ sub constraints_tag_list
 sub filter
 {
     my($self, @dirs)=@_;
-    # FIXME: disabled - too slow
-    return @dirs;
     my $base=$self->{path};
     my @outdirs=();
     for my $dir (@dirs)
@@ -811,4 +824,20 @@ sub empty
     return 1;
 }
 
+# if path is .../OR/ or .../OR/NOT
+sub in_or
+{
+    my($self)=@_;
+    my $tail=$self->tail();
+    return 0 unless($tail);
+    return 0 unless($tail->type() eq "boolean");
+    return 1 if($tail->name() eq "OR");
+    return 0 unless($tail->name() eq "NOT");
+    my $parent=$self->tail_parent();
+    return 0 unless($parent);
+    return 0 unless($parent->type() eq "boolean");
+    return 1 if($parent->name() eq "OR");
+    return 0;
+}
+
 1;