node_to_sql
authorIan Beckwith <ianb@erislabs.net>
Sat, 9 Oct 2010 14:14:10 +0000 (15:14 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sat, 9 Oct 2010 14:14:10 +0000 (15:14 +0100)
lib/ID3FS/Path.pm
lib/ID3FS/Path/Node.pm

index 8e7c791..a27cd7e 100644 (file)
@@ -301,7 +301,13 @@ sub parse
     @{$self->{elements}}=$self->sort_elements(@{$self->{elements}});
     my $thing=$self->elements_to_tree([ @{$self->{elements}} ]);
     $self->{tagtree}=$self->elements_to_tree([ @{$self->{elements}} ]);
-#    print($self->{tagtree}->print(), "\n") if $self->{tagtree};
+    if($self->{tagtree})
+    {
+       ($self->{sqlconditions},
+        $self->{andsneeded}) = $self->{tagtree}->to_sql();
+       print("SQL CONDITION(", $self->{andsneeded}, "): ",
+             $self->{sqlconditions}, "\n");
+    }
 }
 
 sub state
index b692750..4fe4f48 100644 (file)
@@ -56,4 +56,47 @@ sub print_node
     return $node->{name};
 }
 
+sub to_sql
+{
+    my($self, $andlevel)=@_;
+    $andlevel=1 unless(defined($andlevel));
+    my ($leftandlevel, $rightandlevel);
+    my ($leftstr, $rightstr);
+    my $op=$self->op();
+    my $left=$self->left();
+    my $right=$self->right();
+    return ("", $andlevel) unless($left || $right);
+    ($leftstr, $leftandlevel) = $self->node_to_sql($left, $andlevel);
+    $andlevel=$self->max($andlevel, $leftandlevel);
+    if(defined($op) && (($op->{name} eq "AND") || ($op->{name} eq "NOT")))
+    {
+       $andlevel++;
+    }
+    ($rightstr, $rightandlevel) = $self->node_to_sql($right, $andlevel);
+    my $str=$leftstr;
+    $str .= (" " . $op->{name} . " ") if($op);
+    $str .= $rightstr;
+    if($op || ($left && $right))
+    {
+       $str="(" . $str . ")";
+    }
+    return($str, $self->max($leftandlevel, $rightandlevel));
+}
+
+sub node_to_sql
+{
+    my($self, $node, $andlevel)=@_;
+    return ("", $andlevel) unless(defined($node));
+    return $node->to_sql($andlevel) if(ref($node) eq "ID3FS::Path::Node");
+    # FIXME: switch to id when debugged
+#    return( ( "fxt" . $andlevel . "=\"" . $node->{id} . "\""), $andlevel);
+    return( ( "fxt" . $andlevel . "=\"" . $node->{name} . "\""), $andlevel);
+}
+
+sub max
+{
+    my($self, $a, $b)=@_;
+    return(($a > $b) ? $a : $b);
+}
+
 1;