Bio-EnsEMBL

 view release on metacpan or  search on metacpan

lib/Bio/EnsEMBL/DBSQL/DBEntryAdaptor.pm  view on Meta::CPAN

  if ( defined($ensID) ) {
    if ( $ensID =~ /^\d+$/ ) {
      $ensembl_id = $ensID;
    } elsif (    ref($ensID) eq 'Bio::EnsEMBL::Gene'
              or ref($ensID) eq 'Bio::EnsEMBL::Transcript'
              or ref($ensID) eq 'Bio::EnsEMBL::Translation' 
              or ref($ensID) eq 'Bio::EnsEMBL::OperonTranscript'
              or ref($ensID) eq 'Bio::EnsEMBL::Operon' 
              )
    {
      warning(   "You should pass DBEntryAdaptor->store() "
               . "a dbID rather than an ensembl object "
               . "to store the xref on" );

      if ( defined( $ensID->dbID() ) ) {
        $ensembl_id = $ensID->dbID();
      } else {
        throw( sprintf( "%s %s doesn't have a dbID, can't store xref",
                        $ensType, $ensID->display_id() ) );
      }
    } else {
      throw("Invalid dbID passed to DBEntryAdaptor->store()");
    }
  }
  
  
  
    # Ensure external_db contains a record of the intended xref source
    my $dbRef;
    $dbRef = $self->_check_external_db($dbEntry,$ignore_release);

    # Attempt to insert DBEntry
    my $xref_id = $self->_store_or_fetch_xref($dbEntry,$dbRef);
    $dbEntry->dbID($xref_id); #keeps DBEntry in sync with database
    ### Attempt to create an object->xref mapping
    my $object_xref_id;
    if ($ensembl_id) { $object_xref_id = $self->_store_object_xref_mapping($ensembl_id,$dbEntry,$ensType, $ignore_release)};

    if (defined $master_xref && defined $object_xref_id) { $self->_store_dependent_xref_mapping($object_xref_id, $dbEntry, $master_xref); }
    
    return $xref_id;
}




=head2 update

  Arg [1]    : Bio::EnsEMBL::DBEntry $dbentry
               The dbentry to update
  Example    : $dbentry_adaptor->update($dbentry);
  Description: Updates the dbprimary_acc, display_label, version, description, info_type
               and info_text of a dbentry in the database.
  Returntype : None
  Exceptions : thrown if the $dbentry is not a Bio::EnsEMBL::DBEntry
  Caller     : general
  Status     : Stable

=cut

sub update {
  my ($self, $dbEntry) = @_;

  if (!defined $dbEntry || !ref $dbEntry || !$dbEntry->isa('Bio::EnsEMBL::DBEntry')) {
    throw("Must update a dbentry object, not a $dbEntry");
  }

  my $update_dbentry_sql = qq(
     UPDATE xref
        SET dbprimary_acc = ?,
            display_label = ?,
            version = ?,
            description = ?,
            external_db_id = ?,
            info_type = ?,
            info_text = ?
      WHERE xref_id = ?
  );

  my $dbRef = $self->_check_external_db($dbEntry);
  my $display_id = $dbEntry->display_id;
  $display_id = '' unless defined $display_id; # SQLite doesn't ignore NOT NULL errors

  my $sth = $self->prepare($update_dbentry_sql);

  $sth->bind_param(1, $dbEntry->primary_id,SQL_VARCHAR);
  $sth->bind_param(2, $display_id,SQL_VARCHAR);
  $sth->bind_param(3, ($dbEntry->version || q{0}),SQL_VARCHAR);
  $sth->bind_param(4, $dbEntry->description,SQL_VARCHAR);
  $sth->bind_param(5, $dbRef,SQL_INTEGER);
  $sth->bind_param(6, ($dbEntry->info_type || 'NONE'), SQL_VARCHAR);
  $sth->bind_param(7, ($dbEntry->info_text || ''), SQL_VARCHAR);

  $sth->bind_param(8, $dbEntry->dbID(), SQL_INTEGER);

  $sth->execute();

} ## end sub update
    
sub _store_object_xref_mapping {
    my $self = shift;
    my $ensembl_id = shift;
    my $dbEntry = shift;
    my $ensembl_type = shift;
    my $ignore_release = shift;
    
    my $dbc = $self->dbc();
    my $sql_helper = $dbc->sql_helper();
    
    if (not defined ($ensembl_type)) { warning("No Ensembl data type provided for new xref");}
    
    my $analysis_id;
    if ( $dbEntry->analysis() ) {
        $analysis_id = $self->db()->get_AnalysisAdaptor->store( $dbEntry->analysis() );
    }
    
    my $insert_ignore = $self->insert_ignore_clause();
    my $insert_params = [
      [$dbEntry->dbID(),              SQL_INTEGER],
      [$ensembl_type,                 SQL_VARCHAR],
      [$ensembl_id,                   SQL_INTEGER],
      [$dbEntry->linkage_annotation(),SQL_VARCHAR],
      [$analysis_id,                  SQL_INTEGER],
    ];
    my $base_object_xref_insert_sql = qq(
      ${insert_ignore} INTO object_xref
            ( xref_id,
              ensembl_object_type,
              ensembl_id,
              linkage_annotation,
              analysis_id )
        VALUES ( ?, ?, ?, ?, ? )
    );
    
    my $object_xref_id;
    
    #If MySQL we can optimise into a single insert query to deal with object_xref_id retrieval on insert ignore
    if($dbc->driver() eq 'mysql') {
      my $sql = $base_object_xref_insert_sql.'ON DUPLICATE KEY UPDATE object_xref_id=LAST_INSERT_ID(object_xref_id)';
      $sql_helper->execute_update(-SQL => $sql, -PARAMS => $insert_params);
      $object_xref_id = $self->last_insert_id('object_xref_id', undef, 'object_xref');
    }
    #Otherwise we attempt & retrieve on failure
    else {
      my $updated_rows = $sql_helper->execute_update(-SQL => $base_object_xref_insert_sql, -PARAMS => $insert_params);
      if($updated_rows == 1) {
        $object_xref_id = $self->last_insert_id('object_xref_id', undef, 'object_xref');
      }
      else {
        my $sql = 'select object_xref_id from object_xref where xref_id =? and ensembl_object_type =? and ensembl_id =?';
        my $params = [
          [$dbEntry->dbID(),  SQL_INTEGER],
          [$ensembl_type,     SQL_VARCHAR],
          [$ensembl_id,       SQL_INTEGER],
        ];
        $object_xref_id = $sql_helper->execute_single_result(-SQL => $sql, -PARAMS => $params);
      }
    }



( run in 0.847 second using v1.01-cache-2.11-cpan-f56aa216473 )