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));