Raw content of Bio::EnsEMBL::Compara::DBSQL::GenomicAlignGroupAdaptor # # Ensembl module for Bio::EnsEMBL::Compara::DBSQL::GenomicAlignGroupAdaptor # # Copyright Javier Herrero # # You may distribute this module under the same terms as perl itself # # POD documentation - main docs before the code # =head1 NAME Bio::EnsEMBL::Compara::DBSQL::GenomicAlignGroupAdaptor - Object to access data in genomic_align_group table =head1 SYNOPSIS use Bio::EnsEMBL::Compara::DBSQL::DBAdaptor; my $db = new Bio::EnsEMBL::Compara::DBSQL::DBAdaptor ( -host => $host, -user => $dbuser, -pass => $dbpass, -port => $port, -dbname => $dbname, -conf_file => $conf_file); my $genomic_align_group_adaptor = $db->get_GenomicAlignGroupAdaptor(); $genomic_align_group_adaptor->store($genomic_align_group); $genomic_align_groups = $genomic_align_group_adaptor->fetch_all_by_GenomicAlign($genomic_align); $genomic_align_groups = $genomic_align_group_adaptor->fetch_all_by_genomic_align_id(11223); $genomic_align_group = $genomic_align_group_adaptor->fetch_by_GenomicAlign_type($genomic_align, "default"); $genomic_align_group = $genomic_align_group_adaptor->fetch_by_genomic_align_id_type(11223, "default"); =head1 DESCRIPTION This class is intended to access data in genomic_align_group table =head1 AUTHOR Javier Herrero (jherrero@ebi.ac.uk) This modules is part of the Ensembl project =head1 APPENDIX The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _ =cut # Let the code begin... package Bio::EnsEMBL::Compara::DBSQL::GenomicAlignGroupAdaptor; use vars qw(@ISA); use strict; use Bio::EnsEMBL::DBSQL::BaseAdaptor; use Bio::EnsEMBL::Utils::Exception; use Bio::EnsEMBL::Compara::GenomicAlignGroup; use Bio::EnsEMBL::Compara::GenomicAlign; use Bio::EnsEMBL::Compara::DnaFrag; @ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor); =head2 new Arg [1] : list of args to super class constructor Example : $gag_a = new Bio::EnsEMBL::Compara::GenomicAlignGroupAdaptor($dbobj); Description: Creates a new GenomicAlignGroupAdaptor. This class should be instantiated through the get method on the DBAdaptor rather than calling this method directly. Returntype : none Exceptions : none Caller : Bio::EnsEMBL::DBSQL::DBConnection Status : Stable =cut sub new { my $class = shift; my $self = $class->SUPER::new(@_); $self->{_use_autoincrement} = 1; return $self; } =head2 store Arg 1 : Bio::EnsEMBL::Compara::GenomicAlignGroup The things you want to store Example : $gen_ali_grp_adaptor->store($genomic_align_group); Description: It stores the given GenomicAlginGroup in the database Returntype : Bio::EnsEMBL::Compara::GenomicAlignGroup object Exceptions : not stored linked Bio::EnsEMBL::Compara::GenomicAlign objects throw. Caller : general Status : Stable =cut sub store { my ($self, $genomic_align_group) = @_; my $genomic_align_block_sql = qq{INSERT INTO genomic_align_group ( group_id, type, genomic_align_id ) VALUES (?,?,?)}; my @values; ## CHECKING my $all_genomic_aligns = $genomic_align_group->get_all_GenomicAligns; foreach my $genomic_align (@$all_genomic_aligns) { # check if every GenomicAlgin has a dbID if (!defined($genomic_align->dbID)) { throw("GenomicAlign [$genomic_align] in GenomicAlignGroup is not in DB"); } } my $group_id = $genomic_align_group->dbID; if (!$group_id) { my $method_link_species_set_id; # Get common method_link_species_set_id foreach my $genomic_align (@$all_genomic_aligns) { if (!$genomic_align->method_link_species_set_id()) { ## undef value and exit loop if method_link_species_set_id does not match $method_link_species_set_id = undef; last; } elsif (!$method_link_species_set_id) { $method_link_species_set_id = $genomic_align->method_link_species_set_id(); } elsif ($method_link_species_set_id != $genomic_align->method_link_species_set_id()) { ## undef value and exit loop if method_link_species_set_id does not match $method_link_species_set_id = undef; last; } } if ($method_link_species_set_id && !$self->use_autoincrement()) { ## Only if method_link_species_set_id is the same for all the GenomicAligns my $sql = "SELECT MAX(group_id) FROM genomic_align_group WHERE". " group_id > ".$method_link_species_set_id. "0000000000 AND group_id < ". ($method_link_species_set_id + 1)."0000000000"; my $sth = $self->prepare($sql); $sth->execute(); $group_id = $sth->fetchrow_array(); if (defined $group_id) { $group_id++; } else { $group_id = $method_link_species_set_id * 10000000000 + 1; } } } ## Stores data, all of them with the same id my $sth = $self->prepare($genomic_align_block_sql); for (my $i = 0; $i < @$all_genomic_aligns; $i++) { my $genomic_align = $all_genomic_aligns->[$i]; $sth->execute( ($group_id or "NULL"), $genomic_align_group->type, $genomic_align->dbID ); if (!$group_id) {$group_id = $sth->{'mysql_insertid'};} info("Stored Bio::EnsEMBL::Compara::GenomicAlignGroup ". "(".($i+1)."/".scalar(@$all_genomic_aligns).") ". ($group_id or "NULL").", ".$genomic_align_group->type.", ". $genomic_align->dbID, ); } $genomic_align_group->dbID($group_id); return $genomic_align_group; } =head2 fetch_by_dbID Arg 1 : integer group_id Example : my $genomic_align_group = $genomic_align_group_adaptor->fetch_by_dbID(12413) Description: Returns a Bio::EnsEMBL::Compara::GenomicAlignGroup corresponding to the given group_id. Returntype : Bio::EnsEMBL::Compara::GenomicAlignGroup Exceptions : none Caller : object::methodname Status : Stable =cut sub fetch_by_dbID { my ($self, $group_id) = @_; my $genomic_align_group; my $genomic_align_adaptor = $self->db->get_GenomicAlignAdaptor; my $genomic_align_block_sql = qq{ SELECT group_id, type, genomic_align_id FROM genomic_align_group WHERE group_id = ? }; my @values; my $sth = $self->prepare($genomic_align_block_sql); $sth->execute($group_id); # Group results in order to be able to build Bio::EnsEMBL::Compara::GenomicAlignGroupAdaptor objects my $group; while (my $values = $sth->fetchrow_arrayref) { my ($group_id, $type, $genomic_align_id) = @$values; $group->{'group_id'} = $group_id; $group->{'type'} = $type; my $this_genomic_align = new Bio::EnsEMBL::Compara::GenomicAlign( -dbID => $genomic_align_id, -adaptor => $genomic_align_adaptor ); push(@{$group->{'genomic_align_array'}}, $this_genomic_align); } #return undef if no genomic_align_groups have been found if (!defined $group->{'group_id'}) { return $genomic_align_group; } $genomic_align_group = new Bio::EnsEMBL::Compara::GenomicAlignGroup( -dbID => $group->{'group_id'}, -adaptor => $self, -type => $group->{'type'}, -genomic_align_array => $group->{'genomic_align_array'} ); foreach my $this_genomic_align (@{$genomic_align_group->genomic_align_array}) { $this_genomic_align->genomic_align_group_by_type($genomic_align_group->type, $genomic_align_group); } return $genomic_align_group; } =head2 fetch_all_by_GenomicAlign Arg 1 : Bio::EnsEMBL::Compara::GenomicAlign $genomic_align Example : my $genomic_align_groups = $genomic_align_group_adaptor->fetch_all_by_GenomicAlign( $genomic_align) Description: Returns all the Bio::EnsEMBL::Compara::GenomicAlignGroup corresponding to the given Bio::EnsEMBL::Compara::GenomicAlign. Returntype : a ref. to an array of Bio::EnsEMBL::Compara::GenomicAlignGroup objects. Exceptions : none Caller : object::methodname Status : Stable =cut sub fetch_all_by_GenomicAlign { my ($self, $genomic_align) = @_; my $genomic_align_groups = []; my $genomic_align_adaptor = $self->db->get_GenomicAlignAdaptor; # Check Bio::EnsEMBL::Compara::GenomicAlign object unless($genomic_align && ref $genomic_align && $genomic_align->isa('Bio::EnsEMBL::Compara::GenomicAlign')) { throw("genomic_align argument must be a Bio::EnsEMBL::Compara::GenomicAlign not a [$genomic_align]"); } my $genomic_align_block_sql = qq{ SELECT group_id, type FROM genomic_align_group WHERE genomic_align_id = ? }; my $sth = $self->prepare($genomic_align_block_sql); $sth->execute($genomic_align->dbID); my $groups; while (my $values = $sth->fetchrow_arrayref) { my ($group_id, $type) = @$values; $groups->{$group_id}->{'type'} = $type; } foreach my $group_id (keys %$groups) { my $genomic_align_group = new Bio::EnsEMBL::Compara::GenomicAlignGroup( -dbID => $group_id, -adaptor => $self, -type => $groups->{$group_id}->{'type'}, ); push(@{$genomic_align_groups}, $genomic_align_group); } return $genomic_align_groups; } =head2 fetch_all_by_genomic_align_id Arg 1 : integer $genomic_align_id Example : my $genomic_align_groups = $genomic_align_group_adaptor->fetch_all_by_genomic_align_id( 124214) Description: Returns all the Bio::EnsEMBL::Compara::GenomicAlignGroup corresponding to the given Bio::EnsEMBL::Compara::GenomicAlign. Returntype : a ref. to an array of Bio::EnsEMBL::Compara::GenomicAlignGroup objects. Exceptions : none Caller : object->methodname Status : Stable =cut sub fetch_all_by_genomic_align_id { my ($self, $genomic_align_id) = @_; my $genomic_align_groups = []; my $genomic_align_adaptor = $self->db->get_GenomicAlignAdaptor; my $genomic_align_block_sql = qq{ SELECT group_id, type FROM genomic_align_group WHERE genomic_align_id = ? }; my $sth = $self->prepare($genomic_align_block_sql); $sth->execute($genomic_align_id); my $groups; while (my $values = $sth->fetchrow_arrayref) { my ($group_id, $type) = @$values; $groups->{$group_id}->{'type'} = $type; } foreach my $group_id (keys %$groups) { my $genomic_align_group = new Bio::EnsEMBL::Compara::GenomicAlignGroup( -dbID => $group_id, -adaptor => $self, -type => $groups->{$group_id}->{'type'}, ); push(@{$genomic_align_groups}, $genomic_align_group); } return $genomic_align_groups; } # # =head2 fetch_by_GenomicAlign_and_type # # # # Arg 1 : Bio::EnsEMBL::Compara::GenomicAlign $genomic_align # # - or - # # integer $genomic_align_id # # Arg 2 : string $genomic_align_group_type # # Example : my $genomic_align_group = # # $genomic_align_group_adaptor->fetch_by_GenomicAlign_and_type( # # $genomic_align, "default") # # Example : my $genomic_align_groups = # # $genomic_align_group_adaptor->fetch_all_by_GenomicAlign( # # 124214, "default") # # Description: Returns a Bio::EnsEMBL::Compara::GenomicAlignGroup corresponding # # to the given Bio::EnsEMBL::Compara::GenomicAlign and group_type. # # Returntype : Bio::EnsEMBL::Compara::GenomicAlignGroup # # Exceptions : none # # Caller : object::methodname # # # # =cut =head2 fetch_by_GenomicAlign_and_type DEPRECATED: Use the fetch_by_GenomicAlign_type method instead =cut sub fetch_by_GenomicAlign_and_type { my ($self, $genomic_align, $type) = @_; my $genomic_align_group; deprecate("Use fetch_by_GenomicAlign_type method instead"); my $genomic_align_adaptor = $self->db->get_GenomicAlignAdaptor; # Get Bio::EnsEMBL::Compara::GenomicAlign object from dbID if needed if ($genomic_align =~ /^\d+$/) { $genomic_align = $genomic_align_adaptor->fetch_by_dbID($genomic_align); } return $self->fetch_by_GenomicAlign_type($genomic_align, $type); } =head2 fetch_by_GenomicAlign_type Arg 1 : Bio::EnsEMBL::Compara::GenomicAlign $genomic_align Arg 2 : string $genomic_align_group_type Example : my $genomic_align_group = $genomic_align_group_adaptor->fetch_by_GenomicAlign_and_type( $genomic_align, "default") Description: Returns a Bio::EnsEMBL::Compara::GenomicAlignGroup corresponding to the given Bio::EnsEMBL::Compara::GenomicAlign and group_type. Returntype : Bio::EnsEMBL::Compara::GenomicAlignGroup Exceptions : none Caller : object::methodname Status : Stable =cut sub fetch_by_GenomicAlign_type { my ($self, $genomic_align, $type) = @_; my $genomic_align_group; my $genomic_align_adaptor = $self->db->get_GenomicAlignAdaptor; # Check Bio::EnsEMBL::Compara::GenomicAlign object unless($genomic_align && ref $genomic_align && $genomic_align->isa('Bio::EnsEMBL::Compara::GenomicAlign')) { throw("[$genomic_align] must be a Bio::EnsEMBL::Compara::GenomicAlign object"); } my $genomic_align_block_sql = qq{ SELECT b.group_id, b.type, b.genomic_align_id FROM genomic_align_group a, genomic_align_group b WHERE a.group_id = b.group_id AND a.genomic_align_id = ? AND a.type = ? }; my @values; my $sth = $self->prepare($genomic_align_block_sql); $sth->execute($genomic_align->dbID, $type); # Group results in order to be able to build Bio::EnsEMBL::Compara::GenomicAlignGroupAdaptor objects my $group; while (my $values = $sth->fetchrow_arrayref) { my ($group_id, $type, $genomic_align_id) = @$values; $group->{'group_id'} = $group_id; $group->{'type'} = $type; my $this_genomic_align; if ($genomic_align_id == $genomic_align->dbID) { # Use Bio::EnsEMBL::Compara::GenomicAlign object given by argument if possible $this_genomic_align = $genomic_align; } else { # Create a new Bio::EnsEMBL::Compara::GenomicAlign object otherwise $this_genomic_align = new Bio::EnsEMBL::Compara::GenomicAlign( -dbID => $genomic_align_id, -adaptor => $genomic_align_adaptor ); } push(@{$group->{'genomic_align_array'}}, $this_genomic_align); } $genomic_align_group = new Bio::EnsEMBL::Compara::GenomicAlignGroup( -dbID => $group->{'group_id'}, -adaptor => $self, -type => $group->{'type'}, -genomic_align_array => $group->{'genomic_align_array'} ); foreach my $this_genomic_align (@{$genomic_align_group->genomic_align_array}) { $this_genomic_align->genomic_align_group_by_type($genomic_align_group->type, $genomic_align_group); } return $genomic_align_group; } =head2 fetch_by_genomic_align_id_type Arg 1 : integer $genomic_align_id Arg 2 : string $genomic_align_group_type Example : my $genomic_align_group = $genomic_align_group_adaptor->fetch_by_genomic_align_id_type( 12322, "default") Description: Returns a Bio::EnsEMBL::Compara::GenomicAlignGroup corresponding to the given Bio::EnsEMBL::Compara::GenomicAlign defined by the $genomic_align_id and to the group_type. Returntype : Bio::EnsEMBL::Compara::GenomicAlignGroup Exceptions : none Caller : object::methodname Status : Stable =cut sub fetch_by_genomic_align_id_type { my ($self, $genomic_align_id, $type) = @_; my $genomic_align_group; my $genomic_align_adaptor = $self->db->get_GenomicAlignAdaptor; # Get Bio::EnsEMBL::Compara::GenomicAlign object my $genomic_align = $genomic_align_adaptor->fetch_by_dbID($genomic_align_id); unless($genomic_align && ref $genomic_align && $genomic_align->isa('Bio::EnsEMBL::Compara::GenomicAlign')) { throw("[$genomic_align] must be a Bio::EnsEMBL::Compara::GenomicAlign object"); } return $self->fetch_by_GenomicAlign_type($genomic_align, $type); } =head2 retrieve_all_direct_attributes Arg 1 : Bio::EnsEMBL::Compara::GenomicAlignGroup $genomic_align_group Example : $genomic_align_group_adaptor->retrieve_all_direct_attributes($genomic_align_group) Description: Retrieve the all the direct attibutes corresponding to the dbID of the Bio::EnsEMBL::Compara::GenomicAlignGroup object. It is used after lazy fetching of the object for populating it when required. Returntype : Bio::EnsEMBL::Compara::GenomicAlign object Exceptions : Caller : none Status : Stable =cut sub retrieve_all_direct_attributes { my ($self, $genomic_align_group) = @_; my $sql_tmp = "SELECT type FROM genomic_align_group WHERE group_id = ?"; my $sql = $self->dbc->add_limit_clause($sql_tmp,1); # my $sql = qq{ # SELECT # type # FROM # genomic_align_group # WHERE # group_id = ? # LIMIT 1 # }; my $sth = $self->prepare($sql); $sth->execute($genomic_align_group->dbID); my ($type) = $sth->fetchrow_array(); ## Populate the object $genomic_align_group->adaptor($self); $genomic_align_group->type($type) if (defined($type)); return $genomic_align_group; } =head2 use_autoincrement [Arg 1] : (optional)int value Example : $genomic_align_adaptor->use_autoincrement(0); Description: Getter/setter for the _use_autoincrement flag. This flag is used when storing new objects with no dbID in the database. If the flag is ON (default), the adaptor will let the DB set the dbID using the AUTO_INCREMENT ability. If you unset the flag, then the adaptor will look for the first available dbID after 10^10 times the method_link_species_set_id. Returntype : integer Exceptions : Caller : none Status : Stable =cut sub use_autoincrement { my ($self, $value) = @_; if (defined $value) { $self->{_use_autoincrement} = $value; } return $self->{_use_autoincrement}; } 1;