fix elements_to_tree (needs array ref not array) and misc tag fixes
authorIan Beckwith <ianb@erislabs.net>
Sun, 10 Oct 2010 22:06:16 +0000 (23:06 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sun, 10 Oct 2010 22:06:16 +0000 (23:06 +0100)
lib/ID3FS/Path.pm
lib/ID3FS/Path/Node.pm

index 7113e92..202d6ad 100644 (file)
@@ -301,10 +301,13 @@ sub parse
     }
     # 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},
@@ -325,17 +328,17 @@ sub state
 
 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);
     }
@@ -389,7 +392,6 @@ sub tag_has_values
 {
     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}));
@@ -672,6 +674,8 @@ sub tags_subselect
     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)
     {
@@ -680,21 +684,18 @@ sub tags_subselect
     }
     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);
index 8adb076..f4e6931 100644 (file)
@@ -67,12 +67,14 @@ sub to_sql
     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;
@@ -89,9 +91,12 @@ sub node_to_sql
     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} . "')";
     }