Raw content of Bio::EnsEMBL::Compara::DBSQL::NCBITaxonAdaptor
=head1 NAME
NestedSetAdaptor - DESCRIPTION of Object
=head1 SYNOPSIS
=head1 DESCRIPTION
=head1 CONTACT
Contact Jessica Severin on implemetation/design detail: jessica@ebi.ac.uk
Contact Ewan Birney on EnsEMBL in general: birney@sanger.ac.uk
=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::DBSQL::NCBITaxonAdaptor;
use strict;
use Bio::EnsEMBL::Utils::Exception qw(throw warning deprecate);
use Bio::EnsEMBL::Compara::NCBITaxon;
use Bio::EnsEMBL::Compara::DBSQL::NestedSetAdaptor;
our @ISA = qw(Bio::EnsEMBL::Compara::DBSQL::NestedSetAdaptor);
=head2 fetch_node_by_taxon_id
Arg [1] : int $taxon->dbID
the database id for a ncbi taxon
Example : $taxon = $nbcitaxonDBA->fetch_node_by_taxon_id($taxon_id);
Description: Returns an NCBITaxon object for the given NCBI Taxon id.
Returntype : Bio::EnsEMBL::Compara::NCBITaxon
Exceptions : thrown if $taxon_id is not defined
Caller : general
=cut
sub fetch_node_by_taxon_id {
my ($self, $taxon_id) = @_;
my $constraint = "WHERE t.taxon_id = $taxon_id";
my ($node) = @{$self->_generic_fetch($constraint)};
unless ($node) {
my $new_taxon_id = $self->fetch_node_id_by_merged_taxon_id($taxon_id);
if (defined $new_taxon_id) {
$constraint = "WHERE t.taxon_id = $new_taxon_id";
($node) = @{$self->_generic_fetch($constraint)};
}
if ($node) {
warning("The given taxon_id=$taxon_id is now deprecated and has been merged with taxon_id=".$node->taxon_id,"\n");
}
}
return $node;
}
sub fetch_node_id_by_merged_taxon_id {
my ($self, $taxon_id) = @_;
my $sql = "SELECT t.taxon_id FROM ncbi_taxa_node t, ncbi_taxa_name n WHERE n.name = ? and n.name_class = 'merged_taxon_id' AND t.taxon_id = n.taxon_id";
my $sth = $self->dbc->prepare($sql);
$sth->execute($taxon_id);
my ($merged_taxon_id) = $sth->fetchrow_array();
$sth->finish;
return $merged_taxon_id;
}
=head2 fetch_node_by_name
Arg [1] : a taxonomy name
the database name for a ncbi taxon
Example : $taxon = $nbcitaxonDBA->fetch_node_by_name($name);
Description: Returns an NCBITaxon object for the given NCBI Taxon name.
Returntype : Bio::EnsEMBL::Compara::NCBITaxon
Exceptions : thrown if $name is not defined
Caller : general
=cut
sub fetch_node_by_name {
my ($self, $name) = @_;
my $constraint = "WHERE n.name = '$name'";
my ($node) = @{$self->_generic_fetch($constraint)};
return $node;
}
=head2 fetch_node_by_genome_db_id
Arg [1] : a genome_db_id
Example : $taxon = $nbcitaxonDBA->fetch_node_by_genome_db_id($gdbID);
Description: Returns an NCBITaxon object for the given genome_db_id.
Returntype : Bio::EnsEMBL::Compara::NCBITaxon
Exceptions : thrown if $gdbID is not defined
Caller : general
=cut
sub fetch_node_by_genome_db_id {
my ($self, $gdbID) = @_;
my $constraint = "JOIN genome_db gdb ON ( t.taxon_id = gdb.taxon_id)
WHERE gdb.genome_db_id=$gdbID";
my ($node) = @{$self->_generic_fetch($constraint)};
return $node;
}
=head2 fetch_parent_for_node
Overview : returns the parent NCBITaxon object for this node
Example : my $my_parent = $object->parent();
Returntype : undef or Bio::EnsEMBL::Compara::NCBITaxon
Exceptions : none
Caller : general
=cut
sub fetch_parent_for_node {
my ($self, $node) = @_;
unless($node->isa('Bio::EnsEMBL::Compara::NestedSet')) {
throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $node");
}
my $constraint = "WHERE t.taxon_id = " . $node->_parent_id;
my ($parent) = @{$self->_generic_fetch($constraint)};
return $parent;
}
##################################
#
# subclass override methods
#
##################################
sub _objs_from_sth {
my ($self, $sth) = @_;
my $node_list = [];
while(my $rowhash = $sth->fetchrow_hashref) {
my $node = $self->create_instance_from_rowhash($rowhash);
push @$node_list, $node;
}
return $node_list;
}
sub tables {
my $self = shift;
return [['ncbi_taxa_node', 't'],
['ncbi_taxa_name', 'n']
];
}
sub columns {
my $self = shift;
return ['t.taxon_id as node_id',
't.parent_id',
't.left_index',
't.right_index',
't.rank',
't.genbank_hidden_flag',
'n.name'
];
}
sub default_where_clause {
my $self = shift;
return "t.taxon_id = n.taxon_id and n.name_class='scientific name'";
}
sub create_instance_from_rowhash {
my $self = shift;
my $rowhash = shift;
my $node = $self->cache_fetch_by_id($rowhash->{'node_id'});
return $node if($node);
$node = new Bio::EnsEMBL::Compara::NCBITaxon;
$self->init_instance_from_rowhash($node, $rowhash);
$self->_load_tagvalues($node);
#$self->cache_add_object($node);
return $node;
}
sub init_instance_from_rowhash {
my $self = shift;
my $node = shift;
my $rowhash = shift;
$self->SUPER::init_instance_from_rowhash($node, $rowhash);
$node->name($rowhash->{'name'});
$node->rank($rowhash->{'rank'});
$node->genbank_hidden_flag($rowhash->{'genbank_hidden_flag'});
$node->distance_to_parent(0.1);
# print(" create node : ", $node, " : "); $node->print_node;
return $node;
}
sub _load_tagvalues {
my $self = shift;
my $node = shift;
unless($node->isa('Bio::EnsEMBL::Compara::NCBITaxon')) {
throw("set arg must be a [Bio::EnsEMBL::Compara::NCBITaxon] not a $node");
}
my $sth = $self->prepare("SELECT name_class, name from ncbi_taxa_name where taxon_id=?");
$sth->execute($node->node_id);
while (my ($tag, $value) = $sth->fetchrow_array()) {
$node->add_tag($tag,$value,1);
}
$sth->finish;
}
sub update {
my ($self, $node) = @_;
unless($node->isa('Bio::EnsEMBL::Compara::NestedSet')) {
throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $node");
}
my $parent_id = 0;
if($node->parent) {
$parent_id = $node->parent->node_id ;
}
my $root_id = $node->root->node_id;
my $table= $self->tables->[0]->[0];
my $sql = "UPDATE $table SET ".
"parent_id=$parent_id".
",root_id=$root_id".
",left_index=" . $node->left_index .
",right_index=" . $node->right_index .
" WHERE $table.taxon_id=". $node->node_id;
$self->dbc->do($sql);
}
1;