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