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; }