partially implement tagvals
authorIan Beckwith <ianb@erislabs.net>
Sat, 2 Oct 2010 23:25:04 +0000 (00:25 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sat, 2 Oct 2010 23:25:04 +0000 (00:25 +0100)
lib/ID3FS/DB.pm
lib/ID3FS/Path.pm
lib/ID3FS/PathElement/Boolean.pm
lib/ID3FS/PathElement/Tag.pm
lib/ID3FS/PathElement/Tagval.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;
 }
 
index 25e4092..807def7 100644 (file)
@@ -142,7 +142,7 @@ sub parse
            }
            elsif($name eq "NOT")
            {
-               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
+               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
                $self->state($STATE_BOOLEAN);
            }
            else
@@ -168,7 +168,7 @@ sub parse
               ref($tag) eq "ID3FS::PathElement::Tag" &&
               $self->{db}->tag_has_values($tag->{id}))
            {
-               my $tagval=ID3FS::PathElement::Tagval->new($name);
+               my $tagval=ID3FS::PathElement::Tagval->new($self->{db}, $name);
                if(defined($tagval))
                {
                    $self->state($STATE_TAGVAL);
@@ -191,12 +191,12 @@ sub parse
            elsif($name eq "AND")
            {
                $self->state($STATE_BOOLEAN);
-               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
+               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
            }
            elsif($name eq "OR")
            {
                $self->state($STATE_BOOLEAN);
-               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
+               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
            }
            else
            {
@@ -226,7 +226,7 @@ sub parse
            if($allownot && $name eq "NOT")
            {
                $self->state($STATE_BOOLEAN);
-               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
+               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
            }
            else
            {
index baf80c6..9189cf8 100644 (file)
@@ -10,6 +10,7 @@ sub new
     my $self={};
     bless($self,$class);
 
+    $self->{db}=shift;
     $self->{name}=shift;
 
     return $self;
index 3464261..9619582 100644 (file)
@@ -12,7 +12,7 @@ sub new
 
     $self->{db}=shift;
     $self->{name}=shift;
-    $self->{id}=($self->{db}->id("tags", $self->{name}));
+    $self->{id}=$self->{db}->id("tags", $self->{name});
     return(undef) unless(defined($self->{id}));
     return($self);
 }
index 8fe059d..255e2a0 100644 (file)
@@ -10,8 +10,10 @@ sub new
     my $self={};
     bless($self,$class);
 
+    $self->{db}=shift;
     $self->{name}=shift;
-
+    $self->{id}=$self->{db}->id("tagvals", $self->{name});
+    return(undef) unless(defined($self->{id}));
     return $self;
 }