my @parts=@{$self->{components}};
my($tag, $tagval);
$self->{elements}=[];
- while(my $name=shift @parts)
+ while(defined(my $name=shift @parts))
{
# print "NAME: $name\n";
my $state=$self->state();
if($self->{tagtree})
{
($self->{sqlconditions},
- $self->{andsneeded}) = $self->{tagtree}->to_sql();
+ $self->{joins}) = $self->{tagtree}->to_sql();
# print "TREE: ", $self->{tagtree}->print(), "\n";
-# print("SQL CONDITION(", $self->{andsneeded}, "): ",
+# print("SQL CONDITION(", scalar(@{$self->{joins}}), "): ",
# $self->{sqlconditions}, "\n");
# use Data::Dumper;
# print Dumper $self->{tagtree};
$sql .= "WHERE " . join(' AND ', @andclauses) . "\n";
}
$sql .= "GROUP BY tags.name;";
- print "SQL: $sql\n";
+ print "SQL(TAGS): $sql\n";
my @tagnames=$self->{db}->cmd_firstcol($sql);
print "SUBNAMES: ", join(', ', @tagnames), "\n";
return(@tagnames);
my($self)=@_;
if(!@{$self->{elements}}) # /ALL
{
- my $sql="SELECT DISTINCT name FROM artists;";
+ my $sql="SELECT DISTINCT name FROM artists WHERE name!='';";
return($self->{db}->cmd_firstcol($sql));
}
my @ids=();
") AS subselect\n" .
"INNER JOIN files ON subselect.files_id=files.id\n" .
"INNER JOIN artists ON files.artists_id=artists.id\n" .
+ "WHERE artists.name != ''\n" .
"GROUP BY artists.name;");
- print "SQL: $sql\n";
+ print "SQL(ARTISTS): $sql\n";
my @tagnames=$self->{db}->cmd_firstcol($sql);
print "ARTISTS: ", join(', ', @tagnames), "\n";
return(@tagnames);
"\t) AS subselect\n" .
"INNER JOIN files ON subselect.files_id=files.id\n" .
"INNER JOIN albums ON files.albums_id=albums.id\n" .
+ "WHERE albums.name != ''\n" .
"GROUP BY albums.name;");
print "SQL(ALBUMS): \n$sql\n";
my @names=$self->{db}->cmd_firstcol($sql);
$self->tags_subselect() .
"\t) AS subselect\n" .
"INNER JOIN files ON subselect.files_id=files.id\n" .
- "INNER JOIN artists ON artists.id=files.artists_id\n\t" .
- "INNER JOIN albums ON albums.id=files.albums_id\n\t" .
- "WHERE artists.id=? AND albums.name=''\n\t" .
+ "INNER JOIN artists ON artists.id=files.artists_id\n" .
+ "INNER JOIN albums ON albums.id=files.albums_id\n" .
+ "WHERE artists.id=? AND albums.name=''\n" .
"GROUP BY files.name\n");
print "ARTIST_TRACKS SQL: $sql\n";
my @names=$self->{db}->cmd_firstcol($sql, $artist_id);
}
return $self->album_tracks($artist_id, $tail->{id});
}
-
my $sql=("SELECT files.name\n" .
"\tFROM (\n" .
$self->tags_subselect() .
"\t) AS subselect\n" .
"INNER JOIN files ON files.id=subselect.files_id\n" .
- "GROUP BY files.name;");
- print "SQL: $sql\n";
+ "INNER JOIN artists ON files.artists_id=artists.id\n");
+ if($self->{components}->[$#{$self->{components}}] eq "NOARTIST")
+ {
+ $sql .= "WHERE artists.name =''\n";
+ }
+ $sql .= "GROUP BY files.name;";
+ print "TRACKS SQL: $sql\n";
my @names=$self->{db}->cmd_firstcol($sql);
print "TRACKS: ", join(', ', @names), "\n";
return(@names);
$tag=$self->trailing_tag_id();
# print "Trailing id: $tag\n";
}
- my ($sqlclause, $joinsneeded)=(undef, 1);
- ($sqlclause, $joinsneeded) = $tree->to_sql($tag) if($tree);
-# print "SQL($joinsneeded): $sqlclause\n";
+ my ($sqlclause, @joins)=(undef, ());
+ ($sqlclause, @joins) = $tree->to_sql($tag) if($tree);
+ @joins=("INNER") unless(@joins);
+ print "JOINS: ", scalar(@joins), "\n";
+# print "SQL(" . scalar(@joins) .": $sqlclause\n";
my $sql="\tSELECT fxt1.files_id FROM tags t1";
my @crosses=();
my @inners=();
# $joinsneeded++ if($tag);
- for(my $i=1; $i <= $joinsneeded; $i++)
+ for(my $i=0; $i <= $#joins; $i++)
{
- my $inner=("\tINNER JOIN files_x_tags fxt$i ON " .
- "t${i}.id=fxt${i}.tags_id");
- if($i > 1)
+ my $cnt=$i+1;
+ my $join=$joins[$i];
+ my $inner=("\t$join JOIN files_x_tags fxt$cnt ON " .
+ "t${cnt}.id=fxt${cnt}.tags_id");
+ if($i > 0)
{
- push(@crosses, "CROSS JOIN tags t$i");
- $inner .= " AND fxt1.files_id=fxt${i}.files_id";
+ push(@crosses, "CROSS JOIN tags t$cnt");
+ $inner .= " AND fxt1.files_id=fxt${cnt}.files_id";
}
push(@inners, $inner);
}
return $tags;
}
-sub lookup_id
-{
- my($self, $table, $name)=@_;
- my($id)=$self->{db}->cmd_onerow("SELECT id FROM $table where name=?", $name);
- return $id;
-}
-
1;