src/hg/lib/hui.c 1.163
1.163 2009/03/03 18:32:33 tdreszer
Fix filterByScore assumptions
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.162
retrieving revision 1.163
diff -b -B -U 4 -r1.162 -r1.163
--- src/hg/lib/hui.c 2 Mar 2009 23:58:03 -0000 1.162
+++ src/hg/lib/hui.c 3 Mar 2009 18:32:33 -0000 1.163
@@ -3165,63 +3165,75 @@
}
return FALSE;
}
struct dyString *dyAddFilterAsInt(struct cart *cart, struct trackDb *tdb,
- struct dyString *extraWhere,char *filter,char *defaultVal, char*field, boolean *and)
+ struct dyString *extraWhere,char *filter,char *defaultLimits, char*field, boolean *and)
/* creates the where clause condition to support numeric int filter range.
Filters are expected to follow
- {fiterName}: trackDb min:max values
+ {fiterName}: trackDb min[:max] values
{filterName}Min: cart variable
{filterName}Max: cart variable Optional (and considered non-existent if -99)
{filterName}Limits: trackDb allowed range "0:1000" Optional
- The and param allows stringing multiple where clauses together */
+ The 'and' param allows stringing multiple where clauses together */
{
+#define NO_VALUE -999
char *setting = trackDbSettingClosestToHome(tdb, filter);
if(setting)
{
boolean invalid = FALSE;
char filterLimitName[64];
+ int minValueTdb = 0,maxValueTdb = NO_VALUE;
+ if(strchr(setting,':') != NULL)
+ {
+ char *minStr = strSwapChar(cloneString(setting),':',0);
+ minValueTdb = atoi(minStr);
+ maxValueTdb = atoi(minStr + strlen(minStr) + 1);
+ freeMem(minStr);
+ }
+ else
+ minValueTdb = atoi(setting);
safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _LIMITS);
- setting = trackDbSettingClosestToHomeOrDefault(tdb, filterLimitName,defaultVal);
+ setting = trackDbSettingClosestToHomeOrDefault(tdb, filterLimitName,defaultLimits);
safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _MAX);
- int max = cartUsualIntClosestToHome(cart,tdb,FALSE,filterLimitName, 0);
+ int max = cartUsualIntClosestToHome(cart,tdb,FALSE,filterLimitName, maxValueTdb);
safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _MIN);
- int min = cartUsualIntClosestToHome(cart,tdb,FALSE,filterLimitName, -99);
+ int min = cartUsualIntClosestToHome(cart,tdb,FALSE,filterLimitName, minValueTdb);
if(setting)
{
char *minStr = strSwapChar(cloneString(setting),':',0);
char *maxStr = minStr + strlen(minStr) + 1;
- if(min < atof(minStr) || min > atof(maxStr)
- || (max != -99 && (max < atof(minStr) || max > atof(maxStr))))
+ if((min != minValueTdb && (min < atoi(minStr) || min > atoi(maxStr)) && min != 0)
+ || (max != maxValueTdb && (max < atoi(minStr) || max > atoi(maxStr))))
{
invalid = TRUE;
- if(max == -99)
+ if(max == NO_VALUE) // min only is allowed, but max only is not
warn("invalid filter by %s: %d is outside of range (%s to %s) for track %s", field, min, minStr, maxStr, tdb->tableName);
else
warn("invalid filter by %s: min:%d and max:%d is outside of range (%s to %s) for track %s", field, min, max, minStr, maxStr, tdb->tableName);
}
freeMem(minStr);
+ }
+ // else no default limits!
if(invalid)
{
cartRemoveVariableClosestToHome(cart,tdb,FALSE,filterLimitName);
safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _MAX); // Remake name
cartRemoveVariableClosestToHome(cart,tdb,FALSE,filterLimitName);
}
- else
+ else if(min != 0) // Assumes 0 is no filter!
{
- if(max == -99)
+ if(max == NO_VALUE)
dyStringPrintf(extraWhere, "%s(%s >= %d)", (*and?" and ":""),field,min);
else
dyStringPrintf(extraWhere, "%s(%s BETWEEN %d and %d)", (*and?" and ":""),field,min,max);
*and=TRUE;
}
}
- }
return extraWhere;
}
struct dyString *dyAddFilterAsDouble(struct cart *cart, struct trackDb *tdb,
- struct dyString *extraWhere,char *filter,char *defaultVal, char*field, boolean *and)
+ struct dyString *extraWhere,char *filter,char *defaultLimits, char*field, boolean *and)
/* creates the where clause condition to support numeric double filters.
Filters are expected to follow
{fiterName}: trackDb min value;
{filterName}Min: cart variable;
@@ -3230,14 +3242,17 @@
{
char *setting = trackDbSettingClosestToHome(tdb, filter);
if(setting)
{
+ double minValueTdb = atof(setting);
boolean invalid = FALSE;
char filterLimitName[64];
safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _LIMITS);
- setting = trackDbSettingClosestToHomeOrDefault(tdb, filterLimitName,defaultVal);
+ setting = trackDbSettingClosestToHomeOrDefault(tdb, filterLimitName,defaultLimits);
safef(filterLimitName, sizeof(filterLimitName), "%s%s", filter, _MIN);
- double value = cartUsualDoubleClosestToHome(cart,tdb,FALSE,filterLimitName, 0);
+ double value = cartUsualDoubleClosestToHome(cart,tdb,FALSE,filterLimitName, minValueTdb);
+ if(value != minValueTdb && value != 0) // assume tdb min value is within range! (don't give user errors that have no consequence)
+ {
if(setting)
{
char *minStr = strSwapChar(cloneString(setting),':',0);
char *maxStr = minStr + strlen(minStr) + 1;
@@ -3247,16 +3262,17 @@
warn("invalid filter by %s: %lf is outside of range (%s to %s) for track %s", field, value, minStr, maxStr, tdb->tableName);
}
freeMem(minStr);
}
- else if (value < 0)
+ else if (value < 0) // No range specified: must be non-negative
{
- warn("invalid filter by %s: %lf is less than 0 for track %s", field,value, tdb->tableName);
invalid = TRUE;
+ warn("invalid filter by %s: %lf is less than 0 for track %s", field,value, tdb->tableName);
+ }
}
if(invalid)
cartRemoveVariableClosestToHome(cart,tdb,FALSE,filterLimitName);
- else
+ else if(value != 0) // Assume zero is no filter in all cases
{
dyStringPrintf(extraWhere, "%s((%s >= %f) or (%s = -1))", (*and?" and ":""),field,value,field);
*and=TRUE;
}
@@ -3289,10 +3305,8 @@
{
max += 1;
min = strSwapChar(cloneString(setting),':',0);
}
- //char *min = strSwapChar(cloneString(setting),':',0);
- //char *max = min + strlen(min) + 1;
puts("<TR><TD align='right'><B>Filter score range: min:</B><TD align='left'>");
safef(varName, sizeof(varName), "%s.%s%s", name, SCORE_FILTER,_MIN);
cgiMakeTextVar(varName, cartUsualStringClosestToHome(cart, tdb, compositeLevel, varName + (strlen(name) + 1), min), 4);
if(max != NULL)