Bio-DB-SeqFeature
view release on metacpan or search on metacpan
lib/Bio/DB/SeqFeature/Store/memory.pm view on Meta::CPAN
my @results;
for my $bin (@bins_in_range) {
next unless exists $index->{$bin};
my @found = keys %{$index->{$bin}};
for my $f (@found) {
next if $seenit{$f}++;
my $feature = $self->_fetch($f) or next;
next if $strand && $feature->strand != $strand;
if ($range_type eq 'overlaps') {
next unless $feature->end >= $start && $feature->start <= $end;
}
elsif ($range_type eq 'contains') {
next unless $feature->start >= $start && $feature->end <= $end;
}
elsif ($range_type eq 'contained_in') {
next unless $feature->start <= $start && $feature->end >= $end;
}
push @results,$f;
}
}
$self->update_filter($filter,\@results);
}
sub filter_by_name {
my ($self, $name, $allow_aliases, $filter) = @_;
my $index = $self->{_index}{name};
my @names_to_fetch;
if (my $regexp = $self->glob_match($name)) {
@names_to_fetch = grep {/^$regexp$/i} keys %{$index};
} else {
@names_to_fetch = lc $name;
}
my @results;
for my $n (@names_to_fetch) {
if ($allow_aliases) {
push @results,keys %{$index->{$n}};
} else {
push @results,grep {$index->{$n}{$_} == 1} keys %{$index->{$n}};
}
}
$self->update_filter($filter,\@results);
}
sub glob_match {
my ($self, $term) = @_;
return unless $term =~ /(?:^|[^\\])[*?]/;
$term =~ s/(^|[^\\])([+\[\]^{}\$|\(\).])/$1\\$2/g;
$term =~ s/(^|[^\\])\*/$1.*/g;
$term =~ s/(^|[^\\])\?/$1./g;
return $term;
}
sub update_filter {
my ($self, $filter, $results) = @_;
return unless @$results;
if (%$filter) {
my @filtered = grep {$filter->{$_}} @$results;
%$filter = map {$_=>1} @filtered;
} else {
%$filter = map {$_=>1} @$results;
}
}
sub _search_attributes {
my ($self, $search_string, $attribute_array, $limit) = @_;
$search_string =~ tr/*?//d;
my @words = map {quotemeta($_)} $search_string =~ /(\w+)/g;
my $search = join '|',@words;
my (%results,%notes);
my $index = $self->{_index}{attribute};
for my $tag (@$attribute_array) {
my $attributes = $index->{lc $tag};
for my $value (keys %{$attributes}) {
next unless $value =~ /$search/i;
my @ids = keys %{$attributes->{$value}};
for my $w (@words) {
my @hits = $value =~ /($w)/ig or next;
$results{$_} += @hits foreach @ids;
}
$notes{$_} .= "$value " foreach @ids;
}
}
my @results;
for my $id (keys %results) {
my $hits = $results{$id};
my $note = $notes{$id};
$note =~ s/\s+$//;
my $relevance = 10 * $hits;
my $feature = $self->fetch($id);
my $name = $feature->display_name or next;
my $type = $feature->type;
push @results,[$name,$note,$relevance,$type,$id];
}
return @results;
}
=head2 types
Title : types
Usage : @type_list = $db->types
Function: Get all the types in the database
Returns : array of Bio::DB::GFF::Typename objects (arrayref in scalar context)
Args : none
Status : public
( run in 0.623 second using v1.01-cache-2.11-cpan-39bf76dae61 )