From cb45ec109897ea5a79841a5cc9b5d3dff040f761 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Sat, 9 Oct 2010 15:14:10 +0100 Subject: [PATCH] node_to_sql --- lib/ID3FS/Path.pm | 8 +++++++- lib/ID3FS/Path/Node.pm | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index 8e7c791..a27cd7e 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -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 diff --git a/lib/ID3FS/Path/Node.pm b/lib/ID3FS/Path/Node.pm index b692750..4fe4f48 100644 --- a/lib/ID3FS/Path/Node.pm +++ b/lib/ID3FS/Path/Node.pm @@ -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; -- 2.11.0