my ($self, $pattern) = @_;
my $filtered_elements = [];
$pattern
if( $pattern=~/^\d+$/ ) {
$filtered_elements = $self->find_all_by( 'dbID', $pattern );
} elsif( $pattern=~/^(\d+)\.\.(\d+)$/ ) {
$filtered_elements = $self->find_all_by( 'dbID', sub { return $1<=$_[0] && $_[0]<=$2; } );
} elsif( $pattern=~/^(\d+)\.\.$/ ) {
$filtered_elements = $self->find_all_by( 'dbID', sub { return $1<=$_[0]; } );
} elsif( $pattern=~/^\.\.(\d+)$/ ) {
$filtered_elements = $self->find_all_by( 'dbID', sub { return $_[0]<=$1; } );
} elsif( $pattern=~/^\w+$/) {
$filtered_elements = $self->find_all_by( 'name', $pattern );
} elsif( $pattern=~/^[\w\%]+$/) {
$pattern=~s/\%/.*/g;
$filtered_elements = $self->find_all_by( 'name', sub { return $_[0]=~/^${pattern}$/; } );
} elsif( $pattern=~/^(\w+)==(.*)$/) {
$filtered_elements = $self->find_all_by( $1, $2 );
} elsif( $pattern=~/^(\w+)!=(.*)$/) {
$filtered_elements = $self->find_all_by( $1, sub { return $_[0] ne $2; } );
} elsif( $pattern=~/^(\w+)<=(.*)$/) { # NB: the order is important - all digraphs should be parsed before their proper prefixes
$filtered_elements = $self->find_all_by( $1, sub { return $_[0] <= $2; } );
} elsif( $pattern=~/^(\w+)>=(.*)$/) {
$filtered_elements = $self->find_all_by( $1, sub { return $_[0] >= $2; } );
} elsif( $pattern=~/^(\w+)<(.*)$/) {
$filtered_elements = $self->find_all_by( $1, sub { return $_[0] < $2; } );
} elsif( $pattern=~/^(\w+)>(.*)$/) {
$filtered_elements = $self->find_all_by( $1, sub { return $_[0] > $2; } );
} else {
die "The pattern '$pattern' is not recognized\n";
}
return $filtered_elements;
}