Bio-EnsEMBL
view release on metacpan or search on metacpan
lib/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm view on Meta::CPAN
# Want to get features on the FULL original slice as well as any
# symlinked slices.
# Filter out partial slices from projection that are on same
# seq_region as original slice.
my $sr_id = $slice->get_seq_region_id();
@proj = grep { $_->to_Slice->get_seq_region_id() != $sr_id } @proj;
my $segment = bless( [ 1, $slice->length(), $slice ],
'Bio::EnsEMBL::ProjectionSegment' );
push( @proj, $segment );
return \@proj;
}
=head2 store
Arg [1] : Bio::EnsEMBL::Slice $slice
Arg [2] : (optional) $seqref reference to a string
The sequence associated with the slice to be stored.
Example : $slice = Bio::EnsEMBL::Slice->new(...);
$seq_region_id = $slice_adaptor->store($slice, \$sequence);
Description: This stores a slice as a sequence region in the database
and returns the seq region id. The passed in slice must
start at 1, and must have a valid seq_region name and coordinate
system. The attached coordinate system must already be stored in
the database. The sequence region is assumed to start at 1 and
to have a length equalling the length of the slice. The end of
the slice must equal the seq_region_length.
If the slice coordinate system is the sequence level coordinate
system then the seqref argument must also be passed. If the
slice coordinate system is NOT a sequence level coordinate
system then the sequence argument cannot be passed.
Returntype : int
Exceptions : throw if slice has no coord system.
throw if slice coord system is not already stored.
throw if slice coord system is seqlevel and no sequence is
provided.
throw if slice coord system is not seqlevel and sequence is
provided.
throw if slice does not start at 1
throw if sequence is provided and the sequence length does not
match the slice length.
throw if the SQL insert fails (e.g. on duplicate seq region)
throw if slice argument is not passed
throw if the slice end is not equal to seq_region_length
Caller : database loading scripts
Status : Stable
=cut
sub store {
my $self = shift;
my $slice = shift;
my $seqref = shift;
my $not_dna = shift;
#
# Get all of the sanity checks out of the way before storing anything
#
if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice'))) {
throw('Slice argument is required');
}
my $cs = $slice->coord_system();
throw("Slice must have attached CoordSystem.") if(!$cs);
my $db = $self->db();
if(!$cs->is_stored($db)) {
throw("Slice CoordSystem must already be stored in DB.")
}
if($slice->start != 1 || $slice->strand != 1) {
throw("Slice must have start==1 and strand==1.");
}
if($slice->end() != $slice->seq_region_length()) {
throw("Slice must have end==seq_region_length");
}
my $sr_len = $slice->length();
my $sr_name = $slice->seq_region_name();
if($sr_name eq '') {
throw("Slice must have valid seq region name.");
}
if($cs->is_sequence_level() && !$not_dna) {
if(!$seqref) {
throw("Must provide sequence for sequence level coord system.");
}
if(ref($seqref) ne 'SCALAR') {
throw("Sequence must be a scalar reference.");
}
my $seq_len = length($$seqref);
if($seq_len != $sr_len) {
throw("Sequence length ($seq_len) must match slice length ($sr_len).");
}
} else {
if($seqref) {
throw("Cannot provide sequence for non-sequence level seq regions.");
}
}
#store the seq_region
my $sth = $db->dbc->prepare("INSERT INTO seq_region " .
" ( name, length, coord_system_id ) " .
" VALUES ( ?, ?, ? )"
);
$sth->bind_param(1,$sr_name,SQL_VARCHAR);
$sth->bind_param(2,$sr_len,SQL_INTEGER);
$sth->bind_param(3,$cs->dbID,SQL_INTEGER);
$sth->execute();
my $seq_region_id = $self->last_insert_id('seq_region_id', undef, 'seq_region');
if(!$seq_region_id) {
throw("Database seq_region insertion failed.");
}
if($cs->is_sequence_level() && !$not_dna) {
#store sequence if it was provided
my $seq_adaptor = $db->get_SequenceAdaptor();
$seq_adaptor->store($seq_region_id, $$seqref);
}
#synonyms
if(defined($slice->{'synonym'})){
foreach my $syn (@{$slice->{'synonym'}} ){
$syn->seq_region_id($seq_region_id); # set the seq_region_id
$syn->adaptor->store($syn);
}
}
$slice->adaptor($self);
return $seq_region_id;
}
sub update {
my $self = shift;
my $slice = shift;
#
# Get all of the sanity checks out of the way before storing anything
#
if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice'))) {
throw('Slice argument is required');
}
my $cs = $slice->coord_system();
throw("Slice must have attached CoordSystem.") if(!$cs);
my $db = $self->db();
if($slice->start != 1 || $slice->strand != 1) {
throw("Slice must have start==1 and strand==1.");
}
if($slice->end() != $slice->seq_region_length()) {
throw("Slice must have end==seq_region_length");
}
my $sr_len = $slice->length();
my $sr_name = $slice->seq_region_name();
if(!$sr_name) {
throw("Slice must have valid seq region name.");
}
#update the seq_region
my $seq_region_id = $slice->get_seq_region_id();
my $update_sql = qq(
UPDATE seq_region
SET name = ?,
length = ?,
coord_system_id = ?
( run in 0.901 second using v1.01-cache-2.11-cpan-99c4e6809bf )