") 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;
+# print "TAGS: ", Dumper \@tags;
+# print "VALS: ", Dumper \@tags_vals;
+
+ push(@andclauses, "( t2.parents_id=" . (defined($parent) ? $parent : "''") . " )");
if(@tags)
{
- push(@clauses, "( t2.parents_id='' AND t2.id NOT IN ( " . join(', ', @tags) ." ) )");
+ push(@orclauses, "( 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 ) )");
+ push(@andclauses, "( NOT ( t2.id=$tag ) )");
+ }
+ if(@orclauses)
+ {
+ push(@andclauses, join("\n\tOR ", @orclauses));
}
- if(@clauses)
+ if(@andclauses)
{
- $sql .= "WHERE\n\t\t" . join("\n\t\tAND ", @clauses) . "\n";
+ $sql .= "\tWHERE\n\t\t";
+ $sql .= join("\n\tAND ", @andclauses) . "\n";
}
$sql .= "GROUP BY t2.name;";
print "SQL: $sql\n";
"INNER JOIN files ON subselect.files_id=files.id\n" .
"INNER JOIN albums ON files.albums_id=albums.id\n" .
"GROUP BY albums.name;");
+ print "SQL(ALBUMS): \n$sql\n";
my $result=$self->cmd_rows($sql);
my @names=map { $_->[0]; } @$result;
print "ALBUMS: ", join(', ', @names), "\n";
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=" . (defined($parent) ? $parent : "''") . " )");
+ push(@orclauses, "( 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 )");
+ }
+# push(@andclauses, "( t1.parents_id=" . (defined($parent) ? $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;
my @tags_vals=();
for my $constraint (@constraints)
{
- print ref($constraint), ": ", $constraint->{name}, "\n";
+# print ref($constraint), ": ", $constraint->{name}, "\n";
if(ref($constraint) eq "ID3FS::PathElement::Tag")
{
if(defined($lasttag))
{
- print "TAGVAL\n";
+# print "TAGVAL\n";
push(@tags_vals, [$lasttag, $constraint->{id}]) if defined($constraint->{id});
$lasttag=undef;
}
elsif($self->tag_has_values($constraint->{id}))
{
- print "HASVALUES\n";
+# print "HASVALUES\n";
$lasttag=$constraint->{id} if defined($constraint->{id});
}
else
{
- print "NOVALUES\n";
+# print "NOVALUES\n";
push(@tags, $constraint->{id}) if(defined($constraint->{id}));
}
}
}
- # 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);
}
{
shift(@path);
shift(@rel);
- print "POP ";
+# print "POP ";
}
- print "\n";
+# print "\n";
my $upcount=scalar(@rel);
my $result="../" x $upcount;
$result .= join("/",@path);
my $sql=("SELECT p.name, t.name FROM tags t\n" .
"INNER JOIN tags p ON t.parents_id=p.id\n" .
"GROUP BY p.name, t.name\n");
-# print "SQL: $sql\n";
+ print "SQL: $sql\n";
my $result=$self->cmd_rows($sql);
my $tags={};
for my $pair (@$result)
my $relpath=$path;
$relpath =~ s/^\Q$self->{base}\E\/?//;
my($filepart,$pathpart);
- if($path !~ /\//)
+ if($relpath !~ /\//)
{
$pathpart='';
$filepart=$relpath;
WHERE files_x_tags.files_id IS NULL);
EOT
-# print "SQL: $sql\n";
+ print "SQL: $sql\n";
my @sql=split(/\n\n/, $sql);
$self->cmd($_) for (@sql);
}