108ce8a6eca325ddc6e949e271e262e91b596fd9
tdreszer
Mon Nov 22 12:02:43 2010 -0800
Made freeText search instead of drop downs for track search advanced when cv.ra reports 'searchable freeText'. This is useful for labVersion among others.
diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c
index cbca1f8..af5afac 100644
--- src/hg/hgApi/hgApi.c
+++ src/hg/hgApi/hgApi.c
@@ -103,55 +103,122 @@
fail("Missing var parameter");
struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, TRUE, FALSE); // Tables not files
struct slPair *pair;
dyStringPrintf(output, "[\n");
for (pair = pairs; pair != NULL; pair = pair->next)
{
if(pair != pairs)
dyStringPrintf(output, ",\n");
dyStringPrintf(output, "['%s','%s']", javaScriptLiteralEncode(pair->name), javaScriptLiteralEncode(pair->val));
}
dyStringPrintf(output, "\n]\n");
}
else
fail("Assembly does not support metaDb");
}
+#ifdef CV_SEARCH_SUPPORTS_FREETEXT
+// TODO: move to lib since hgTracks and hgApi share
+#define METADATA_VALUE_PREFIX "hgt_mdbVal"
+else if(startsWith(METADATA_VALUE_PREFIX, cmd))
+ {
+ // Returns metaDb value control: drop down or free text, with or without help link.
+ // e.g. http://genome.ucsc.edu/hgApi?db=hg18&cmd=hgt_mdbVal3&var=cell
+
+ // TODO: Move guts to lib, so that hgTracks::searchTracks.c and hgApi.c can share
+
+ struct sqlConnection *conn = hAllocConn(database);
+ boolean metaDbExists = sqlTableExists(conn, "metaDb");
+ if(metaDbExists)
+ {
+ char *var = cgiOptionalString("var");
+ if(var)
+ var = sqlEscapeString(var);
+ else
+ fail("Missing var parameter");
+
+ int ix = atoi(cmd+strlen(METADATA_VALUE_PREFIX)); // 1 based index
+ if(ix == 0) //
+ fail("Unsupported 'cmd' parameter");
+
+ enum mdbCvSearchable searchBy = mdbCvSearchMethod(var);
+ if (searchBy == cvsSearchBySingleSelect)
+ {
+ dyStringPrintf(output,"\n");
+ }
+ else if (searchBy == cvsSearchByFreeText)
+ {
+ dyStringPrintf(output,"",
+ METADATA_VALUE_PREFIX, ix);
+ }
+ //else if (searchBy == cvsSearchByMultiSelect)
+ // {
+ // // TO BE IMPLEMENTED
+ // }
+ //else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByDateRange)
+ // {
+ // // TO BE IMPLEMENTED
+ // }
+ else
+ fail("Metadata variable not searchable");
+ }
+ else
+ fail("Assembly does not support metaDb");
+ }
+#endif///def CV_SEARCH_SUPPORTS_FREETEXT
else if(!strcmp(cmd, "tableMetadata"))
{ // returns an html table with metadata for a given track
char *trackName = cgiOptionalString("track");
boolean showLonglabel = (NULL != cgiOptionalString("showLonglabel"));
boolean showShortLabel = (NULL != cgiOptionalString("showShortLabel"));
if (trackName != NULL)
{
struct trackDb *tdb = hTrackDbForTrack(database, trackName);
if (tdb != NULL)
{
char * html = metadataAsHtmlTable(database,tdb,showLonglabel,showShortLabel,NULL);
if (html)
{
dyStringAppend(output,html);
freeMem(html);
}
else
dyStringPrintf(output,"No metadata found for track %s.",trackName);
}
else
dyStringPrintf(output,"Track %s not found",trackName);
}
else
dyStringAppend(output,"No track variable found");
}
else
+ {
+ warn("unknwon cmd: %s",cmd);
fail("Unsupported 'cmd' parameter");
+ }
// It's debatable whether the type should be text/plain, text/javascript or application/javascript; I think
// any of the types containing "javascript" don't work with IE6, so I'm using text/plain
puts("Content-Type:text/javascript\n");
//puts("\n");
if(jsonp)
printf("%s(%s)", jsonp, dyStringContents(output));
else
puts(dyStringContents(output));
return 0;
}