src/hg/instinct/bioInt2/bioIntUI.c 1.20
1.20 2009/04/27 22:29:08 jsanborn
fixed gene drill down issues
Index: src/hg/instinct/bioInt2/bioIntUI.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/instinct/bioInt2/bioIntUI.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -b -B -U 4 -r1.19 -r1.20
--- src/hg/instinct/bioInt2/bioIntUI.c 27 Apr 2009 22:05:48 -0000 1.19
+++ src/hg/instinct/bioInt2/bioIntUI.c 27 Apr 2009 22:29:08 -0000 1.20
@@ -160,8 +160,48 @@
return genesetsLoadByQuery(conn, query);
}
+char *getDataTypeById(struct sqlConnection *conn, int id)
+{
+char query[256];
+safef(query, sizeof(query),
+ "select name from %s where id = %d ",
+ DT_TABLE, id);
+
+return sqlQuickString(conn, query);
+}
+
+struct samples *getOverlappingSamples(struct sqlConnection *conn,
+ struct datasets *daList)
+{
+struct dyString *dy = dyStringNew(100);
+int count = 1;
+dyStringPrintf(dy, "select * from %s as t%d ", SA_TABLE, count);
+count++;
+
+struct datasets *da = daList->next;
+for (da = daList; da; da = da->next)
+ {
+ dyStringPrintf(dy,
+ "join %s as t%d on t1.id = t%d.id ",
+ SA_TABLE, count, count);
+ count++;
+ }
+count = 1;
+dyStringPrintf(dy, "where ");
+for (da = daList; da; da = da->next)
+ {
+ dyStringPrintf(dy, "t%d.dataset_id=%d ", count, da->id);
+ if (da->next)
+ dyStringPrintf(dy, "and ");
+ count++;
+ }
+char *query = dyStringCannibalize(&dy);
+return samplesLoadByQuery(conn, query);
+}
+
+
void setAnalysisFeatureDesc(struct sqlConnection *conn, struct json *js,
struct analysisFeatures *af)
{
char *desc = getFieldFromKgXref(conn, af->feature_name, "description");
@@ -381,24 +421,37 @@
jsonAddString(js, sp->name, sp->type);
}
void sendRawFeatureData(struct sqlConnection *conn, struct json *js,
- struct datasets *da, struct analysisFeatures *af)
+ struct datasets *da, struct samples *saList,
+ struct analysisFeatures *af)
{
-char query[512];
-safef(query, sizeof(query),
+struct samples *sa;
+struct dyString *dy = dyStringNew(100);
+
+dyStringPrintf(dy,
"select DISTINCT %s.name, %s.conf from %s join %s on %s.sample_id = %s.id "
- "where %s.feature_id = %d;",
+ "where %s.feature_id = %d and %s.id in (",
SA_TABLE, da->data_table, da->data_table, SA_TABLE, da->data_table, SA_TABLE,
- da->data_table, af->id);
+ da->data_table, af->id, SA_TABLE);
+
+for (sa = saList; sa; sa = sa->next)
+ {
+ dyStringPrintf(dy, "%d", sa->id);
+ if (sa->next)
+ dyStringPrintf(dy, ",");
+ }
+
+dyStringPrintf(dy, ");");
+char *query = dyStringCannibalize(&dy);
+
if (!sqlExists(conn, query))
return;
-struct json *data = jsonAddContainer(js, "data");
-
-setAnalysisFeatureDesc(conn, data, af);
-setAnalysisFeatureLink(conn, data, af); // e.g. 'hgg_gene' = kgId
+setAnalysisFeatureDesc(conn, js, af);
+setAnalysisFeatureLink(conn, js, af); // e.g. 'hgg_gene' = kgId
+struct json *data = jsonAddContainer(js, "data");
struct sqlResult *sr = sqlGetResult(conn, query);
char **row = NULL;
while ((row = sqlNextRow(sr)) != NULL)
{
@@ -418,17 +471,16 @@
hFreeConn(&conn);
errAbort("No datasets with cohort_id = %d.\n", cohort_id);
}
-int count = 0;
-char name[256];
+struct samples *samples = getOverlappingSamples(conn, daList);
+
struct json *js = newJson();
for (da = daList; da; da = da->next)
{
- safef(name, sizeof(name), "%s-%d", af->feature_name, count);
- struct json *container = jsonAddContainer(js, name);
- sendRawFeatureData(conn, container, da, af);
- count++;
+ char *dataType = getDataTypeById(conn, da->type_id);
+ struct json *container = jsonAddContainer(js, dataType);
+ sendRawFeatureData(conn, container, da, samples, af);
}
if (js)
hPrintf("%s", js->print(js));
@@ -479,36 +531,8 @@
}
sqlFreeResult(&sr);
}
-struct samples *getOverlappingSamples(struct sqlConnection *conn,
- struct datasets *daList)
-{
-struct dyString *dy = dyStringNew(100);
-int count = 1;
-dyStringPrintf(dy, "select * from %s as t%d ", SA_TABLE, count);
-count++;
-
-struct datasets *da = daList->next;
-for (da = daList; da; da = da->next)
- {
- dyStringPrintf(dy,
- "join %s as t%d on t1.id = t%d.id ",
- SA_TABLE, count, count);
- count++;
- }
-count = 1;
-dyStringPrintf(dy, "where ");
-for (da = daList; da; da = da->next)
- {
- dyStringPrintf(dy, "t%d.dataset_id=%d ", count, da->id);
- if (da->next)
- dyStringPrintf(dy, "and ");
- count++;
- }
-char *query = dyStringCannibalize(&dy);
-return samplesLoadByQuery(conn, query);
-}
void sendClinicalData(struct sqlConnection *conn, struct json *js,
int cohort_id, char *feature_name, struct datasets *daList)
{