partially implement tagvals
[id3fs.git] / lib / ID3FS / DB.pm
index ef5ea05..07a5f86 100644 (file)
@@ -378,13 +378,57 @@ sub filename
 sub tags_subselect
 {
     my($self,@constraints)=@_;
-    my @ids = grep { defined; } map { $_->{id}; } @constraints;
-    @ids=map( { "\"$_\""; } @ids) unless($self->{postgres});
+    use Data::Dumper;
+    my @tags=();
+    my @tags_vals=();
+    my $lasttag='';
+#    print "CONSTRAINTS: \n", Dumper \@constraints;
+    for my $constraint (@constraints)
+    {
+#      print ref($constraint),"\n";
+       if(ref($constraint) eq "ID3FS::PathElement::Tag")
+       {
+           if($self->tag_has_values($constraint->{id}))
+           {
+#              print "HASVALUES\n";
+               $lasttag=$constraint->{id} if defined($constraint->{id});
+           }
+           else
+           {
+#              print "NOVALUES\n";
+               push(@tags, $constraint->{id}) if(defined($constraint->{id}));
+           }
+       }
+       elsif(ref($constraint) eq "ID3FS::PathElement::Tagval")
+       {
+#          print "TAGVAL\n";
+           push(@tags_vals, [$lasttag, $constraint->{id}]) if defined($constraint->{id});
+       }
+    }
+    unless($self->{postgres})
+    {
+       @tags=map{ "\"$_\""; } @tags;
+       @tags_vals=map( { [ map({ "\"$_\""; } @$_ ) ] } @tags_vals);
+    }
+#    print "TAGS\n", Dumper \@tags;
+#    print "\nVALS\n", Dumper(\@tags_vals), "\n";
     my $sql=("\tSELECT files_id FROM tags t1\n" .
             "\tINNER JOIN files_x_tags ON t1.id=files_x_tags.tags_id\n" .
-            "\tWHERE t1.id IN (\n\t\t" .
-            join(', ', @ids) .
-            "\n\t)\n");
+            "\tINNER JOIN tags_x_tagvals ON t1.id=tags_x_tagvals.tags_id\n");
+    my @clauses=();
+    if(@tags)
+    {
+       push(@clauses, "(t1.id IN ( " . join(', ', @tags) ." ) )");
+    }
+    for my $pair (@tags_vals)
+    {
+       my($tag, $val)=@$pair;
+       push(@clauses, "( t1.id=$tag AND tags_x_tagvals.tagvals_id=$val )");
+    }
+    if(@clauses)
+    {
+       $sql .= "\tWHERE\n\t\t" . join("\n\t\tOR ", @clauses) . "\n";
+    }
     return $sql;
 }