my ($self, $rxrefs, $dbi) = @_;
my $count = scalar @{$rxrefs};
if($verbose) {
print "count = $count\n" || croak 'Could not print out count';
}
if ($count) {
#################
# upload new ones
##################
if ($verbose) {
print "Uploading xrefs\n"
|| croak 'Could not print string';
}
#################################################################################
# Start of sql needed to add xrefs, primary_xrefs, synonym, dependent_xrefs etc..
#################################################################################
$dbi = $self->dbi unless defined $dbi;
my $xref_sth = $dbi->prepare('INSERT INTO xref (accession,version,label,description,source_id,species_id, info_type) VALUES(?,?,?,?,?,?,?)');
my $pri_insert_sth = $dbi->prepare('INSERT INTO primary_xref VALUES(?,?,?,?)');
my $pri_update_sth = $dbi->prepare('UPDATE primary_xref SET sequence=? WHERE xref_id=?');
my $syn_sth = $dbi->prepare('INSERT IGNORE INTO synonym ( xref_id, synonym ) VALUES(?,?)');
my $xref_update_label_sth = $dbi->prepare('UPDATE xref SET label=? WHERE xref_id=?');
my $xref_update_descr_sth = $dbi->prepare('UPDATE xref SET description=? WHERE xref_id=?');
my $pair_sth = $dbi->prepare('INSERT INTO pairs VALUES(?,?,?)');
my $xref_id_sth = $dbi->prepare("SELECT xref_id FROM xref WHERE accession = ? AND source_id = ? AND species_id = ?");
my $primary_xref_id_sth = $dbi->prepare('SELECT xref_id FROM primary_xref WHERE xref_id=?');
# disable error handling here as we'll do it ourselves
# reenabled it, as errorcodes are really unhelpful
$xref_sth->{RaiseError} = 0;
$xref_sth->{PrintError} = 0;
#################################################################################
# End of sql needed to add xrefs, primary_xrefs, synonym, dependent_xrefs etc..
#################################################################################
foreach my $xref (@{$rxrefs}) {
my ($xref_id, $direct_xref_id);
if(!(defined $xref->{ACCESSION} )){
print "Your xref does not have an accession-number,so it can't be stored in the database\n"
|| croak 'Could not write message';
return;
}
########################################
# Create entry in xref table and note ID
########################################
if(! $xref_sth->execute($xref->{ACCESSION},
$xref->{VERSION} || 0,
$xref->{LABEL}|| $xref->{ACCESSION},
$xref->{DESCRIPTION},
$xref->{SOURCE_ID},
$xref->{SPECIES_ID},
$xref->{INFO_TYPE} || 'MISC')){
#
# if we failed to add the xref it must already exist so go find the xref_id for this
#
if(!(defined $xref->{SOURCE_ID})){
print "your xref: $xref->{ACCESSION} does not have a source-id\n";
return;
}
$xref_id_sth->execute(
$xref->{ACCESSION},
$xref->{SOURCE_ID},
$xref->{SPECIES_ID} );
$xref_id = ($xref_id_sth->fetchrow_array())[0];
if(defined $xref->{LABEL} ) {
$xref_update_label_sth->execute($xref->{LABEL},$xref_id) ;
}
if(defined $xref->{DESCRIPTION} ){
$xref_update_descr_sth->execute($xref->{DESCRIPTION},$xref_id);
}
}
else{
$xref_id_sth->execute(
$xref->{ACCESSION},
$xref->{SOURCE_ID},
$xref->{SPECIES_ID} );
$xref_id = ($xref_id_sth->fetchrow_array())[0];
}
foreach my $direct_xref (@{$xref->{DIRECT_XREFS}}) {
$xref_sth->execute( $xref->{ACCESSION},
$xref->{VERSION} || 0,
$xref->{LABEL} || $xref->{ACCESSION},
$xref->{DESCRIPTION},
$direct_xref->{SOURCE_ID},
$xref->{SPECIES_ID},
$direct_xref->{LINKAGE_TYPE});
$xref_id_sth->execute(
$xref->{ACCESSION},
$direct_xref->{SOURCE_ID},
$xref->{SPECIES_ID} );
$direct_xref_id = ($xref_id_sth->fetchrow_array())[0];
$self->add_direct_xref($direct_xref_id, $direct_xref->{STABLE_ID}, $direct_xref->{ENSEMBL_TYPE},$direct_xref->{LINKAGE_TYPE}, $dbi);
}
################
# Error checking
################
if(!((defined $xref_id) and $xref_id)){
print STDERR "xref_id is not set for :\n".
"$xref->{ACCESSION}\n$xref->{LABEL}\n".
"$xref->{DESCRIPTION}\n$xref->{SOURCE_ID}\n".
"$xref->{SPECIES_ID}\n";
}
#############################################################################
# create entry in primary_xref table with sequence; if this is a "cumulative"
# entry it may already exist, and require an UPDATE rather than an INSERT
#############################################################################
if(defined $xref->{SEQUENCE} ){
$primary_xref_id_sth->execute($xref_id) or croak( $dbi->errstr() );
my @row = $primary_xref_id_sth->fetchrow_array();
my $exists = $row[0];
if ( $exists ) {
$pri_update_sth->execute( $xref->{SEQUENCE}, $xref_id )
or croak( $dbi->errstr() );
} else {
$pri_insert_sth->execute( $xref_id, $xref->{SEQUENCE},
$xref->{SEQUENCE_TYPE},
$xref->{STATUS} )
or croak( $dbi->errstr() );
}
}
##########################################################
# if there are synonyms, add entries in the synonym table
##########################################################
foreach my $syn ( @{ $xref->{SYNONYMS} } ) {
$syn_sth->execute( $xref_id, $syn )
or croak( $dbi->errstr() . "\n $xref_id\n $syn\n" );
}
#######################################################################
# if there are dependent xrefs, add xrefs and dependent xrefs for them
#######################################################################
DEPENDENT_XREF:
foreach my $depref (@{$xref->{DEPENDENT_XREFS}}) {
my %dep = %{$depref};
#####################################
# Insert the xref and get its xref_id
#####################################
# print "inserting $dep{ACCESSION},$dep{VERSION},$dep{LABEL},$dep{DESCRIPTION},$dep{SOURCE_ID},${\$xref->{SPECIES_ID}}\n";
my $dep_xref_id = $self->add_xref({
'acc' => $dep{ACCESSION},
'source_id' => $dep{SOURCE_ID},
'species_id' => $xref->{SPECIES_ID},
'label' => $dep{LABEL},
'desc' => $dep{DESCRIPTION},
'version' => $dep{VERSION},
'info_type' => 'DEPENDENT',
'dbi' => $dbi,
});
if( ! $dep_xref_id ) {
next DEPENDENT_XREF;
}
#
# Add the linkage_annotation and source id it came from
#
$self->add_dependent_xref_maponly( $dep_xref_id,
$dep{LINKAGE_SOURCE_ID},
$xref_id,
$dep{LINKAGE_ANNOTATION});
#########################################################
# if there are synonyms, add entries in the synonym table
#########################################################
foreach my $syn ( @{ $dep{SYNONYMS} } ) {
$syn_sth->execute( $dep_xref_id, $syn )
or croak( $dbi->errstr() . "\n $xref_id\n $syn\n" );
} # foreach syn
} # foreach dep
#################################################
# Add the pair data. refseq dna/pep pairs usually
#################################################
if(defined $xref_id and defined $xref->{PAIR} ){
$pair_sth->execute($xref->{SOURCE_ID},$xref->{ACCESSION},$xref->{PAIR});
}
###########################
# tidy up statement handles
###########################
if(defined $xref_sth) {$xref_sth->finish()};
if(defined $pri_insert_sth) {$pri_insert_sth->finish()} ;
if(defined $pri_update_sth) {$pri_update_sth->finish()};
if(defined $syn_sth) { $syn_sth->finish()};
if(defined $xref_update_label_sth) { $xref_update_label_sth->finish()};
if(defined $xref_update_descr_sth) { $xref_update_descr_sth->finish()};
if(defined $pair_sth) { $pair_sth->finish()};
if(defined $xref_id_sth) { $xref_id_sth->finish()};
if(defined $primary_xref_id_sth) { $primary_xref_id_sth->finish()};
} # foreach xref
}
return 1;
}