BioPerl
view release on metacpan or search on metacpan
Bio/DB/SeqFeature/Store/DBI/mysql.pm view on Meta::CPAN
if (@types) {
my ($from,$where,undef,@a) = $self->_types_sql(\@types,'f');
push @from,$from if $from;
push @where,$where if $where;
push @args,@a;
}
my $from = join ', ',@from;
my $where = join ' AND ',@where;
my $query = <<END;
SELECT f.id,f.object
FROM $from
WHERE $where
END
$self->_print_query($query,@args) if DEBUG || $self->debug;
my $sth = $self->_prepare($query) or $self->throw($self->dbh->errstr);
$sth->execute(@args) or $self->throw($sth->errstr);
return $self->_sth2objs($sth);
}
###
# get primary sequence between start and end
#
sub _fetch_sequence {
my $self = shift;
my ($seqid,$start,$end) = @_;
# backward compatibility to the old days when I liked reverse complementing
# dna by specifying $start > $end
my $reversed;
if (defined $start && defined $end && $start > $end) {
$reversed++;
($start,$end) = ($end,$start);
}
$start-- if defined $start;
$end-- if defined $end;
my $id = $self->_locationid($seqid);
my $offset1 = $self->_offset_boundary($id,$start || 'left');
my $offset2 = $self->_offset_boundary($id,$end || 'right');
my $sequence_table = $self->_sequence_table;
my $sql = <<END;
SELECT sequence,offset
FROM $sequence_table as s
WHERE s.id=?
AND s.offset >= ?
AND s.offset <= ?
ORDER BY s.offset
END
my $sth = $self->_prepare($sql);
my $seq = '';
$self->_print_query($sql,$id,$offset1,$offset2) if DEBUG || $self->debug;
$sth->execute($id,$offset1,$offset2) or $self->throw($sth->errstr);
while (my($frag,$offset) = $sth->fetchrow_array) {
substr($frag,0,$start-$offset) = '' if defined $start && $start > $offset;
$seq .= $frag;
}
substr($seq,$end-$start+1) = '' if defined $end && $end-$start+1 < length($seq);
if ($reversed) {
$seq = reverse $seq;
$seq =~ tr/gatcGATC/ctagCTAG/;
}
$sth->finish;
$seq;
}
sub _offset_boundary {
my $self = shift;
my ($seqid,$position) = @_;
my $sequence_table = $self->_sequence_table;
my $locationlist_table = $self->_locationlist_table;
my $sql;
$sql = $position eq 'left' ? "SELECT min(offset) FROM $sequence_table as s WHERE s.id=?"
:$position eq 'right' ? "SELECT max(offset) FROM $sequence_table as s WHERE s.id=?"
:"SELECT max(offset) FROM $sequence_table as s WHERE s.id=? AND offset<=?";
my $sth = $self->_prepare($sql);
my @args = $position =~ /^-?\d+$/ ? ($seqid,$position) : ($seqid);
$self->_print_query($sql,@args) if DEBUG || $self->debug;
$sth->execute(@args) or $self->throw($sth->errstr);
my $boundary = $sth->fetchall_arrayref->[0][0];
$sth->finish;
return $boundary;
}
###
# add namespace to tablename
#
sub _qualify {
my $self = shift;
my $table_name = shift;
my $namespace = $self->namespace;
return $table_name if (!defined $namespace ||
# is namespace already present in table name?
index($table_name, $namespace) == 0);
return "${namespace}_${table_name}";
}
###
# Fetch a Bio::SeqFeatureI from database using its primary_id
#
sub _fetch {
my $self = shift;
@_ or $self->throw("usage: fetch(\$primary_id)");
my $primary_id = shift;
my $features = $self->_feature_table;
my $sth = $self->_prepare(<<END);
SELECT id,object FROM $features WHERE id=?
END
$sth->execute($primary_id) or $self->throw($sth->errstr);
my $obj = $self->_sth2obj($sth);
$sth->finish;
$obj;
}
( run in 1.568 second using v1.01-cache-2.11-cpan-364913b4093 )