Raw content of Bio::EnsEMBL::Compara::DBSQL::BaseRelationAdaptor package Bio::EnsEMBL::Compara::DBSQL::BaseRelationAdaptor; use strict; use Bio::EnsEMBL::Utils::Exception; use Bio::EnsEMBL::DBSQL::BaseAdaptor; our @ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor); =head2 generic_fetch Arg [1] : (optional) string $constraint An SQL query constraint (i.e. part of the WHERE clause) e.g. "fm.family_id = $family_id" Arg [2] : (optional) arrayref $join the arrayref $join should contain arrayrefs of this form [['family_member', 'fm'], # the table to join with synonym (mandatory) as an arrayref 'm.member_id = fm.member_id', # the join condition (mandatory) [qw(fm.family_id fm.member_id fm.cigar_line)]] # any additional columns that the join could imply (optional) # as an arrayref Example : $arrayref = $a->generic_fetch($constraint, $join); Description: Performs a database fetch and returns BaseRelation-inherited objects Returntype : arrayref of Bio::EnsEMBL::Compara::BaseRelation-inherited objects Exceptions : none Caller : Bio::EnsEMBL::Compara::DBSQL::BaseRelationAdaptor::generic_fetch_sth =cut sub generic_fetch { my ($self, $constraint, $join) = @_; my $sth = $self->generic_fetch_sth($constraint, $join); return $self->_objs_from_sth($sth); } =head2 generic_fetch_sth Arg [1] : (optional) string $constraint An SQL query constraint (i.e. part of the WHERE clause) e.g. "fm.family_id = $family_id" Arg [2] : (optional) arrayref $join the arrayref $join should contain arrayrefs of this form [['family_member', 'fm'], # the table to join with synonym (mandatory) as an arrayref 'm.member_id = fm.member_id', # the join condition (mandatory) [qw(fm.family_id fm.member_id fm.cigar_line)]] # any additional columns that the join could imply (optional) # as an arrayref Example : $sth = $a->generic_fetch_sth($constraint, $join); Description: Performs a database fetch and returns the SQL state handle Returntype : DBI::st Exceptions : none Caller : BaseFeatureAdaptor, ProxyDnaAlignFeatureAdaptor::generic_fetch =cut sub generic_fetch_sth { 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); # warn $sql; $sth->execute; return $sth; } sub fetch_all { my $self = shift; return $self->generic_fetch(); } sub list_dbIDs { my $self = shift; my @tables = $self->_tables; my ($name, $syn) = @{$tables[0]}; my $sql = "SELECT ${syn}.${name}_id from ${name} ${syn}"; my $sth = $self->prepare($sql); $sth->execute; my $internal_id; $sth->bind_columns(\$internal_id); my @internal_ids; while ($sth->fetch()) { push @internal_ids, $internal_id; } $sth->finish; return \@internal_ids; } =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::SeqFeature Exceptions : thrown if $id is not defined Caller : general =cut sub fetch_by_dbID{ my ($self,$id) = @_; unless(defined $id) { $self->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_stable_id Arg [1] : string $stable_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::SeqFeature Exceptions : thrown if $id is not defined Caller : general =cut sub fetch_by_stable_id { my ($self,$stable_id) = @_; unless(defined $stable_id) { $self->throw("fetch_by_stable_id must have an stable_id"); } my @tabs = $self->_tables; my ($name, $syn) = @{$tabs[0]}; #construct a constraint like 't1.table1_id = 1' my $constraint = "${syn}.stable_id = '$stable_id'"; #return first element of _generic_fetch list my ($obj) = @{$self->generic_fetch($constraint)}; return $obj; } =head2 fetch_by_source =cut sub fetch_by_source { my ($self,$source_name) = @_; deprecate("Calling $self->fetch_all_by_method_link_type instead\n"); return $self->fetch_all_by_method_link_type($source_name); } sub fetch_all_by_method_link_type { my ($self,$method_link_type) = @_; $self->throw("method_link_type arg is required\n") unless ($method_link_type); my $mlss_arrayref = $self->db->get_MethodLinkSpeciesSetAdaptor->fetch_all_by_method_link_type($method_link_type); unless (scalar @{$mlss_arrayref}) { warning("There is no $method_link_type data stored in the database\n"); return []; } my $constraint = ""; if ($self->isa('Bio::EnsEMBL::Compara::Homology')) { $constraint .= " h.method_link_species_set_id in (". join (",", (map {$_->dbID} @{$mlss_arrayref})) . ")"; } elsif ($self->isa('Bio::EnsEMBL::Compara::Family')) { $constraint .= " f.method_link_species_set_id in (". join (",", (map {$_->dbID} @{$mlss_arrayref})) . ")"; } elsif ($self->isa('Bio::EnsEMBL::Compara::Domain')) { $constraint .= " d.method_link_species_set_id in (". join (",", (map {$_->dbID} @{$mlss_arrayref})) . ")"; } return $self->generic_fetch($constraint); } sub store_source { my ($self,$source_name) = @_; deprecate("store_source method is deprecated. Now this data has to be pre-stored in method_link table\n"); } sub store_relation { my ($self, $member_attribute, $relation) = @_; my ($member, $attribute) = @{$member_attribute}; my $member_adaptor = $self->db->get_MemberAdaptor; unless (defined $member->dbID) { $member_adaptor->store($member); } $attribute->member_id($member->dbID); my $sql; my $sth; if ($relation->isa('Bio::EnsEMBL::Compara::Family')) { $attribute->family_id($relation->dbID); $sql = "INSERT IGNORE INTO family_member (family_id, member_id, cigar_line) VALUES (?,?,?)"; $sth = $self->prepare($sql); $sth->execute($attribute->family_id, $attribute->member_id, $attribute->cigar_line); } elsif ($relation->isa('Bio::EnsEMBL::Compara::Domain')) { $attribute->domain_id($relation->dbID); $sql = "INSERT IGNORE INTO domain_member (domain_id, member_id, member_start, member_end) VALUES (?,?,?,?)"; $sth = $self->prepare($sql); $sth->execute($attribute->domain_id, $attribute->member_id, $attribute->member_start, $attribute->member_end); } elsif ($relation->isa('Bio::EnsEMBL::Compara::Homology')) { $attribute->homology_id($relation->dbID); # $sql = "INSERT IGNORE INTO homology_member (homology_id, member_id, peptide_member_id, cigar_line, cigar_start, cigar_end, perc_cov, perc_id, perc_pos, peptide_align_feature_id) VALUES (?,?,?,?,?,?,?,?,?,?)"; $sql = "INSERT IGNORE INTO homology_member (homology_id, member_id, peptide_member_id, cigar_line, cigar_start, cigar_end, perc_cov, perc_id, perc_pos) VALUES (?,?,?,?,?,?,?,?,?)"; $sth = $self->prepare($sql); # $sth->execute($attribute->homology_id, $attribute->member_id, $attribute->peptide_member_id, $attribute->cigar_line, $attribute->cigar_start, $attribute->cigar_end, $attribute->perc_cov, $attribute->perc_id, $attribute->perc_pos, $attribute->peptide_align_feature_id); $sth->execute($attribute->homology_id, $attribute->member_id, $attribute->peptide_member_id, $attribute->cigar_line, $attribute->cigar_start, $attribute->cigar_end, $attribute->perc_cov, $attribute->perc_id, $attribute->perc_pos); } } sub update_relation { my ($self, $member_attribute) = @_; my ($member, $attribute) = @{$member_attribute}; my $sql; my $sth; if (defined $attribute->family_id) { $sql = "UPDATE family_member SET cigar_line = ? WHERE family_id = ? AND member_id = ?"; $sth = $self->prepare($sql); $sth->execute($attribute->cigar_line, $attribute->family_id, $attribute->member_id); } else { $self->throw("update_relation only implemented for family relation, but you have either a domain or homology relation\n"); } } =head2 _tables Args : none Example : $tablename = $self->_table_name() Description: ABSTRACT PROTECTED Subclasses are responsible for implementing this method. It should list of [tablename, alias] pairs. Additionally the primary table (with the dbID, analysis_id, and score) should be the first table in the list. e.g: ( ['repeat_feature', 'rf'], ['repeat_consensus', 'rc']); used to obtain features. Returntype : list of [tablename, alias] pairs Exceptions : thrown if not implemented by subclass Caller : BaseFeatureAdaptor::generic_fetch =cut sub _tables { my $self = shift; $self->throw("abstract method _tables not defined by implementing" . " subclass of BaseFeatureAdaptor"); return undef; } =head2 _columns Args : none Example : $tablename = $self->_columns() Description: ABSTRACT PROTECTED Subclasses are responsible for implementing this method. It should return a list of columns to be used for feature creation Returntype : list of strings Exceptions : thrown if not implemented by subclass Caller : BaseFeatureAdaptor::generic_fetch =cut sub _columns { my $self = shift; $self->throw("abstract method _columns not defined by implementing" . " subclass of BaseFeatureAdaptor"); } =head2 _objs_from_sth Arg [1] : DBI::row_hashref $hashref containing key-value pairs for each of the columns specified by the _columns method Example : my @feats = $self->_obj_from_hashref Description: ABSTRACT PROTECTED The subclass is responsible for implementing this method. It should take in a DBI row hash reference and return a list of created features in contig coordinates. Returntype : list of Bio::EnsEMBL::*Features in contig coordinates Exceptions : thrown if not implemented by subclass Caller : BaseFeatureAdaptor::generic_fetch =cut sub _objs_from_sth { my $self = shift; $self->throw("abstract method _obj_from_sth not defined by implementing" . " subclass of BaseFeatureAdaptor"); } =head2 _join Arg [1] : none Example : none Description: Can be overridden by a subclass to specify any left joins which should occur. The table name specigfied in the join must still be present in the return values of Returntype : a {'tablename' => 'join condition'} pair Exceptions : none Caller : general =cut sub _join { my $self = shift; return ''; } =head2 _default_where_clause Arg [1] : none Example : none Description: May be overridden to provide an additional where constraint to the SQL query which is generated to fetch feature records. This constraint is always appended to the end of the generated where clause Returntype : string Exceptions : none Caller : generic_fetch =cut sub _default_where_clause { my $self = shift; return ''; } =head2 _final_clause Arg [1] : none Example : none Description: May be overriden to provide an additional clause to the end of the SQL query used to fetch feature records. This is useful to add a required ORDER BY clause to the query for example. Returntype : string Exceptions : none Caller : generic_fetch =cut sub _final_clause { my $self = shift; return ''; } # DEPRECATED METHODS #################### sub _known_sources { my ($self) = @_; deprecate("_know_sources method is deprecated.\n"); } sub get_source_id_by_source_name { my ($self, $source_name) = @_; throw("get_source_id_by_source_name method is deprecated\n"); } sub get_source_name_by_source_id { my ($self, $source_id) = @_; throw("get_source_name_by_source_id method is deprecated\n"); } sub list_internal_ids { my $self = shift; deprecate("list_internal_ids is deprecated. Calling list_dbIDs instead.\n"); return $self->list_dbIDs; } 1;