}
# remove trailing boolean
my @elements=@{$self->{elements}};
- pop @elements if(@elements && ref($elements[$#elements]) eq "ID3FS::PathElement::Boolean");
+ while(@elements && ref($elements[$#elements]) eq "ID3FS::PathElement::Boolean")
+ {
+ pop @elements;
+ }
# sort elements by precedence
@elements=$self->sort_elements(@elements);
- $self->{tagtree}=$self->elements_to_tree(@elements);
+ $self->{tagtree}=$self->elements_to_tree(\@elements);
if($self->{tagtree})
{
($self->{sqlconditions},
sub elements_to_tree
{
- my($self, @elements)=@_;
- return undef unless(@elements);
+ my($self, $elements)=@_;
+ return undef unless(@$elements);
my ($left, $right, $op)=(undef, undef, undef);
- my $thing=pop @elements;
+ my $thing=pop @$elements;
if(ref($thing) eq "ID3FS::PathElement::Boolean")
{
my $op=$thing;
- $right=$self->elements_to_tree(@elements);
+ $right=$self->elements_to_tree($elements);
if($op->{name} ne "NOT")
{
- $left=$self->elements_to_tree(@elements);
+ $left=$self->elements_to_tree($elements);
}
return ID3FS::Path::Node->new($left, $op, $right);
}
{
my($self)=@_;
my $tail=$self->tail();
- print "TAIL: ", ref($tail), "\n";
if($tail && ref($tail) eq "ID3FS::PathElement::Tag")
{
return($self->{db}->tag_has_values($tail->{id}));
my $hasvals=$self->tag_has_values();
my $parent=$self->trailing_tag_parent();
+# print "ELEMENTS: ", join('/', map { $_->{name}; } @{$self->{elements}}), "\n";
+# print "TREE: ", $tree->print(), "\n";
my $tag=undef;
if($hasvals)
{
}
my ($sqlclause, $joinsneeded)=(undef, 1);
($sqlclause, $joinsneeded) = $tree->to_sql($tag) if($tree);
- print "SQL($joinsneeded): $sqlclause\n";
+# print "SQL($joinsneeded): $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++)
{
- if($i > 1)
- {
- push(@crosses, "CROSS JOIN tags t$i");
- }
my $inner=("\tINNER JOIN files_x_tags fxt$i ON " .
"t${i}.id=fxt${i}.tags_id");
- if($i>2)
+ if($i > 1)
{
+ push(@crosses, "CROSS JOIN tags t$i");
$inner .= " AND fxt1.files_id=fxt${i}.files_id";
}
push(@inners, $inner);
my $right=$self->right();
return ("", $andlevel) unless($left || $right);
($leftstr, $leftandlevel) = $self->node_to_sql($left, $parent, $andlevel);
+# print "LEFT: $leftstr\n";
$andlevel=$self->max($andlevel, $leftandlevel);
if(defined($op) && (($op->{name} eq "AND") || ($op->{name} eq "NOT")))
{
$andlevel++;
}
($rightstr, $rightandlevel) = $self->node_to_sql($right, $parent, $andlevel);
+# print "RIGHT: $rightstr\n";
my $str=$leftstr;
$str .= (" " . $op->{name} . " ") if($op);
$str .= $rightstr;
return ("", $andlevel) unless(defined($node));
return $node->to_sql($parent, $andlevel) if(ref($node) eq "ID3FS::Path::Node");
my $sql;
+# print("Hit node: " . $node->{name}. "(" .
+# (defined($node->{parents_id}) ? $node->{parents_id} : "") .
+# ")\n");
if(defined($node->{parents_id}))
{
- print "HIT PARENTS_ID: $node->{parents_id}\n";
+# print "HIT PARENTS_ID: $node->{parents_id}\n";
$sql= "(t$andlevel.parents_id='$node->{parents_id}'";
$sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
}