a469233b735071329c483e7c850956ec12f937a1 braney Wed Sep 15 17:21:55 2021 -0700 be smarter about checking to see if users are specifying a filter on the same field in different ways diff --git src/hg/lib/hui.c src/hg/lib/hui.c index efb5846..b76e354 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -6091,36 +6091,61 @@ *min = NULL; // default these outs! if (max) *max = NULL; char *setting = trackDbSettingClosestToHome(tdb, scoreName); if (setting) { if (strchr(setting,':') != NULL) return colonPairToStrings(setting,min,max); else if (min) *min = cloneString(setting); return TRUE; } return FALSE; } +static void setAsNewFilterType(struct trackDb *tdb, char *name, char *field) +/* put the full name of the trackDb variable in a hash of field names if it's specified in the "new" way */ +{ +struct hash *hash = tdb->isNewFilterHash; + +if (hash == NULL) + hash = tdb->isNewFilterHash = newHash(5); + +hashAdd(hash, field, name); +} + +static char *isNewFilterType(struct trackDb *tdb, char *name) +/* check to see if a field name is in the "new" hash. If it is, return the full trackDb variable name */ +{ +if ((tdb == NULL) || (tdb->isNewFilterHash == NULL)) + return NULL; + +struct hashEl *hel = hashLookup(tdb->isNewFilterHash, name); + +if (hel == NULL) + return NULL; + +return hel->val; +} + char *getScoreNameAdd(struct trackDb *tdb, char *scoreName, char *add) // Add a suffix to a filter for more information { char scoreLimitName[1024]; char *name = cloneString(scoreName); -if (tdb->isNewFilterType) +if (isNewFilterType(tdb, scoreName) != NULL) { char *dot = strchr(name, '.'); *dot++ = 0; safef(scoreLimitName, sizeof(scoreLimitName), "%s%s.%s", name, add, dot); } else safef(scoreLimitName, sizeof(scoreLimitName), "%s%s", scoreName, add); return cloneString(scoreLimitName); } static boolean getScoreLimitsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults, char**min,char**max) // returns TRUE if limits exist and sets the string pointer (because they may be float or int) // if min or max are set, then they should be freed { @@ -6332,56 +6357,56 @@ } struct trackDbFilter *tdbGetTrackFilters( struct trackDb *tdb, char * lowWild, char * lowName, char * capWild, char * capName) // figure out which of the ways to specify trackDb filter variables we're using // and return the setting { struct trackDbFilter *trackDbFilterList = NULL; struct slName *filterSettings = trackDbSettingsWildMatch(tdb, lowWild); if (filterSettings) { struct trackDbFilter *tdbFilter; struct slName *filter = NULL; while ((filter = slPopHead(&filterSettings)) != NULL) { - tdb->isNewFilterType = TRUE; - AllocVar(tdbFilter); slAddHead(&trackDbFilterList, tdbFilter); tdbFilter->name = cloneString(filter->name); tdbFilter->setting = trackDbSetting(tdb, filter->name); tdbFilter->fieldName = extractFieldNameNew(filter->name, lowName); + setAsNewFilterType(tdb, tdbFilter->name, tdbFilter->fieldName); } } filterSettings = trackDbSettingsWildMatch(tdb, capWild); if (filterSettings) { struct trackDbFilter *tdbFilter; struct slName *filter = NULL; while ((filter = slPopHead(&filterSettings)) != NULL) { if (differentString(filter->name,NO_SCORE_FILTER)) { - if (tdb->isNewFilterType) - errAbort("browser doesn't support specifying filters in both old and new format."); AllocVar(tdbFilter); slAddHead(&trackDbFilterList, tdbFilter); tdbFilter->name = cloneString(filter->name); tdbFilter->setting = trackDbSetting(tdb, filter->name); tdbFilter->fieldName = extractFieldNameOld(filter->name, capName); + char *name; + if ((name = isNewFilterType(tdb, tdbFilter->fieldName) ) != NULL) + errAbort("error specifying a field's filters in both old (%s) and new format (%s).", tdbFilter->name, name); } } } return trackDbFilterList; } struct trackDbFilter *tdbGetTrackNumFilters( struct trackDb *tdb) // get the number filters out of trackDb { return tdbGetTrackFilters( tdb, FILTER_NUMBER_WILDCARD_LOW, FILTER_NUMBER_NAME_LOW, FILTER_NUMBER_WILDCARD_CAP, FILTER_NUMBER_NAME_CAP); } struct trackDbFilter *tdbGetTrackTextFilters( struct trackDb *tdb) // get the text filters out of trackDb