[Bioperl-l] Searching by source in Bio::DB::SeqFeature::Store?
Sendu Bala
bix at sendu.me.uk
Wed Oct 10 11:10:45 EDT 2007
Lincoln Stein wrote:
> Hi Sendu,
>
> This may be a glaring omission on my part. Try searching for:
>
> @feats = $db->get_features_by_type(":$source");
>
> Remove the colon in front of $source.
It doesn't, unfortunately, colon or not. get_features_by_type is
implemented using _features(-type => ), just like features(). In any
case, I'm searching for multiple things at the same time so need to use
the features() method.
The following patch seems to do the job in my hands, allowing:
@feats = $db->features(-source => 'Z');
to work as expected.
Also, we now have:
@feats = $db->features(-type => 'X', -source => 'Z');
as a nicer (ie. matching the syntax the user used to create the feature
in the first place) alternative to:
@feats = $db->features(-type => 'X:Y');
Of course, this patch is specific to the mysql implementation. You may
want to check it over to see if it is sane, see if there is a cleaner
way to do it, or see if there's a more general way to apply it to all
implementations.
RCS file:
/home/repository/bioperl/bioperl-live/Bio/DB/SeqFeature/Store/DBI/mysql.pm,v
retrieving revision 1.33
diff -r1.33 mysql.pm
724c724,725
< $iterator
---
> $iterator,
> $sources
731a733
> ['SOURCE','SOURCES']
760c762,785
<
---
>
> if (defined($sources)) {
> my @sources = ref($sources) eq 'ARRAY' ? @{$sources} : ($sources);
> if (defined($types)) {
> my @types = ref($types) eq 'ARRAY' ? @{$types} : ($types);
> my @final_types;
> foreach my $type (@types) {
> # *** not sure what to do if user supplies both -source
> # and -type where the type includes a source!
> if ($type =~ /:/) {
> push(@final_types, $type);
> }
> else {
> foreach my $source (@sources) {
> push(@final_types, $type.':'.$source);
> }
> }
> }
> $types = \@final_types;
> }
> else {
> $types = [map { ':'.$_ } @sources];
> }
> }
939,940c964,971
< push @matches,"tl.tag=?";
< push @args,"$primary_tag:$source_tag";
---
> if (length($primary_tag)) {
> push @matches,"tl.tag=?";
> push @args,"$primary_tag:$source_tag";
> }
> else {
> push @matches,"tl.tag LIKE ?";
> push @args,"%:$source_tag";
> }
More information about the Bioperl-l
mailing list