use list of join types instead of count
authorIan Beckwith <ianb@erislabs.net>
Tue, 12 Oct 2010 04:54:18 +0000 (05:54 +0100)
committerIan Beckwith <ianb@erislabs.net>
Tue, 12 Oct 2010 04:54:18 +0000 (05:54 +0100)
lib/ID3FS/Path.pm
lib/ID3FS/Path/Node.pm

index 319e147..d3a99a4 100644 (file)
@@ -723,7 +723,8 @@ sub tags_subselect
     }
     my ($sqlclause, @joins)=(undef, ());
     ($sqlclause, @joins) = $tree->to_sql($tag) if($tree);
-    print "JOINS: ", join(", ", @joins), "\n";
+    @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=();
index 8362f34..87b1b6e 100644 (file)
@@ -58,32 +58,41 @@ sub print_node
 
 sub to_sql
 {
-    my($self, $parent, @joins)=@_;
-    @joins=("INNER") unless(@joins);
-    my @newjoins=();
+    my($self, $parent, @injoins)=@_;
+    my @childjoins=@injoins;
+    my @outjoins=();
+    # init
+    unless(@injoins)
+    {
+       print "\nSTART\n";
+       @outjoins = @childjoins = ("INNER");
+    }
+    print "OUT: ", join(', ', @outjoins), "\n";
+    print "CLD: ", join(', ', @childjoins), "\n";
     my (@leftjoins, @rightjoins);
     my ($leftstr, $rightstr);
     my $op=$self->op();
     my $left=$self->left();
     my $right=$self->right();
-    return ("", @joins) unless($left || $right);
-    ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @joins);
-#    print "LEFT: $leftstr\n";
+    return ("", @outjoins) unless($left || $right);
+    ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @childjoins);
 #    $andlevel=$self->max($andlevel, $leftandlevel);
     if(defined($op))
     {
        if($op->{name} eq "AND")
        {
-           push(@newjoins, "INNER");
+           push(@childjoins, "INNER");
+           push(@outjoins, "INNER");
        }
        elsif($op->{name} eq "NOT")
        {
-           push(@newjoins, "LEFT");
+           push(@childjoins, "LEFT");
+           push(@outjoins, "LEFT");
        }
     }
-    push(@joins, @newjoins);
-    ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @joins);
-#    print "RIGHT: $rightstr\n";
+    ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @leftjoins, @childjoins);
+    print "LEFT (", scalar(@leftjoins), "): $leftstr\n";
+    print "RIGHT (", scalar(@rightjoins), "): $rightstr\n";
     my $str=$leftstr;
     $str .= (" " . $op->{name} . " ") if($op);
     $str .= $rightstr;
@@ -91,20 +100,23 @@ sub to_sql
     {
        $str="(" . $str . ")";
     }
-#    print "LEFTJOINS: ", join(', ', @leftjoins), "\n";
-#    print "RIGHTJOINS:", join(', ', @rightjoins), "\n";
-#    print "NEWJOINS: ",  join(', ', @newjoins), "\n";
-#    print "STR: $str\n";
+    print "STR: $str\n";
 #    return($str, $self->max($leftandlevel, $rightandlevel));
-    my @sidejoins=((scalar(@leftjoins) > scalar(@rightjoins)) ? @leftjoins : @rightjoins);
-    my @alljoins=(@newjoins, @sidejoins);
-    return($str, @alljoins);
+    my @oldout=@outjoins;
+    @outjoins = (@leftjoins, @outjoins,  @rightjoins);
+    if($op)
+    {
+       print "ME (", (defined($op) ? $op->{name} : ""), "): ";
+       print(scalar(@outjoins), " = " , scalar(@leftjoins), " + ", scalar(@oldout),
+             " + ", scalar(@rightjoins), "\n");
+    }
+    return($str, @outjoins);
 }
 
 sub node_to_sql
 {
     my($self, $node, $parent, @joins)=@_;
-    return ("", @joins) unless(defined($node));
+    return ("", ()) unless(defined($node));
     return $node->to_sql($parent, @joins) if(ref($node) eq "ID3FS::Path::Node");
     my $sql;
     my $cnt=scalar(@joins)+1;
@@ -118,7 +130,7 @@ sub node_to_sql
        $sql= "(t" . scalar(@joins) .".parents_id=''";
        $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
     }
-    return ($sql, @joins);
+    return ($sql, ());
 }
 
 sub used_tags