src/hg/near/hgNear/go.c 1.22
1.22 2010/05/07 03:37:41 galt
using htmlEncode via new function hPrintEncodeNonBreak to protect against problems with <>;" in output, problem was recently uncovered by hgNearTest
Index: src/hg/near/hgNear/go.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/near/hgNear/go.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -b -B -U 1000000 -r1.21 -r1.22
--- src/hg/near/hgNear/go.c 3 May 2007 21:31:58 -0000 1.21
+++ src/hg/near/hgNear/go.c 7 May 2010 03:37:41 -0000 1.22
@@ -1,247 +1,247 @@
/* go - Gene Ontology stuff. */
#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "jksql.h"
#include "cart.h"
#include "hdb.h"
#include "hCommon.h"
#include "obscure.h"
#include "hgNear.h"
#include "spDb.h"
static char const rcsid[] = "$Id$";
static boolean goExists(struct column *col, struct sqlConnection *conn)
/* This returns true if go database and goaPart table exists. */
{
boolean gotIt = FALSE;
col->goConn = sqlMayConnect("go");
if (col->goConn != NULL)
{
gotIt = sqlTableExists(col->goConn, "goaPart");
}
return gotIt;
}
static char *goCellVal(struct column *col, struct genePos *gp,
struct sqlConnection *conn)
/* Get go terms as comma separated string. */
{
struct dyString *dy = dyStringNew(256);
char *result = NULL;
struct sqlResult *sr;
char **row;
char query[256];
boolean gotOne = FALSE;
struct hash *hash = newHash(6);
if (gp->protein != NULL && gp->protein[0] != 0)
{
struct sqlConnection *spConn = sqlConnect(UNIPROT_DB_NAME);
char *proteinAcc;
if (kgVersion == KG_III)
{
proteinAcc = spFindAcc(spConn, lookupProtein(conn, gp->name));
}
else
{
proteinAcc = spFindAcc(spConn, gp->protein);
}
safef(query, sizeof(query),
"select term.name from goaPart,term where goaPart.%s = '%s' and goaPart.goId = term.acc", col->goaIdColumn, proteinAcc);
sr = sqlGetResult(col->goConn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
char *name = row[0];
if (!hashLookup(hash, name))
{
hashAdd(hash, name, NULL);
gotOne = TRUE;
dyStringAppend(dy, "'");
dyStringAppend(dy, name);
dyStringAppend(dy, "'");
dyStringAppendC(dy, ',');
}
}
sqlFreeResult(&sr);
sqlDisconnect(&spConn);
}
if (gotOne)
result = cloneString(dy->string);
dyStringFree(&dy);
return result;
}
static void goCellPrint(struct column *col, struct genePos *gp,
struct sqlConnection *conn)
/* Get go terms as comma separated string. */
{
struct sqlResult *sr;
char **row;
char query[256];
boolean gotOne = FALSE;
struct hash *hash = newHash(6);
hPrintf("<TD>");
if (gp->protein != NULL && gp->protein[0] != 0)
{
struct sqlConnection *spConn = sqlConnect(UNIPROT_DB_NAME);
char *proteinAcc;
if (kgVersion == KG_III)
{
proteinAcc = spFindAcc(spConn, lookupProtein(conn, gp->name));
}
else
{
proteinAcc = spFindAcc(spConn, gp->protein);
}
safef(query, sizeof(query),
"select term.name,term.acc from goaPart,term "
"where goaPart.%s = '%s' "
"and goaPart.goId = term.acc",
col->goaIdColumn, proteinAcc);
sr = sqlGetResult(col->goConn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
char *name = row[0];
if (!hashLookup(hash, name))
{
hashAdd(hash, name, NULL);
if (!gotOne)
gotOne = TRUE;
else
hPrintf(" ");
hPrintf("'");
hPrintf("<A HREF=\"http://amigo.geneontology.org/cgi-bin/amigo/go.cgi?view=details&search_constraint=terms&depth=0&query=%s\" TARGET=_blank>", row[1]);
// hPrintf("<A HREF=\"http://www.ebi.ac.uk/ego/GSearch?query=%s&mode=id\" TARGET=_blank>", row[1]);
// hPrintf("<A HREF=\"http://www.ebi.ac.uk/ego/DisplayGoTerm?id=%s&viz=tree\" TARGET=_blank>", row[1]);
- hPrintNonBreak(row[0]);
+ hPrintEncodedNonBreak(row[0]);
hPrintf("</A>");
hPrintf("'");
}
}
sqlFreeResult(&sr);
sqlDisconnect(&spConn);
}
if (!gotOne)
hPrintf("n/a");
hPrintf("</TD>");
}
static struct genePos *goAdvFilter(struct column *col,
struct sqlConnection *conn, struct genePos *list)
/* Do advanced filter on position. */
{
char *searchString = advFilterVal(col, "terms");
if (searchString != NULL )
{
char query[256];
struct sqlResult *sr;
char **row;
boolean orLogic = advFilterOrLogic(col, "logic", FALSE);
struct slName *term, *termList = stringToSlNames(searchString);
struct hash *proteinHash = newHash(16); /* protein IDs of matching terms. */
struct hash *prevHash = NULL;
struct genePos *newList = NULL, *gp, *next;
/* First make hash of protein's of terms that match. */
for (term = termList; term != NULL; term = term->next)
{
if (startsWith("GO:", term->name))
{
safef(query, sizeof(query),
"select %s from goaPart "
"where goId = '%s'", col->goaIdColumn, term->name);
}
else
{
safef(query, sizeof(query),
"select goaPart.%s from goaPart,term "
"where term.name = '%s' and term.acc = goaPart.goId"
, col->goaIdColumn, term->name);
}
sr = sqlGetResult(col->goConn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
if (prevHash == NULL || hashLookup(prevHash, row[0]) != NULL)
{
hashStore(proteinHash, row[0]);
}
}
sqlFreeResult(&sr);
if (!orLogic)
{
hashFree(&prevHash);
if (term->next != NULL)
{
prevHash = proteinHash;
proteinHash = newHash(17);
}
}
}
/* Now whittle down list to only include those with correct protein. */
struct sqlConnection *spConn = sqlConnect(UNIPROT_DB_NAME);
for (gp = list; gp != NULL; gp = next)
{
next = gp->next;
char *proteinAcc;
if (kgVersion == KG_III)
{
proteinAcc = spFindAcc(spConn, lookupProtein(conn, gp->name));
}
else
{
proteinAcc = spFindAcc(spConn, gp->protein);
}
if (proteinAcc && hashLookup(proteinHash, proteinAcc))
{
slAddHead(&newList, gp);
}
}
sqlDisconnect(&spConn);
slReverse(&newList);
list = newList;
hashFree(&prevHash);
hashFree(&proteinHash);
slFreeList(&termList);
}
return list;
}
static void goFilterControls(struct column *col, struct sqlConnection *conn)
/* Print out controls for advanced filter. */
{
hPrintf("<A HREF=\"%s\">", "http://www.geneontology.org");
hPrintf("Gene Ontology</A> search. Enclose term in single quotes if it "
"contains multiple words.<BR>You may search with IDs (<em>e.g.</em> "
"GO:0005884) as well as terms (<em>e.g.</em> 'actin filament').<BR>");
hPrintf("Term(s): ");
advFilterRemakeTextVar(col, "terms", 35);
hPrintf(" Include if ");
advFilterAnyAllMenu(col, "logic", FALSE);
hPrintf("terms match");
}
void setupColumnGo(struct column *col, char *parameters)
/* Set up gene ontology column. */
{
col->exists = goExists;
col->cellVal = goCellVal;
col->cellPrint = goCellPrint;
col->filterControls = goFilterControls;
col->advFilter = goAdvFilter;
col->goaIdColumn = columnRequiredSetting(col, "goaIdColumn");
}