src/hg/lib/hui.c 1.219
1.219 2009/07/06 18:58:18 tdreszer
Added value|label to 'filterBy' and allowed filterBy to work with score for ENCODE NHGRI Bips
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.218
retrieving revision 1.219
diff -b -B -U 4 -r1.218 -r1.219
--- src/hg/lib/hui.c 6 Jul 2009 17:43:08 -0000 1.218
+++ src/hg/lib/hui.c 6 Jul 2009 18:58:18 -0000 1.219
@@ -2458,9 +2458,26 @@
{
filter += 1;
filterBy->useIndex = TRUE;
}
+ filterBy->valueAndLabel = (strchr(filter,'|') != NULL);
filterBy->slValues = slNameListFromComma(filter);
+ if(filterBy->valueAndLabel)
+ {
+ struct slName *val = filterBy->slValues;
+ for(;val!=NULL;val=val->next)
+ {
+ char * lab =strchr(val->name,'|');
+ if(lab == NULL)
+ {
+ warn("Using filterBy but only some values contain labels in form of value|label.");
+ filterBy->valueAndLabel = FALSE;
+ break;
+ }
+ *lab++ = 0;
+ strSwapChar(lab,'_',' '); // Title does not have underscores
+ }
+ }
slAddTail(&filterBySet,filterBy); // Keep them in order (only a few)
if(cart != NULL)
{
@@ -2540,8 +2557,42 @@
return dyStringCannibalize(&dyClause);
}
+struct dyString *dyAddFilterByClause(struct cart *cart, struct trackDb *tdb,
+ struct dyString *extraWhere,char *column, boolean *and)
+/* creates the where clause condition to support a filterBy setting.
+ Format: filterBy column:Title=value,value [column:Title=value|label,value|label,value|label])
+ filterBy filters are multiselect's so could have multiple values selected.
+ thus returns the "column1 in (...) and column2 in (...)" clause.
+ if 'column' is provided, and there are multiple filterBy columns, only the named column's clause is returned.
+ The 'and' param and dyString in/out allows stringing multiple where clauses together
+*/
+{
+filterBy_t *filterBySet = filterBySetGet(tdb, cart,NULL);
+if(filterBySet== NULL)
+ return extraWhere;
+
+filterBy_t *filterBy = filterBySet;
+for(;filterBy != NULL; filterBy = filterBy->next)
+ {
+ if(column != NULL && differentString(column,filterBy->column))
+ continue;
+
+ char *clause = filterByClause(filterBy);
+ if(clause != NULL)
+ {
+ if(*and)
+ dyStringPrintf(extraWhere, " AND ");
+ dyStringPrintf(extraWhere, clause);
+ freeMem(clause);
+ *and = TRUE;
+ }
+ }
+filterBySetFree(&filterBySet);
+return extraWhere;
+}
+
char *filterBySetClause(filterBy_t *filterBySet)
/* returns the "column1 in (...) and column2 in (...)" clause for a set of filterBy structs */
{
struct dyString *dyClause = newDyString(256);
@@ -2608,8 +2659,13 @@
printf("<OPTION%s value=%s>%s</OPTION>\n",(filterBy->slChoices != NULL && slNameInList(filterBy->slChoices,varName)?" SELECTED":""),varName,name);
freeMem(name);
}
}
+ if(filterBy->valueAndLabel)
+ {
+ for(slValue=filterBy->slValues;slValue!=NULL;slValue=slValue->next)
+ printf("<OPTION%s value=%s>%s</OPTION>\n",(filterBy->slChoices != NULL && slNameInList(filterBy->slChoices,slValue->name)?" SELECTED":""),slValue->name,slValue->name+strlen(slValue->name)+1);
+ }
else
{
for(slValue=filterBy->slValues;slValue!=NULL;slValue=slValue->next)
printf("<OPTION%s>%s</OPTION>\n",(filterBy->slChoices != NULL && slNameInList(filterBy->slChoices,slValue->name)?" SELECTED":""),slValue->name);
@@ -3558,8 +3614,20 @@
{
char option[256];
boolean compositeLevel = isNameAtCompositeLevel(tdb,name);
+filterBy_t *filterBySet = filterBySetGet(tdb,cart,name);
+if(filterBySet != NULL)
+ {
+ if(!tdbIsComposite(tdb) && !tdbIsCompositeChild(tdb))
+ jsIncludeFile("hui.js",NULL);
+
+ filterBySetCfgUi(tdb,filterBySet);
+ filterBySetFree(&filterBySet);
+ return; // Cannot have both 'filterBy' score and 'scoreFilter'
+ }
+
+
boolean scoreFilterOk = (trackDbSettingClosestToHome(tdb, NO_SCORE_FILTER) == NULL);
boolean glvlScoreMin = (trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN) != NULL);
if (! (scoreFilterOk || glvlScoreMin))
return;