660387765d7bd58729c204580b26bd016b0afeaa
chmalee
  Mon Nov 21 14:30:49 2022 -0800
Do a quick async chromosome name lookup before sending a full search request from hgTracks/hgGateway

diff --git src/hg/hgSearch/hgSearch.c src/hg/hgSearch/hgSearch.c
index 5e46180..ec7655c 100644
--- src/hg/hgSearch/hgSearch.c
+++ src/hg/hgSearch/hgSearch.c
@@ -11,30 +11,31 @@
 #include "hui.h"
 #include "udc.h"
 #include "knetUdc.h"
 #include "hgConfig.h"
 #include "jsHelper.h"
 #include "errCatch.h"
 #include "hgFind.h"
 #include "cartJson.h"
 #include "trackHub.h"
 #include "hubConnect.h"
 #include "jsonWrite.h"
 #include "hgFind.h"
 #include "trix.h"
 #include "genbank.h"
 #include "cartTrackDb.h"
+#include "chromAlias.h"
 
 // name of the searchBar form variable from the HTML
 #define SEARCH_TERM_VAR "search"
 #define SEARCH_LIMIT 100
 
 /* Standard CGI Global Variables */
 struct cart *cart;             /* CGI and other variables */
 struct hash *oldVars = NULL;
 boolean measureTiming = FALSE;
 
 /* These globals are for creating the category tree interface */
 struct trackDb *hgFindTdbList = NULL;
 struct grp *hgFindGrpList = NULL;
 
 struct dbDbHelper
@@ -503,55 +504,81 @@
     // list if this is the first time seeing this species or append to the end
     // of the list to keep things in the right order
     struct jsonElement *genomeList = NULL;
     if ( (genomeList = jsonFindNamedField(genomesObj, dbDb->genome, dbDb->genome)) != NULL)
         jsonListAdd(genomeList, genomeObj);
     else
         {
         genomeList = newJsonList(NULL);
         jsonListAdd(genomeList, genomeObj);
         jsonObjectAdd(genomesObj, dbDb->genome, genomeList);
         }
     }
 return genomesObj;
 }
 
+static void getChromName(struct cartJson *cj, struct hash *paramHash)
+/* Check if search term is a valid chromosome name, if so return the
+ * UCSC approved chromsome name for easy redirect to hgTracks/CGI. If
+ * no chromosome name return chromName: null and let the user handle it */
+{
+// we need to connect to database explicitly to handle hub chromosomes (hs1):
+char *database = NULL, *genome = NULL;
+getDbAndGenome(cj->cart, &database, &genome, oldVars);
+char *term = cartJsonRequiredParam(paramHash, "searchTerm", cj->jw, "getChromName");
+chromAliasSetup(database);
+char *chromName = NULL;
+
+// wrap this lookup in an errCatch so we can silently return
+// a null chromosome name if there was a problem. This is meant
+// for quick look ups so if a term is not a chrom name it's not
+// a big deal
+struct errCatch *errCatch = errCatchNew();
+if (errCatchStart(errCatch))
+    chromName = hgOfficialChromName(database, term);
+errCatchEnd(errCatch);
+
+// whoever consumes this json can deal with a NULL chromName
+jsonWriteString(cj->jw, "chromName", chromName);
+}
+
 /* End Handlers */
 
 /* Start do commands, functions that dispatch */
 void doSaveCategoriesToCart(struct cartJson *cj, struct hash *paramHash)
 /* Save any selected categories to the cart so if the user clicks the back button
  * from hgTracks/hgTrackUi/etc we know what they were last looking at */
 {
 char *db = cartUsualString(cj->cart, "db", hDefaultDb());
 struct jsonElement *jel = hashFindVal(paramHash, "categs");
 if (jel == NULL)
     {
     jsonWriteStringf(cj->jw, "error",
 		     "saveCategoriesToCart: required param 'categs' is missing");
     return;
     }
 jsonElementSaveCategoriesToCart(db,jel);
 }
 
 void doCartJson()
 /* Register functions that return JSON to client */
 {
 struct cartJson *cj = cartJsonNew(cart);
 cartJsonRegisterHandler(cj, "getSearchResults", getSearchResults);
 cartJsonRegisterHandler(cj, "getUiState", getUiState);
 cartJsonRegisterHandler(cj, "saveCategoriesToCart", doSaveCategoriesToCart);
+cartJsonRegisterHandler(cj, "getChromName", getChromName);
 cartJsonExecute(cj);
 }
 
 void doMainPage()
 /* Print the basic HTML page and include any necessary Javascript. AJAX calls
  * will fill out the page later */
 {
 char *database = NULL;
 char *genome = NULL;
 getDbAndGenome(cart, &database, &genome, oldVars);
 webStartGbNoBanner(cart, database, "Search Disambiguation");
 printMainPageIncludes();
 jsInlineF("var hgsid='%s';\n", cartSessionId(cart));
 struct jsonElement *cartJson = newJsonObject(hashNew(0));
 jsonObjectAdd(cartJson, "db", newJsonString(database));