DBEntry *DBEntryAdaptor_fetchByDbID(DBEntryAdaptor *dbea, IDType dbID) { char qStr[512]; StatementHandle *sth; ResultRow *row; DBEntry *dbe = NULL; sprintf(qStr, "SELECT xref.xref_id, xref.dbprimary_acc, xref.display_label," " xref.version, xref.description," " exDB.db_name, exDB.db_release, es.synonym" " FROM (xref, external_db exDB)" " LEFT JOIN external_synonym es on es.xref_id = xref.xref_id" " WHERE xref.xref_id = " IDFMTSTR " AND xref.external_db_id = exDB.external_db_id", dbID); sth = dbea->prepare((BaseAdaptor *)dbea,qStr,strlen(qStr)); sth->execute(sth); // Why???? my %duplicate; while ((row = sth->fetchRow(sth))){ if (!row->col(row,0)) { fprintf(stderr,"WARNING: Got xref with no refID\n"); return NULL; } if (!dbe) { dbe = DBEntry_new(); DBEntry_setAdaptor(dbe,(BaseAdaptor *)dbea); DBEntry_setDbID(dbe, dbID); DBEntry_setPrimaryId(dbe, row->getStringAt(row,1)); DBEntry_setDisplayId(dbe, row->getStringAt(row,2)); DBEntry_setVersion(dbe, row->getStringAt(row,3)); DBEntry_setRelease(dbe, row->getStringAt(row,6)); DBEntry_setDbName(dbe, row->getStringAt(row,5)); if (row->col(row,4)) DBEntry_setDescription(dbe, row->getStringAt(row,4)); } if (row->col(row,7)) DBEntry_addSynonym(dbe, row->getStringAt(row,7)); } sth->finish(sth); return dbe; }
int DBEntryAdaptor_fetchAllByGene(DBEntryAdaptor *dbea, Gene *gene) { char qStr[512]; StatementHandle *sth; ResultRow *row; sprintf(qStr, "SELECT t.transcript_id, t.canonical_translation_id" " FROM transcript t" " WHERE t.gene_id = " IDFMTSTR, Gene_getDbID(gene)); sth = dbea->prepare((BaseAdaptor *)dbea,qStr,strlen(qStr)); sth->execute(sth); while ((row = sth->fetchRow(sth))) { IDType transcriptId = row->getLongLongAt(row,0); int i; Vector *transLinks; if (row->col(row,1)) { IDType translationId = row->getLongLongAt(row,1); Vector *translatLinks = DBEntryAdaptor_fetchByObjectType(dbea, translationId,"Translation"); for (i=0;i<Vector_getNumElement(translatLinks); i++) { Gene_addDBLink(gene,Vector_getElementAt(translatLinks,i)); } Vector_free(translatLinks); } transLinks = DBEntryAdaptor_fetchByObjectType(dbea, transcriptId,"Transcript"); for (i=0;i<Vector_getNumElement(transLinks); i++) { Gene_addDBLink(gene, Vector_getElementAt(transLinks,i)); } Vector_free(transLinks); } /* NIY This is wrong so I'm not going to implement it! if($gene->stable_id){ my $genelinks = $self->_fetch_by_object_type( $gene->stable_id, 'Gene' ); foreach my $genelink ( @$genelinks ) { $gene->add_DBLink( $genelink ); } } */ return 1; }
Vector *DBEntryAdaptor_fetchByObjectType(DBEntryAdaptor *dbea, IDType ensObj, char *ensType) { Vector *out; char qStr[1024]; StatementHandle *sth; ResultRow *row; IDHash *seen; if (!ensObj) { fprintf(stderr,"Error: Can't fetchByObjectType without an object\n"); exit(1); } if (!ensType) { fprintf(stderr,"Error: Can't fetchByObjectType without a type\n"); exit(1); } // Not sure if idt identities are right way round sprintf(qStr, "SELECT xref.xref_id, xref.dbprimary_acc, xref.display_label, xref.version," " xref.description," " exDB.db_name, exDB.db_release, exDB.status," " oxr.object_xref_id," " es.synonym," " idt.xref_identity, idt.ensembl_identity" " FROM (external_db exDB, object_xref oxr, xref xref)" " LEFT JOIN external_synonym es on es.xref_id = xref.xref_id" " LEFT JOIN identity_xref idt on idt.object_xref_id = oxr.object_xref_id" " WHERE xref.xref_id = oxr.xref_id" " AND xref.external_db_id = exDB.external_db_id" " AND oxr.ensembl_id = " IDFMTSTR " AND oxr.ensembl_object_type = '%s'", ensObj, ensType); sth = dbea->prepare((BaseAdaptor *)dbea,qStr,strlen(qStr)); sth->execute(sth); seen = IDHash_new(IDHASH_SMALL); out = Vector_new(); while ((row = sth->fetchRow(sth))) { DBEntry *exDB; IDType refID = row->getLongLongAt(row,0); // using an outer join on the synonyms as well as on identity_xref, we // now have to filter out the duplicates (see v.1.18 for // original). Since there is at most one identity_xref row per xref, // this is easy enough; all the 'extra' bits are synonyms if (!IDHash_contains(seen,refID)) { exDB = DBEntry_new(); DBEntry_setAdaptor(exDB,(BaseAdaptor *)dbea); DBEntry_setDbID(exDB, refID); DBEntry_setPrimaryId(exDB, row->getStringAt(row,1)); DBEntry_setDisplayId(exDB, row->getStringAt(row,2)); DBEntry_setVersion(exDB, row->getStringAt(row,3)); DBEntry_setDbName(exDB, row->getStringAt(row,5)); DBEntry_setRelease(exDB, row->getStringAt(row,6)); if (row->col(row,10)) { IdentityXref *idx = IdentityXref_new(); DBEntry_setIdentityXref(exDB,idx); IdentityXref_setQueryIdentity(idx, row->getDoubleAt(row,10)); IdentityXref_setTargetIdentity(idx, row->getDoubleAt(row,11)); } if (row->col(row,4)) DBEntry_setDescription(exDB, row->getStringAt(row,4)); if (row->col(row,7)) DBEntry_setStatus(exDB, row->getStringAt(row,7)); Vector_addElement(out, exDB); IDHash_add(seen, refID, exDB); } exDB = IDHash_getValue(seen, refID); if (row->col(row,9)) { DBEntry_addSynonym(exDB,row->getStringAt(row,9)); } } IDHash_free(seen, NULL); sth->finish(sth); return out; }