From: Ian Beckwith Date: Sat, 2 Oct 2010 23:25:04 +0000 (+0100) Subject: partially implement tagvals X-Git-Tag: debian/1.0-1~138 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=d2b54433e560a84120e89cd6881799889a590b34;p=id3fs.git partially implement tagvals --- diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index ef5ea05..07a5f86 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -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; } diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index 25e4092..807def7 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -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 { diff --git a/lib/ID3FS/PathElement/Boolean.pm b/lib/ID3FS/PathElement/Boolean.pm index baf80c6..9189cf8 100644 --- a/lib/ID3FS/PathElement/Boolean.pm +++ b/lib/ID3FS/PathElement/Boolean.pm @@ -10,6 +10,7 @@ sub new my $self={}; bless($self,$class); + $self->{db}=shift; $self->{name}=shift; return $self; diff --git a/lib/ID3FS/PathElement/Tag.pm b/lib/ID3FS/PathElement/Tag.pm index 3464261..9619582 100644 --- a/lib/ID3FS/PathElement/Tag.pm +++ b/lib/ID3FS/PathElement/Tag.pm @@ -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); } diff --git a/lib/ID3FS/PathElement/Tagval.pm b/lib/ID3FS/PathElement/Tagval.pm index 8fe059d..255e2a0 100644 --- a/lib/ID3FS/PathElement/Tagval.pm +++ b/lib/ID3FS/PathElement/Tagval.pm @@ -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; }