Raw content of Bio::EnsEMBL::Funcgen::DBSQL::ArrayChipAdaptor
#
# Ensembl module for Bio::EnsEMBL::Funcgen::DBSQL::ArrayChipAdaptor
#
# You may distribute this module under the same terms as Perl itself
=head1 NAME
Bio::EnsEMBL::Funcgen::DBSQL::ArrayChipAdaptor - A database adaptor for fetching and
storing Funcgen ArrayChip objects.
=head1 SYNOPSIS
my $ac_adaptor = $db->get_ArrayChipAdaptor();
my @achips = @{$ec_adaptor->fetch_all_by_Array($array)};
=head1 DESCRIPTION
The ArrayChipAdaptor is a database adaptor for storing and retrieving
Funcgen ArrayChip objects.
=head1 AUTHOR
This module was created by Nathan Johnson.
This module is part of the Ensembl project: /
=head1 CONTACT
Post comments or questions to the Ensembl development list: ensembl-dev@ebi.ac.uk
=head1 METHODS
=cut
use strict;
use warnings;
package Bio::EnsEMBL::Funcgen::DBSQL::ArrayChipAdaptor;
use Bio::EnsEMBL::Utils::Exception qw( warning throw );
use Bio::EnsEMBL::Funcgen::ArrayChip;
use Bio::EnsEMBL::Funcgen::DBSQL::BaseAdaptor;
use vars qw(@ISA);
#May need to our this?
@ISA = qw(Bio::EnsEMBL::Funcgen::DBSQL::BaseAdaptor);
=head2 fetch_all_by_array_id
Arg [1] : int - dbID of Array
Example : my @ccs = @{$ec_a->fetch_all_by_array_dbID($array->dbID());
Description: Does what it says on the tin
Returntype : Listref of Bio::EnsEMBL::Funcgen::ArrayChip
Exceptions : None
Caller : General
Status : Medium Risk
=cut
sub fetch_all_by_array_id {
my $self = shift;
my $array_id = shift;
throw("Must specify an array dbID") if(! $array_id);
my $constraint = "ac.array_id='$array_id'";
return $self->generic_fetch($constraint);
}
=head2 fetch_all_by_Array
Arg [1] : Bio::EnsEMBL::Funcgen::Array
Example : my @ccs = @{$ec_a->fetch_all_by_Array($array);
Description: Returns all ArrayChips which belong to the given Array
Returntype : Arrayref of Bio::EnsEMBL::Funcgen::ArrayChip objects
Exceptions : Throws if ARg not valid and stored
Caller : General
Status : At Risk
=cut
sub fetch_all_by_Array {
my ($self, $array) = @_;
if(! (ref($array) && $array->isa->('Bio::EnsEMBL::Funcgen::Array') && $array->dbID())){
throw("Must pass a valid stored Bio::EnsEMBL::Funcgen::Array");
}
return $self->fetch_all_by_array_id($array->dbID);
}
=head2 fetch_all_by_ExperimentalChips
Arg [1] : arrayref of - Bio::EnsEMBL::Funcgen::ExperimentalChips
Example : my @achips = @{$ec_a->fetch_all_by_ExperimentalChips($echips);
Description: Gets a non-redundant list of the corresponding ArrayChips
Returntype : Listref of Bio::EnsEMBL::Funcgen::ArrayChips
Exceptions : Throws if no ExperimentalChips passed or if ExperimentalChips are not stored or valid
Caller : General
Status : at risk
=cut
sub fetch_all_by_ExperimentalChips {
my ($self, $echips) = @_;
my %ac_ids;
foreach my $echip(@$echips){
if(! ($echip->isa('Bio::EnsEMBL::Funcgen::ExperimentalChip') && $echip->dbID())){
throw('Must provide an arrayref of valid stored Bio::EnsEMBL::Funcgen::ExperimentalChips');
}
$ac_ids{$echip->array_chip_id} = 1;
}
if(! keys(%ac_ids)){
throw('Must provide an arrayref of valid stored Bio::EnsEMBL::Funcgen::ExperimentalChips');
}
return $self->generic_fetch('ac.array_chip_id IN ('.join(', ', keys(%ac_ids)).')');
}
=head2 fetch_by_array_design_ids
Arg [1] : int - dbID of Array
Arg [2] : string - Design ID of ArrayChip
Example : my $ac = $ac_adaptpr->fetch_by_array_design_ids($array->dbID, $design_id);
Description: Does what it says on the tin
Returntype : Bio::EnsEMBL::Funcgen::ArrayChip
Exceptions : Throws if args not met.
Caller : General
Status : Medium Risk
=cut
sub fetch_by_array_design_ids{
my ($self, $array_id, $design_id) = @_;
if( ! ($array_id && $design_id)){
throw('You must pass an Array dbID and a ArrayChip design ID');
}
my $constraint = "ac.array_id='$array_id' and ac.design_id='$design_id'";
my ($ac) = @{$self->generic_fetch($constraint)};
#unique key means this always has just one element
return $ac;
}
#fetch by Array_array_chip_name??
#would need this if we're going to check for previously imported ArrayChips, as there's no guarantee that the design_name will be populated.
=head2 _tables
Args : None
Example : None
Description: PROTECTED implementation of superclass abstract method.
Returns the names and aliases of the tables to use for queries.
Returntype : List of listrefs of strings
Exceptions : None
Caller : Internal
Status : Medium Risk
=cut
sub _tables {
my $self = shift;
return ['array_chip', 'ac'];
}
=head2 _columns
Args : None
Example : None
Description: PROTECTED implementation of superclass abstract method.
Returns a list of columns to use for queries.
Returntype : List of strings
Exceptions : None
Caller : Internal
Status : Medium Risk
=cut
sub _columns {
my $self = shift;
return qw( ac.array_chip_id ac.design_id ac.array_id ac.name);
}
=head2 _objs_from_sth
Arg [1] : DBI statement handle object
Example : None
Description: PROTECTED implementation of superclass abstract method.
Creates Array objects from an executed DBI statement
handle.
Returntype : Listref of Bio::EnsEMBL::Funcgen::ArrayChip objects
Exceptions : None
Caller : Internal
Status : At Risk
=cut
sub _objs_from_sth {
my ($self, $sth) = @_;
my (@result, $ac_id, $design_id, $array_id, $name);
$sth->bind_columns(\$ac_id, \$design_id, \$array_id, \$name);
while ( $sth->fetch() ) {
my $array = Bio::EnsEMBL::Funcgen::ArrayChip->new(
-dbID => $ac_id,
-design_id => $design_id,
-array_id => $array_id,
-name => $name,
-adaptor => $self,
);
push @result, $array;
}
return \@result;
}
=head2 store
Args : List of Bio::EnsEMBL::Funcgen::ArrayChip objects
Example : $arraychip_adaptor->store($ac1, $ac2, $ac3);
Description: Stores given ArrayChip objects in the database. Should only be
called once per ArrayChip because no checks are made for duplicates.
Returntype : ARRAYREF
Exceptions : warns if passed non-ArrayChip arg
Caller : General
Status : At Risk
=cut
sub store {
my $self = shift;
my @args = @_;
#my ($stored_ac);
#Should we implement a throw here is the caller is not Array?
#make private _store?
my $sth = $self->prepare("
INSERT INTO array_chip
(design_id, array_id, name)
VALUES (?, ?, ?)"
);
foreach my $ac (@args) {
if ( ! $ac->isa('Bio::EnsEMBL::Funcgen::ArrayChip') ) {
warning('Can only store ExperimentalChip objects, skipping $ec');
next;
}
throw("ArrayChip must have an array_id to be stored") if ! $ac->array_id();
#check for array_id here? this is done by not null in sql
#check for previously stored array_chips is done in Array via add_ArrayChip
if (!( $ac->dbID() && $ac->adaptor() == $self )){
my $s_ac = $self->fetch_by_array_design_ids($ac->array_id(), $ac->design_id());
if(! $s_ac){
$sth->bind_param(1, $ac->design_id(), SQL_VARCHAR);
$sth->bind_param(2, $ac->array_id(), SQL_INTEGER);
$sth->bind_param(3, $ac->name(), SQL_VARCHAR);
$sth->execute();
my $dbID = $sth->{'mysql_insertid'};
$ac->dbID($dbID);
$ac->adaptor($self);
}else{
$ac = $s_ac;
# my @states = @{$self->db->fetch_all_states('experimental_chip', $ec->dbID())};
# warn("Using previously stored ExperimentalChip (".$ec->unique_id().") with states\t@states\n");
}
}
}
return \@args;
}
=head2 list_dbIDs
Args : None
Example : my @array_ids = @{$ec_a->list_dbIDs()};
Description: Gets an array of internal IDs for all ArrayChip objects in the
current database.
Returntype : List of ints
Exceptions : None
Caller : ?
Status : Medium Risk
=cut
sub list_dbIDs {
my ($self) = @_;
return $self->_list_dbIDs('array_chip');
}
1;