fa519f2e8a19fe048a3143c1a0d0ee3a54457b48 tdreszer Wed Aug 25 14:03:37 2010 -0700 Created a preliminary white list for mdb vars diff --git src/hg/hgTracks/searchTracks.c src/hg/hgTracks/searchTracks.c index 0ce6327..8ecf681 100644 --- src/hg/hgTracks/searchTracks.c +++ src/hg/hgTracks/searchTracks.c @@ -154,31 +154,102 @@ return retVal; } -static int metaDbVars(struct sqlConnection *conn, char *** metaValues) +static int metaDbVars(struct sqlConnection *conn, char *** metaVars, char *** metaLabels) // Search the assemblies metaDb table; If name == NULL, we search every metadata field. { char query[256]; +#define WHITE_LIST_COUNT 30 +#ifdef WHITE_LIST_COUNT +#define WHITE_LIST_VAR 0 +#define WHITE_LIST_LABEL 1 +char *whiteList[WHITE_LIST_COUNT][2] = { + {"age", "Age of experimental organism"}, + {"accession", "Accession - external"}, + {"antibody", "Antibody - targetting protein"}, + {"cell", "Cell Line"}, + {"localization", "Cell compartment"}, + {"control", "Control or Input for ChIPseq"}, +// {"controlId", "ControlId - explicit relationship"}, + {"dataType", "Experiment type"}, + {"dataVersion", "ENCODE release"}, +// {"fragLength", "Fragment Length for ChIPseq"}, +// {"freezeDate", "Gencode freeze date"}, +// {"level", "Gencode level"}, +// {"annotation", "Gencode annotation"}, + {"lab", "Lab producing data"}, + {"labVersion", "Lab specific details"}, + {"labExpId", "Lab specific identifier"}, + {"softwareVersion", "Lab specific informatics"}, + {"mapAlgorithm", "Mapping algorithm"}, + {"grant", "Priniple Investigator"}, + {"readType", "Paired/Single reads lengths"}, + {"replicate", "Replicate number"}, + {"restrictionEnzyme","Restriction Enzyme used"}, + {"ripAntibody", "RIP Antibody"}, + {"ripTgtProtein", "RIP Target Protein"}, + {"rnaExtract", "RNA Extract"}, + {"setType", "Experiment or Input"}, + {"sex", "Sex of organism"}, + {"strain", "Strain of organism"}, + {"treatment", "Treatment"}, + {"view", "View - Peaks or Signals"}, +}; +// FIXME: The whitelist should be a table or ra +// FIXME: The whitelist should be in list order +// FIXME: Should read in list, then verify that an mdb val exists. + +char **retVar = needMem(sizeof(char *) * WHITE_LIST_COUNT); +char **retLab = needMem(sizeof(char *) * WHITE_LIST_COUNT); +int ix,count; +for(ix=0,count=0;ix<WHITE_LIST_COUNT;ix++) + { + safef(query, sizeof(query), "select count(*) from metaDb where var = '%s'",whiteList[ix][WHITE_LIST_VAR]); + if(sqlQuickNum(conn,query) > 0) + { + retVar[count] = whiteList[ix][WHITE_LIST_VAR]; + retLab[count] = whiteList[ix][WHITE_LIST_LABEL]; + count++; + } + } +if(count == 0) + { + freez(&retVar); + freez(&retLab); + } +*metaVars = retVar; +*metaLabels = retLab; +return count; + +#else///ifndef WHITE_LIST_COUNT + +char **retVar; +char **retLab; +struct slName *el, *varList = NULL; struct sqlResult *sr = NULL; char **row = NULL; -int i; -struct slName *el, *varList = NULL; -char **retVal; -safef(query, sizeof(query), "select distinct var from metaDb"); +safef(query, sizeof(query), "select distinct var from metaDb order by var"); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) slNameAddHead(&varList, row[0]); sqlFreeResult(&sr); -retVal = needMem(sizeof(char *) * slCount(varList)); -slNameSort(&varList); -for (el = varList, i = 0; el != NULL; el = el->next, i++) - retVal[i] = el->name; -*metaValues = retVal; -return i; +retVar = needMem(sizeof(char *) * slCount(varList)); +retLab = needMem(sizeof(char *) * slCount(varList)); +slReverse(&varList); +//slNameSort(&varList); +int count = 0; +for (el = varList; el != NULL; el = el->next) + { + retVar[count] = el->name; + retLab[count] = el->name; + count++; + } +*metaVars = retVar; +*whiteLabels = retLab; +return count; +#endif///ndef WHITE_LIST_COUNT } -// FIXME: This code is duplicated in imageV2!!! -// FIXME: This code is duplicated in imageV2!!! static void trackJson(struct dyString *trackDbJson, struct track *track, int count) { // add entry for given track to the trackDbJson string @@ -202,8 +273,33 @@ dyStringPrintf(trackDbJson, "\n\t\tshortLabel: '%s',\n\t\tlongLabel: '%s',\n\t\tcanPack: %d,\n\t\tvisibility: %d\n\t}", javaScriptLiteralEncode(track->shortLabel), javaScriptLiteralEncode(track->longLabel), track->canPack, track->limitedVis); } -// FIXME: This code is duplicated in imageV2!!! -// FIXME: This code is duplicated in imageV2!!! + +void cgiDropDownWithTextValsAndExtra(char *name, char *text[], char *values[], + int count, char *selected, char *extra) +/* Make a drop-down list with both text and values. */ +{ +int i; +char *selString; +assert(values != NULL && text != NULL); +if (selected == NULL) + selected = values[0]; +printf("<SELECT"); +if (name) + printf(" NAME='%s'", name); +if (extra) + printf("%s", extra); +printf(">\n"); +for (i=0; i<count; ++i) + { + if (sameWord(values[i], selected)) + selString = " SELECTED"; + else + selString = ""; + printf("<OPTION%s value='%s'>%s</OPTION>\n", selString, values[i], text[i]); + } +printf("</SELECT>\n"); +} + void doSearchTracks(struct group *groupList) { @@ -223,8 +319,8 @@ struct slRef *tracks = NULL; int numMetadataSelects, tracksFound = 0; int numMetadataNonEmpty = 0; -char **metadataName; -char **metadataValue; +char **mdbVar; +char **mdbVal; struct hash *parents = newHash(4); boolean simpleSearch; struct trix *trix; @@ -334,8 +430,8 @@ if(numMetadataSelects) { - metadataName = needMem(sizeof(char *) * numMetadataSelects); - metadataValue = needMem(sizeof(char *) * numMetadataSelects); + mdbVar = needMem(sizeof(char *) * numMetadataSelects); + mdbVal = needMem(sizeof(char *) * numMetadataSelects); int i; for(i = 0; i < numMetadataSelects; i++) { @@ -348,14 +444,14 @@ else offset = 1; safef(buf, sizeof(buf), "%s%d", METADATA_NAME_PREFIX, i + offset); - metadataName[i] = cartOptionalString(cart, buf); + mdbVar[i] = cartOptionalString(cart, buf); if(!simpleSearch) { safef(buf, sizeof(buf), "%s%d", METADATA_VALUE_PREFIX, i + offset); - metadataValue[i] = cartOptionalString(cart, buf); - if(sameString(metadataValue[i], ANYLABEL)) - metadataValue[i] = NULL; - if(!isEmpty(metadataValue[i])) + mdbVal[i] = cartOptionalString(cart, buf); + if(sameString(mdbVal[i], ANYLABEL)) + mdbVal[i] = NULL; + if(!isEmpty(mdbVal[i])) numMetadataNonEmpty++; } } @@ -372,19 +468,20 @@ { // create defaults numMetadataSelects = 2; - metadataName = needMem(sizeof(char *) * numMetadataSelects); - metadataValue = needMem(sizeof(char *) * numMetadataSelects); - metadataName[0] = "cell"; - metadataName[1] = "antibody"; - metadataValue[0] = ANYLABEL; - metadataValue[1] = ANYLABEL; + mdbVar = needMem(sizeof(char *) * numMetadataSelects); + mdbVal = needMem(sizeof(char *) * numMetadataSelects); + mdbVar[0] = "cell"; + mdbVar[1] = "antibody"; + mdbVal[0] = ANYLABEL; + mdbVal[1] = ANYLABEL; } if(metaDbExists) { int i; - char **metaValues = NULL; - int count = metaDbVars(conn, &metaValues); + char **mdbVars = NULL; + char **mdbVarLabels = NULL; + int count = metaDbVars(conn, &mdbVars,&mdbVarLabels); for(i = 0; i < numMetadataSelects; i++) { @@ -407,13 +504,14 @@ hPrintf("</td><td>and</td>\n"); hPrintf("</td><td colspan=2 nowrap>\n"); safef(buf, sizeof(buf), "%s%i", METADATA_NAME_PREFIX, i + 1); - cgiMakeDropListClassWithStyleAndJavascript(buf, metaValues, count, metadataName[i], - "mdbVar", NULL, "onchange=findTracksMdbVarChanged(this)"); + cgiDropDownWithTextValsAndExtra(buf, mdbVarLabels, mdbVars,count,mdbVar[i],"class='mdbVar' onchange=findTracksMdbVarChanged(this)"); + //cgiMakeDropListClassWithStyleAndJavascript(buf, mdbVars, count, mdbVar[i], + // "mdbVar", NULL, "onchange=findTracksMdbVarChanged(this)"); hPrintf("is</td>\n<td>\n"); - len = getTermArray(conn, &terms, metadataName[i]); + len = getTermArray(conn, &terms, mdbVar[i]); safef(buf, sizeof(buf), "%s%i", METADATA_VALUE_PREFIX, i + 1); - cgiMakeDropListFull(buf, terms, terms, len, metadataValue[i], "class='mdbVal' onchange='findTracksSearchButtonsEnable(true)'"); - if (!simpleSearch && metadataValue[i]) + cgiMakeDropListFull(buf, terms, terms, len, mdbVal[i], "class='mdbVal' onchange='findTracksSearchButtonsEnable(true)'"); + if (!simpleSearch && mdbVal[i]) searchTermsExist = TRUE; hPrintf("</td></tr>\n"); } @@ -495,9 +593,9 @@ for(i = 0; i < numMetadataSelects; i++) { - if(!isEmpty(metadataValue[i])) + if(!isEmpty(mdbVal[i])) { - struct slName *tmp = metaDbSearch(conn, metadataName[i], metadataValue[i], "is"); + struct slName *tmp = metaDbSearch(conn, mdbVar[i], mdbVal[i], "is"); if(metaTracks == NULL) metaTracks = tmp; else