my $self={};
bless($self,$class);
+ $self->{elements}=[];
$self->{db}=shift;
$self->{path}=shift;
$self->parse();
my($self, $mountpoint)=@_;
if($self->state() == $STATE_FILE)
{
- return $self->{db}->filename($mountpoint, @{$self->{elements}});
+ return $self->{db}->filename($mountpoint, $self);
}
return "ERROR"; #should never happen?
}
ref($tag) eq "ID3FS::PathElement::Tag" &&
$self->{db}->tag_has_values($tag->{id}))
{
- @dents=$self->{db}->tags(@{$self->{elements}});
+ @dents=$self->{db}->tags($self);
}
else
{
@dents=(qw(AND OR TRACKS NOARTIST),
- $self->{db}->artists(@{$self->{elements}}));
+ $self->{db}->artists($self));
}
}
elsif($state==$STATE_BOOLEAN)
{
push(@dents, "NOT");
}
- push(@dents, $self->{db}->tags(@{$self->{elements}}));
+ push(@dents, $self->{db}->tags($self));
}
elsif($state==$STATE_ROOT)
{
- @dents=(qw(ALL NOT), $self->{db}->tags(@{$self->{elements}}));
+ @dents=(qw(ALL NOT), $self->{db}->tags($self));
}
elsif($state==$STATE_ALBUMS)
{
- @dents=(qw(TRACKS NOALBUM),$self->{db}->albums(@{$self->{elements}}));
+ @dents=(qw(TRACKS NOALBUM),$self->{db}->albums($self));
}
elsif($state==$STATE_TRACKLIST)
{
- @dents=$self->{db}->tracks(@{$self->{elements}});
+ @dents=$self->{db}->tracks($self);
}
else
{
$self->state($STATE_INVALID);
}
}
+ # remove trailing boolean
+ if(@{$self->{elements}} &&
+ ref($self->{elements}->[$#{$self->{elements}}]) eq "ID3FS::PathElement::Boolean")
+ {
+ $self->{lastop}=pop @{$self->{elements}};
+ }
# sort elements by precedence
@{$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");
+# use Data::Dumper;
+# print Dumper $self->{tagtree};
+ }
}
sub state
my ($self, @input)=@_;
my @opstack=();
my @output=();
- print "\nINPUT: ", join(', ', map { $_->{name}; } @input), "\n";
+# print "INPUT: ", join(', ', map { $_->{name}; } @input), "\n";
while(my $thing = shift @input)
{
if(ref($thing) eq "ID3FS::PathElement::Tag")
# print "OPSTACK: ", join(', ', map { $_->{name}; } @opstack), "\n";
# print "OUTPUT: ", join(', ', map { $_->{name}; } @output), "\n";
}
- else
+ elsif(ref($thing) eq "ID3FS::PathElement::Boolean")
{
# print "BOOL: $thing->{name}\n";
# bool
{
push(@output, pop(@opstack));
}
- print "STACK: ", join(', ', map { $_->{name}; } @output), "\n";
+# print "STACK: ", join(', ', map { $_->{name}; } @output), "\n";
return @output;
}
+sub used_tags
+{
+ my($self)=@_;
+ print "TAGTREE UNDEF\n" unless(defined($self->{tagtree}));
+ return undef unless(defined($self->{tagtree}));
+ return($self->{tagtree}->used_tags());
+}
+
1;