5bfb32fdfc639f9bffb5435044cef164bdde0b28
kent
  Sun Dec 12 08:02:13 2021 -0800
Implementing barChartMerge trackDb option for faceted bar charts.

diff --git src/hg/lib/barChartUi.c src/hg/lib/barChartUi.c
index 83e5257..46e8094 100644
--- src/hg/lib/barChartUi.c
+++ src/hg/lib/barChartUi.c
@@ -438,48 +438,57 @@
 /* Write html to make white background */
 hInsideStyleToWhite();
 
 /* Set up url that has enough context to get back to us.  */
 struct dyString *returnUrl = dyStringNew(0);
 dyStringPrintf(returnUrl, "../cgi-bin/hgTrackUi?g=%s", track);
 dyStringPrintf(returnUrl, "&%s", cartSidUrlString(cart));
 
 /* Load up table from tsv file */
 char *requiredStatsFields[] = {"count",};
 struct fieldedTable *table = fieldedTableFromTabFile(statsFile, statsFile, 
     requiredStatsFields, ArraySize(requiredStatsFields));
 
 /* Update facet selections from users input if any and get selected part of table */
 struct facetedTable *facTab = facetedTableFromTable(table, tdb->track, facets);
+facTab->mergeFacetsOk = trackDbSettingOn(tdb, "barChartMerge");
 facetedTableUpdateOnClick(facTab, cart);
-struct fieldedTable *selected = facetedTableSelect(facTab, cart);
+struct facetField **selectedFf = NULL;
+struct fieldedTable *selected = facetedTableSelect(facTab, cart, &selectedFf);
 
 /* Add wrapper function(s) */
 struct hash *wrapperHash = hashNew(0);
 hashAdd(wrapperHash, "color", wrapColor);
 
 /* Pick which fields to display.  We'll take the first field whatever it is
  * named, color if possible, and also count, and any faceted fields. */
 struct dyString *displayList = dyStringNew(0);
-int colorIx = fieldedTableFindFieldIx(table, "color");
+int colorIx = fieldedTableFindFieldIx(selected, "color");
 if (colorIx >= 0)
    dyStringPrintf(displayList, "color,");
-dyStringAppend(displayList, table->fields[0]);
-dyStringPrintf(displayList, ",count,%s", facets);
+dyStringAppend(displayList, selected->fields[0]);
+dyStringPrintf(displayList, ",count");
+struct slName *facetNameList = slNameListFromComma(facets);
+struct slName *facetName;
+for (facetName = facetNameList; facetName != NULL; facetName = facetName->next)
+    {
+    if (fieldedTableFindFieldIx(selected, facetName->name))
+       dyStringPrintf(displayList, ",%s", facetName->name);
+    }
 
 /* Put up facets and table */
-facetedTableWriteHtml(facTab, cart, selected, displayList->string,
+facetedTableWriteHtml(facTab, cart, selected, selectedFf, displayList->string,
     returnUrl->string, 40, wrapperHash, NULL, 7);
 
 /* Clean up and go home. */
 facetedTableFree(&facTab);
 }
 
 void barChartCfgUi(char *database, struct cart *cart, struct trackDb *tdb, char *track, 
                         char *title, boolean boxed)
 /* Put up facets in certain situations. */
 {
 if (cartVarExists(cart, "ajax"))
     isPopup = TRUE;
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 if (startsWith("big", tdb->type))
     labelCfgUi(database, cart, tdb, track);