") 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;
+ if(defined($parent))
+ {
+ push(@andclauses, "( t2.parents_id=$parent )");
+ }
if(@tags)
{
- push(@clauses, "( t2.parents_id='' AND t2.id NOT IN ( " . join(', ', @tags) ." ) )");
+ push(@orclauses, "( t2.parents_id='' AND 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 ) )");
}
- if(@clauses)
+ if(@orclauses)
{
- $sql .= "WHERE\n\t\t" . join("\n\t\tAND ", @clauses) . "\n";
+ push(@andclauses, join("\n\tOR ", @orclauses));
+ }
+ if(@andclauses)
+ {
+ $sql .= "\tWHERE\n\t\t";
+ $sql .= join("\n\tAND ", @andclauses) . "\n";
}
$sql .= "GROUP BY t2.name;";
print "SQL: $sql\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='' AND 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 )");
+ }
+ if($parent)
+ {
+ push(@andclauses, "( t1.parents_id=$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;
}
}
}
- # 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);
}