sort_elements: skip elements with children
authorIan Beckwith <ianb@erislabs.net>
Sun, 10 Oct 2010 22:51:35 +0000 (23:51 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sun, 10 Oct 2010 22:51:35 +0000 (23:51 +0100)
lib/ID3FS/Path.pm
lib/ID3FS/Path/Node.pm

index 09553ed..9078720 100644 (file)
@@ -312,6 +312,7 @@ sub parse
     {
        ($self->{sqlconditions},
         $self->{andsneeded}) = $self->{tagtree}->to_sql();
+#      print "TREE: ",  $self->{tagtree}->print(), "\n";
 #      print("SQL CONDITION(", $self->{andsneeded}, "): ",
 #            $self->{sqlconditions}, "\n");
 #      use Data::Dumper;
@@ -359,6 +360,11 @@ sub sort_elements
     {
        if(ref($thing) eq "ID3FS::PathElement::Tag")
        {
+           # Handle tag values by dropping parent
+           if(@input && ref($input[$#input]) eq "ID3FS::PathElement::Tag")
+           {
+               $thing=shift @input;
+           }
            push(@output, $thing);
        }
        elsif(ref($thing) eq "ID3FS::PathElement::Boolean")
@@ -376,7 +382,7 @@ sub sort_elements
     {
        push(@output, pop(@opstack));
     }
-#    print "STACK: ", join(', ', map { $_->{name}; } @output), "\n";
+#   print "STACK: ", join(', ', map { $_->{name}; } @output), "\n";
     return @output;
 }
 
@@ -445,8 +451,8 @@ sub tags
     }
     my $hasvals=$self->tag_has_values();
     my $parent=$self->trailing_tag_parent();
-    print "THASVALS: $hasvals\n";
-    print "TPARENT: ", (defined($parent)? $parent : "NO"), "\n";
+#    print "THASVALS: $hasvals\n";
+#    print "TPARENT: ", (defined($parent)? $parent : "NO"), "\n";
     my @ids=();
     my $sql=("SELECT tags.name FROM (\n" .
             $self->tags_subselect() .
@@ -456,14 +462,14 @@ sub tags
     my (@allused)=$self->used_tags();
     my @used=grep { ref($_) ne "ARRAY"; } @allused;
     my @used_with_vals=grep { ref($_) eq "ARRAY"; } @allused;
-    print "tags(): USED: ", join(", ", @used), "\n";
-    print "tags(): USED_WITH_VALS: ", join(", ", map { "[".$_->[0]. ", ".$_->[1]."]";} @used_with_vals), "\n";
+#    print "tags(): USED: ", join(", ", @used), "\n";
+#    print "tags(): USED_WITH_VALS: ", join(", ", map { "[".$_->[0]. ", ".$_->[1]."]";} @used_with_vals), "\n";
     my @orclauses=();
     my @andclauses=();
     my $id=$self->trailing_tag_id();
     if($hasvals)
     {
-       print "HAS_VALUES\n";
+#      print "HAS_VALUES\n";
        my @values=map { "'".$_->[1]."'"; } grep { $_->[0] == $id; } @used_with_vals;
        my $clause="(tags.parents_id='$id'";
        if(@values)
@@ -475,7 +481,7 @@ sub tags
     }
     else
     {
-       print "HASNT VALUES\n";;
+#      print "HASNT VALUES\n";;
        if(@used)
        {
            push(@orclauses, "(NOT (tags.parents_id='' AND tags.id IN (" . join(', ', @used) . ")))");
@@ -680,7 +686,7 @@ sub tags_subselect
     if($hasvals)
     {
        $tag=$self->trailing_tag_id();
-       print "Trailing id: $tag\n";
+#      print "Trailing id: $tag\n";
     }
     my ($sqlclause, $joinsneeded)=(undef, 1);
     ($sqlclause, $joinsneeded) = $tree->to_sql($tag) if($tree);
index f4e6931..5280478 100644 (file)
@@ -69,6 +69,17 @@ sub to_sql
     ($leftstr, $leftandlevel) = $self->node_to_sql($left, $parent, $andlevel);
 #    print "LEFT: $leftstr\n";
     $andlevel=$self->max($andlevel, $leftandlevel);
+    if($op)
+    {
+       if(ref($op) eq "ID3FS::PathElement::Boolean")
+       {
+#          print "Op: Bool: ", $op->{name}, "\n";
+       }
+       else
+       {
+#          print "Op: $op\n";
+       }
+    }
     if(defined($op) && (($op->{name} eq "AND") || ($op->{name} eq "NOT")))
     {
        $andlevel++;
@@ -82,6 +93,7 @@ sub to_sql
     {
        $str="(" . $str . ")";
     }
+#    print "STR: $str\n";
     return($str, $self->max($leftandlevel, $rightandlevel));
 }
 
@@ -90,6 +102,8 @@ sub node_to_sql
     my($self, $node, $parent, $andlevel)=@_;
     return ("", $andlevel) unless(defined($node));
     return $node->to_sql($parent, $andlevel) if(ref($node) eq "ID3FS::Path::Node");
+#    if((ref($node->op()) ne "ID3FS::Path::Element") &&
+#       $node->op() eq "
     my $sql;
 #    print("Hit node: " . $node->{name}. "(" .
 #        (defined($node->{parents_id}) ? $node->{parents_id} : "") .
@@ -107,6 +121,7 @@ sub node_to_sql
 #    }
     else
     {
+#      print "HIT NORMAL\n";
        $sql= "(t$andlevel.parents_id=''";
        $sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
     }