diff --git a/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm index c9599f5fc606596ac5a8dbfca7f1d393f5d50003..b1feb498169e80cd591ba9ce2b6685a954f306a2 100644 --- a/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm +++ b/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm @@ -90,10 +90,11 @@ sub _tables { sub _columns { my $self = shift; - return qw( g.gene_id g.seq_region_id g.seq_region_start g.seq_region_end - g.seq_region_strand g.analysis_id g.type g.display_xref_id - gd.description gsi.stable_id gsi.version x.display_label - exdb.db_name exdb.status ); + return qw( g.gene_id g.seq_region_id g.seq_region_start g.seq_region_end + g.seq_region_strand g.analysis_id g.type g.display_xref_id + gd.description gsi.stable_id gsi.version x.display_label + x.dbprimary_acc x.description x.version exdb.db_name exdb.status + exdb.release ); } @@ -595,7 +596,7 @@ sub store { return $gene->dbID(); } - #force lazy-loading of transcripts and exons, and ensure coords are correct + # ensure coords are correct before storing $gene->recalculate_coordinates(); my $analysis = $gene->analysis(); @@ -692,23 +693,32 @@ sub store { $transcript_adaptor->store($t,$gene_dbID ); } + # update gene to point to display xref if it is set + if(my $display_xref = $gene->display_xref) { + my $dxref_id; - # if a display_xref is defined store it as well. This requires an - # update to the gene table and could not have been done at the time - # the gene was stored because the gene needed to be stored to store - # the xrefs and get the display xref id. A bit of a catch22. - my $display_xref = $gene->display_xref; - if($display_xref) { - if(!$display_xref->is_stored($db)) { - # This should be stored already b/c it should at least - # be associated with one of the transcripts or translations. - # We'll allow this though because it could be desired behaviour. - $dbEntryAdaptor->store($display_xref, $gene_dbID, "Gene"); + if($display_xref->is_stored($db)) { + $dxref_id = $display_xref->dbID(); + } else { + $dxref_id = $dbEntryAdaptor->exists($display_xref); + } + + if(defined($dxref_id)) { + $sth = $self->prepare + ("UPDATE gene SET display_xref_id = ? WHERE gene_id = ?"); + $sth->execute($dxref_id, $gene_dbID); + $sth->finish(); + $display_xref->dbID($dxref_id); + $display_xref->adaptor($dbEntryAdaptor); + $display_xref->dbID($dxref_id); + $display_xref->adaptor($dbEntryAdaptor); + } else { + warning("Display_xref ".$display_xref->dbname().":". + $display_xref->display_id() . " is not stored in database.\n". + "Not storing relationship to this gene."); + $display_xref->dbID(undef); + $display_xref->adaptor(undef); } - $sth = $self->prepare - ("UPDATE gene SET display_xref_id = ? WHERE gene_id = ?"); - $sth->execute($display_xref->dbID(), $gene_dbID); - $sth->finish(); } # set the adaptor and dbID on the original passed in gene not the @@ -716,7 +726,7 @@ sub store { $original->adaptor( $self ); $original->dbID( $gene_dbID ); - return $gene_dbID; + return $gene_dbID; } @@ -951,13 +961,16 @@ sub _objs_from_sth { my ( $gene_id, $seq_region_id, $seq_region_start, $seq_region_end, $seq_region_strand, $analysis_id, $type, $display_xref_id, - $gene_description, $stable_id, $version, $external_name, $external_db, - $external_status ); + $gene_description, $stable_id, $version, $xref_display_id, + $xref_primary_acc, $xref_desc, $xref_version, $external_name, + $external_db, $external_status, $external_release ); - $sth->bind_columns( \$gene_id, \$seq_region_id, \$seq_region_start, - \$seq_region_end, \$seq_region_strand, \$analysis_id, \$type, - \$display_xref_id, \$gene_description, \$stable_id, \$version, - \$external_name, \$external_db, \$external_status ); + $sth->bind_columns( \$gene_id, \$seq_region_id, \$seq_region_start, + \$seq_region_end, \$seq_region_strand, \$analysis_id, \$type, + \$display_xref_id, \$gene_description, \$stable_id, \$version, + \$xref_display_id, \$xref_primary_acc, \$xref_desc, \$xref_version, + \$external_db, \$external_status, + \$external_release ); my $asm_cs; my $cmp_cs; @@ -1048,7 +1061,7 @@ sub _objs_from_sth { next FEATURE; } } - + $slice = $dest_slice; } @@ -1058,7 +1071,11 @@ sub _objs_from_sth { $display_xref = Bio::EnsEMBL::DBEntry->new_fast ({ 'dbID' => $display_xref_id, 'adaptor' => $dbEntryAdaptor, - 'display_id' => $external_name, + 'display_id' => $xref_display_id, + 'primary_id' => $xref_primary_acc, + 'version' => $xref_version, + 'description' => $xref_desc, + 'release' => $external_release, 'dbname' => $external_db }); $display_xref->status( $external_status );