Raw content of Bio::EnsEMBL::Compara::Production::DBSQL::DnaCollectionAdaptor
#
# You may distribute this module under the same terms as perl itself
#
# POD documentation - main docs before the code
=pod
=head1 NAME
Bio::EnsEMBL::Compara::Production::DnaCollectionAdaptor
=head1 SYNOPSIS
=head1 DESCRIPTION
Adpter to DnaColelction objects/tables
DnaColelction is an object to hold a super-set of DnaFragChunk, and/or DnaFragChunkSet
objects. Used in production to encapsulate particular genome/region/chunk/group DNA set
from the others. To allow system to blast against self, and isolate different
chunk/group sets of the same genome from each other.
=head1 CONTACT
Jessica Severin
=head1 APPENDIX
The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
=cut
package Bio::EnsEMBL::Compara::Production::DBSQL::DnaCollectionAdaptor;
use strict;
use Bio::EnsEMBL::Compara::Production::DnaCollection;
use Bio::EnsEMBL::Compara::Production::DnaFragChunk;
use Bio::EnsEMBL::Compara::Production::DnaFragChunkSet;
use Bio::EnsEMBL::Utils::Exception;
use Bio::EnsEMBL::Utils::Argument;
use Bio::EnsEMBL::DBSQL::BaseAdaptor;
our @ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor);
#
# STORE METHODS
#
################
=head2 store
Arg [1] : Bio::EnsEMBL::Compara::Production::DnaCollection
Example :
Description: stores the set of DnaFragChunk objects
Returntype : int dbID of DnaCollection
Exceptions :
Caller :
=cut
sub store {
my ($self, $collection) = @_;
unless($collection->isa('Bio::EnsEMBL::Compara::Production::DnaCollection')) {
throw("set arg must be a [Bio::EnsEMBL::Compara::Production::DnaCollection] "
. "not a $collection");
}
my $sth;
my $insertCount=0;
#
# first create/get the collection->dbID (from the subset table)
#
unless($collection->dbID and $collection->adaptor) {
if(defined($collection->description) && defined($collection->dump_loc)) {
$sth = $self->prepare("INSERT ignore INTO subset (description,dump_loc) VALUES (?,?)");
$insertCount = $sth->execute($collection->description,$collection->dump_loc);
} elsif(defined($collection->description)) {
$sth = $self->prepare("INSERT ignore INTO subset (description) VALUES (?)");
$insertCount = $sth->execute($collection->description);
} else {
$sth = $self->prepare("INSERT ignore INTO subset SET description=NULL");
$insertCount = $sth->execute();
}
if($insertCount>0) {
$collection->dbID( $sth->{'mysql_insertid'} );
}
else {
#print("insert failed, do select\n");
my $sth2 = $self->prepare("SELECT subset_id FROM subset WHERE description=?");
$sth2->execute($collection->description);
my($id) = $sth2->fetchrow_array();
$collection->dbID($id);
$sth2->finish;
}
$sth->finish;
}
throw("unable to create/get collection_id\n") unless($collection->dbID);
#print("DnaCollectionAdaptor:store() dbID = ", $collection->dbID, "\n");
my @dna_objects = @{$collection->get_all_dna_objects};
$sth = $self->prepare("INSERT ignore INTO dna_collection (dna_collection_id, table_name, foreign_id) VALUES (?,?,?)");
foreach my $object (@dna_objects) {
if($object->isa('Bio::EnsEMBL::Compara::Production::DnaFragChunk')) {
$sth->execute($collection->dbID, 'dnafrag_chunk', $object->dbID);
}
if($object->isa('Bio::EnsEMBL::Compara::Production::DnaFragChunkSet')) {
$sth->execute($collection->dbID, 'dnafrag_chunk_set', $object->dbID);
}
}
$sth->finish;
$collection->adaptor($self);
return $collection->dbID;
}
=head2 store_link
Arg [1] : int $dna_collection_id
Arg [2] : int $foreign_id
Example :
Description:
Returntype :
Exceptions :
Caller :
=cut
sub store_link {
my ($self, $dna_collection_id, $foreign_id) = @_;
return unless($dna_collection_id and $foreign_id);
my $sth = $self->prepare("INSERT ignore INTO dna_collection (dna_collection_id, foreign_id) VALUES (?,?)");
$sth->execute($dna_collection_id, $foreign_id);
$sth->finish;
}
=head2 delete_link
Arg [1] : int $dna_collection_id
Arg [2] : int $foreign_id
Example :
Description:
Returntype :
Exceptions :
Caller :
=cut
sub delete_link {
my ($self, $dna_collection_id, $foreign_id) = @_;
my $sth = $self->prepare("DELETE FROM dna_collection WHERE dna_collection_id=? AND foreign_id=?");
$sth->execute($dna_collection_id, $foreign_id);
$sth->finish;
}
#
# FETCH METHODS
#
################
=head2 fetch_by_dbID
Arg [1] : int $id
the unique database identifier for the feature to be obtained
Example : $feat = $adaptor->fetch_by_dbID(1234);
Description: Returns the feature created from the database defined by the
the id $id.
Returntype : Bio::EnsEMBL::Compara::Production::DnaCollection
Exceptions : thrown if $id is not defined
Caller : general
=cut
sub fetch_by_dbID{
my ($self,$id) = @_;
unless(defined $id) {
throw("fetch_by_dbID must have an id");
}
my @tabs = $self->_tables;
my ($name, $syn) = @{$tabs[0]};
#construct a constraint like 't1.table1_id = 1'
my $constraint = "${syn}.${name}_id = $id";
#return first element of _generic_fetch list
my ($obj) = @{$self->_generic_fetch($constraint)};
return $obj;
}
=head2 fetch_by_set_description
Arg [1] : string $set_description
Example :
Description:
Returntype :
Exceptions :
Caller :
=cut
sub fetch_by_set_description {
my ($self,$set_description) = @_;
unless(defined $set_description) {
throw("fetch_by_set_description must have a description");
}
#construct a constraint like 't1.table1_id = 1'
my $constraint = "s.description = '$set_description'";
#print("fetch_by_set_name contraint:\n$constraint\n");
#return first element of _generic_fetch list
my ($obj) = @{$self->_generic_fetch($constraint)};
return $obj;
}
#
# INTERNAL METHODS
#
###################
sub _tables {
my $self = shift;
return (['subset', 's'], ['dna_collection', 'dc']);
}
sub _columns {
my $self = shift;
return qw (s.subset_id
s.description
s.dump_loc
dc.dna_collection_id
dc.table_name
dc.foreign_id);
}
sub _default_where_clause {
my $self = shift;
return 's.subset_id = dc.dna_collection_id';
}
sub _final_clause {
my $self = shift;
return '';
}
=head2 _generic_fetch
Arg [1] : (optional) string $constraint
An SQL query constraint (i.e. part of the WHERE clause)
Arg [2] : (optional) string $logic_name
the logic_name of the analysis of the features to obtain
Example : $fts = $a->_generic_fetch('contig_id in (1234, 1235)', 'Swall');
Description: Performs a database fetch and returns feature objects in
contig coordinates.
Returntype : listref of Bio::EnsEMBL::SeqFeature in contig coordinates
Exceptions : none
Caller : BaseFeatureAdaptor, ProxyDnaAlignFeatureAdaptor::_generic_fetch
=cut
sub _generic_fetch {
my ($self, $constraint, $join) = @_;
my @tables = $self->_tables;
my $columns = join(', ', $self->_columns());
if ($join) {
foreach my $single_join (@{$join}) {
my ($tablename, $condition, $extra_columns) = @{$single_join};
if ($tablename && $condition) {
push @tables, $tablename;
if($constraint) {
$constraint .= " AND $condition";
} else {
$constraint = " $condition";
}
}
if ($extra_columns) {
$columns .= ", " . join(', ', @{$extra_columns});
}
}
}
#construct a nice table string like 'table1 t1, table2 t2'
my $tablenames = join(', ', map({ join(' ', @$_) } @tables));
my $sql = "SELECT $columns FROM $tablenames";
my $default_where = $self->_default_where_clause;
my $final_clause = $self->_final_clause;
#append a where clause if it was defined
if($constraint) {
$sql .= " WHERE $constraint ";
if($default_where) {
$sql .= " AND $default_where ";
}
} elsif($default_where) {
$sql .= " WHERE $default_where ";
}
#append additional clauses which may have been defined
$sql .= " $final_clause";
my $sth = $self->prepare($sql);
$sth->execute;
# print STDERR $sql,"\n";
return $self->_objs_from_sth($sth);
}
sub _objs_from_sth {
my ($self, $sth) = @_;
my %column;
$sth->bind_columns( \( @column{ @{$sth->{NAME_lc} } } ));
my $collections_hash = {};
my $chunkDBA = $self->db->get_DnaFragChunkAdaptor;
my $chunkSetDBA = $self->db->get_DnaFragChunkSetAdaptor;
while ($sth->fetch()) {
my $collection = $collections_hash->{$column{'dna_collection_id'}};
unless($collection) {
$collection = new Bio::EnsEMBL::Compara::Production::DnaCollection
-dbid => $column{'dna_collection_id'},
-description => $column{'description'},
-adaptor => $self;
$collections_hash->{$collection->dbID} = $collection;
}
if (defined($column{'dump_loc'})) {
$collection->dump_loc($column{'dump_loc'});
}
if($column{'table_name'} eq 'dnafrag_chunk') {
my $chunk = $chunkDBA->fetch_by_dbID($column{'foreign_id'});
$collection->add_dna_object($chunk);
}
if($column{'table_name'} eq 'dnafrag_chunk_set') {
my $chunk_set = $chunkSetDBA->fetch_by_dbID($column{'foreign_id'});
$collection->add_dna_object($chunk_set);
}
}
$sth->finish;
my @collections = values(%{$collections_hash});
return \@collections;
}
sub _fetch_all_DnaFragChunk_by_ids {
my $self = shift;
my $chunkID_list = shift; #list reference
}
1;