tidy to_sql()
[id3fs.git] / lib / ID3FS / Path / Node.pm
index f4e6931..11e2de3 100644 (file)
@@ -58,23 +58,37 @@ sub print_node
 
 sub to_sql
 {
-    my($self, $parent, $andlevel)=@_;
-    $andlevel=1 unless(defined($andlevel));
-    my ($leftandlevel, $rightandlevel);
-    my ($leftstr, $rightstr);
-    my $op=$self->op();
+    my($self, $parent, @joins)=@_;
+    my @outjoins=();
+    # init
+    unless(@joins)
+    {
+       @outjoins = @joins = ("INNER");
+    }
     my $left=$self->left();
     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")))
+    return ("", @outjoins) unless($left || $right);
+    my ($leftstr, @leftjoins) = $self->node_to_sql($left, $parent, @joins);
+    push(@joins, @leftjoins);
+    push(@outjoins, @leftjoins);
+    my $op=$self->op();
+    if(defined($op))
     {
-       $andlevel++;
+       if($op->{name} eq "AND")
+       {
+           push(@joins, "INNER");
+           push(@outjoins, "INNER");
+       }
+       elsif($op->{name} eq "NOT")
+       {
+           push(@joins, "LEFT");
+           push(@outjoins, "LEFT");
+       }
     }
-    ($rightstr, $rightandlevel) = $self->node_to_sql($right, $parent, $andlevel);
-#    print "RIGHT: $rightstr\n";
+    my ($rightstr, @rightjoins) = $self->node_to_sql($right, $parent, @joins);
+    push(@outjoins, @rightjoins);
+#    print "LEFT (", scalar(@leftjoins), "): $leftstr\n";
+#    print "RIGHT (", scalar(@rightjoins), "): $rightstr\n";
     my $str=$leftstr;
     $str .= (" " . $op->{name} . " ") if($op);
     $str .= $rightstr;
@@ -82,35 +96,28 @@ sub to_sql
     {
        $str="(" . $str . ")";
     }
-    return($str, $self->max($leftandlevel, $rightandlevel));
+#    print "STR: $str\n";
+    return($str, @outjoins);
 }
 
 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");
+    my($self, $node, $parent, @joins)=@_;
+    return ("", ()) unless(defined($node));
+    return $node->to_sql($parent, @joins) if(ref($node) eq "ID3FS::Path::Node");
     my $sql;
-#    print("Hit node: " . $node->{name}. "(" .
-#        (defined($node->{parents_id}) ? $node->{parents_id} : "") .
-#        ")\n");
+    my $cnt=scalar(@joins)+1;
     if(defined($node->{parents_id}))
     {
-#      print "HIT PARENTS_ID: $node->{parents_id}\n";
-       $sql= "(t$andlevel.parents_id='$node->{parents_id}'";
-       $sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
+       $sql= "(t" . scalar(@joins) . ".parents_id='$node->{parents_id}'";
+       $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
     }
-#    elsif($parent)
-#    {
-#      print "HIT \$parent\n";
-#      $sql= "(t$andlevel.parents_id='$parent')";
-#    }
     else
     {
-       $sql= "(t$andlevel.parents_id=''";
-       $sql .= " AND fxt${andlevel}.tags_id='" . $node->{id} . "')";
+       $sql= "(t" . scalar(@joins) .".parents_id=''";
+       $sql .= " AND fxt" . scalar(@joins) . ".tags_id='" . $node->{id} . "')";
     }
-    return ($sql, $andlevel);
+    return ($sql, ());
 }
 
 sub used_tags