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)
 {