- my $main_sql_start=("SELECT t2.name\n" .
- "\tFROM (\n" .
- $self->tags_subselect(@constraints) .
- ") 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" .
- "WHERE t2.id NOT IN (");
- my $main_sql_end=")\nGROUP BY t2.name;";
- # FIXME: generalise more?
-
- while(my $constraint=shift @constraints)
- {
- my $cid=$constraint->{id};
- push(@ids, $cid);
- }
- @ids = map( { "\"$_\""; } grep { defined; } @ids) unless($self->{postgres});
- my $tagstr=join(", ", @ids);
- my $sql = ($main_sql_start . $tagstr .
- $main_sql_end);
+ my $sql=("SELECT t2.name FROM (\n" .
+ $self->tags_subselect(@constraints) .
+ ") 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, $parent)=$self->constraints_tag_list(@constraints);
+ my @tags=@$tags;
+ my @tags_vals=@$tags_vals;;
+ 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(@orclauses, "( t2.parents_id='' AND t2.id NOT IN ( " . join(', ', @tags) ." ) )");
+ }
+ for my $pair (@tags_vals)
+ {
+ my($tag, $val)=@$pair;
+ push(@orclauses, "( NOT (t2.parents_id=$tag AND t2.id=$val ) )");
+ }
+ if(@orclauses)
+ {
+ push(@andclauses, join("\n\tOR ", @orclauses));
+ }
+ if(@andclauses)
+ {
+ $sql .= "\tWHERE\n\t\t";
+ $sql .= join("\n\tAND ", @andclauses) . "\n";
+ }
+ $sql .= "GROUP BY t2.name;";