61186725079e7333ee22fa763ffdf3dc9598c9b3 chmalee Wed Oct 23 10:40:48 2019 -0700 Deleting some unused functions from hgHubConnect now that the new jstree print functions are in place, refs #24223 diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c index d5dd50f..287e30f 100644 --- src/hg/hgHubConnect/hgHubConnect.c +++ src/hg/hgHubConnect/hgHubConnect.c @@ -737,214 +737,51 @@ safef(jsId, sizeof jsId, "hubClearButton%d", count); printf( "<input name=\"hubClearButton\" id='%s' " "class=\"hubButton\" type=\"button\" value=\"Retry Hub\">" , jsId); jsOnEventByIdF("click", jsId, "document.resetHubForm.elements['hubCheckUrl'].value='%s';" "document.resetHubForm.submit();return true;", hubInfo->hubUrl); ourCellEnd(); } printGenomeList(hubInfo->hubUrl, dbListNames, count, hubHasNoError); printf("</tr>\n"); } - -void printSearchOutputForTrack(struct tdbOutputStructure *tdbOut) -/* Write out a <li> entry for a search hit on a track, along with a nested - * <ul> for any included hits to subtracks */ -{ -printf("<li configLink='%s' nodeType='track'>\n", dyStringContents(tdbOut->configUrl)); -printf("%s", dyStringContents(tdbOut->shortLabel)); -if (tdbOut->childCount > 0) - printf(" (%d subtrack%s)", tdbOut->childCount, tdbOut->childCount==1?"":"s"); -if (isNotEmpty(dyStringContents(tdbOut->metaTags))) - { - printf("<br><span class='descriptionMatch'><em>Metadata: %s</em></span>\n", dyStringContents(tdbOut->metaTags)); - } -if (isNotEmpty(dyStringContents(tdbOut->descriptionMatch))) - { - printf("<br><span class='descriptionMatch'><em>Description: %s</em></span>\n", dyStringContents(tdbOut->descriptionMatch)); - } -if (tdbOut->children != NULL) - { - struct tdbOutputStructure *child = tdbOut->children; - printf("<ul>\n"); - while (child != NULL) - { - printSearchOutputForTrack(child); - child = child->next; - } - printf("</ul>\n"); - } -printf("</li>\n"); -} - - -void printSearchOutputForGenome(struct genomeOutputStructure *genomeOut) -/* Write out a chunk of search results for a genome as a <li>, with a nested ul - * element for hits to tracks within that genome */ -{ -printf("<li assemblyLink='%s' nodeType='assembly'>%s", - dyStringContents(genomeOut->assemblyLink), dyStringContents(genomeOut->shortLabel)); -if (genomeOut->trackCount > 0) - printf(" (%d track%s)", genomeOut->trackCount, genomeOut->trackCount==1?"":"s"); - -if (isNotEmpty(dyStringContents(genomeOut->metaTags))) - { - printf("<br><span class='descriptionMatch'><em>%s</em></span>\n", dyStringContents(genomeOut->metaTags)); - } -if (isNotEmpty(dyStringContents(genomeOut->descriptionMatch))) - { - printf("<br>\n<em>Assembly Description:</em> %s\n", dyStringContents(genomeOut->descriptionMatch)); - } -if (genomeOut->tracks != NULL) - { - printf("<ul>\n"); - struct tdbOutputStructure *tdbOut = genomeOut->tracks; - while (tdbOut != NULL) - { - printSearchOutputForTrack(tdbOut); - tdbOut = tdbOut->next; - } - printf("</ul>\n"); - } -printf("</li>\n"); -} - - struct trackHub *fetchTrackHub(struct hubEntry *hubInfo) /* Fetch the hub structure for a public hub, trapping the error * if the hub cannot be reached */ { struct errCatch *errCatch = errCatchNew(); struct trackHub *hub = NULL; if (errCatchStart(errCatch)) { char hubName[4096]; safef(hubName, sizeof(hubName), "hub_%d", hubInfo->id); hub = trackHubOpen(hubInfo->hubUrl, hubName); } errCatchEnd(errCatch); if (errCatch->gotError) { fprintf(stderr, "%s\n", errCatch->message->string); } errCatchFree(&errCatch); return hub; } - -struct tdbOutputStructure *addOrUpdateTrackOut(char *track, struct genomeOutputStructure *genomeOut, - struct hash *tdbHash, struct trackHub *hub) -/* If an output structure already exists for the track within genomeOut, return that. Otherwise, - * create one for it and add it to genomeOut. Any missing parent tracks are also added at - * the same time. - * tdbHash takes track names to the struct trackDb * for that track */ -{ -struct tdbOutputStructure *tdbOut = hashFindVal(genomeOut->tdbOutHash, track); -if (tdbOut == NULL) - { - genomeOut->trackCount++; - AllocVar(tdbOut); - tdbOut->shortLabel = dyStringNew(0); - tdbOut->metaTags = dyStringNew(0); - tdbOut->descriptionMatch = dyStringNew(0); - tdbOut->configUrl = dyStringNew(0); - struct trackDb *trackInfo = (struct trackDb *) hashFindVal(tdbHash, track); - if (trackInfo == NULL) - { - // Some tracks are prefixed with the hub name; try that - char withHubName[4096]; - safef(withHubName, sizeof(withHubName), "%s_%s", hub->name, track); - trackInfo = hashFindVal(tdbHash, withHubName); - if (trackInfo == NULL) - { - warn("Error: Unable to locate info for matching track '%s'. Skipping ...\n", withHubName); - return NULL; - } - } - if (isNotEmpty(trackInfo->longLabel)) - dyStringPrintf(tdbOut->shortLabel, "%s", trackInfo->longLabel); - else if (isNotEmpty(trackInfo->shortLabel)) - dyStringPrintf(tdbOut->shortLabel, "%s", trackInfo->shortLabel); - else - dyStringPrintf(tdbOut->shortLabel, "%s", trackHubSkipHubName(trackInfo->track)); - - if (tdbIsCompositeView(trackInfo) || tdbIsCompositeChild(trackInfo)) - { - struct trackDb *parentTdb = tdbGetComposite(trackInfo); - dyStringPrintf(tdbOut->configUrl, "../cgi-bin/hgTrackUi?hubUrl=%s&db=%s&g=%s&hgsid=%s&%s", hub->url, - genomeOut->genomeName, parentTdb->track, cartSessionId(cart), genomeOut->positionString); - } - else - { - dyStringPrintf(tdbOut->configUrl, "../cgi-bin/hgTrackUi?hubUrl=%s&db=%s&g=%s&hgsid=%s&%s", hub->url, - genomeOut->genomeName, trackInfo->track, cartSessionId(cart), genomeOut->positionString); - } - - if (trackInfo->parent != NULL) - { - struct trackDb *parent = trackInfo->parent; - struct tdbOutputStructure *parentOut = addOrUpdateTrackOut(parent->track, genomeOut, tdbHash, hub); - if (parentOut != NULL) - { - // addOrUpdateTrackOut only returns NULL if it can't find the parent here. - // This probably means the trackDb is corrupted, which should have already - // generated a fatal error. All the same ... - slAddTail(&(parentOut->children), tdbOut); - parentOut->childCount++; - } - else - { - // If we can't find the track's rightful parent, we can't report its position - // in the track hierarchy accurately. Time to abort. A warning will already - // have been generated by addOrUpdateTrackOut(parent) failing. - return NULL; - } - } - else - // No parent track, so add it to the root level track list for output - slAddTail(&(genomeOut->tracks), tdbOut); - hashAdd(genomeOut->tdbOutHash, track, tdbOut); - } -return tdbOut; -} - - -void buildTdbHash(struct hash *tdbHash, struct trackDb *tdbList) -/* Recursively add all tracks from tdbList to the hash (indexed by track), - * along with all parents and children of those tracks */ -{ -struct trackDb *tdb = tdbList; -while (tdb != NULL) - { - hashAdd(tdbHash, tdb->track, tdb); - if (tdb->subtracks != NULL) - buildTdbHash(tdbHash, tdb->subtracks); - if (tdb->parent != NULL) - { - // supertracks might be omitted from tdbList, but are still referred to by parent links - if (hashFindVal(tdbHash, tdb->parent->track) == NULL) - hashAdd(tdbHash, tdb->parent->track, tdb->parent); - } - tdb = tdb->next; - } -} - - char *getPositionStringForDb(struct trackHubGenome *genome) { char positionVar[1024]; safef(positionVar, sizeof(positionVar), "position.%s", genome->name); char *position = cartOptionalString(cart, positionVar); if (position == NULL) { struct dyString *tmp = dyStringCreate("position="); if (genome->defaultPos != NULL) dyStringAppend(tmp, genome->defaultPos); else dyStringAppend(tmp, hDefaultPos(genome->name)); // memory leak from hDefaultPos return value position = dyStringCannibalize(&tmp); } return position; @@ -1156,31 +993,31 @@ static char *tdbOutputStructureLabelToId(struct tdbOutputStructure *tdbOut) /* Make an array name out of a tdbOutputStruct */ { struct dyString *id = dyStringNew(0); dyStringPrintf(id, "%s", htmlEncode(dyStringContents(tdbOut->shortLabel))); if (tdbOut->childCount > 0) { dyStringPrintf(id, " (%d subtrack%s)", tdbOut->childCount, tdbOut->childCount == 1 ? "" : "s"); } return dyStringCannibalize(&id); } static void printTdbOutputStructureToDyString(struct tdbOutputStructure *tdbOut, struct dyString *dy, char *arrayName) -/* Print a tdbOutputStructure to a dyString*/ +/* Print a tdbOutputStructure to a dyString, recursive for subtracks. */ { dyStringPrintf(dy, "trackData['%s'] = [", arrayName); if (tdbOut->childCount > 0) { struct dyString *subtrackDy = dyStringNew(0); struct tdbOutputStructure *child = tdbOut->children; while (child != NULL) { char *childId = tdbOutputStructureLabelToId(child); dyStringPrintf(dy, "\n\t{\n\tid: '%s',\n\tparent: '%s',\n\t" "li_attr: {nodetype:'track', configlink:'%s'},\n\ttext: \'%s ", childId, arrayName, dyStringContents(child->configUrl), childId); if (isNotEmpty(dyStringContents(child->metaTags))) { @@ -1197,49 +1034,47 @@ { dyStringPrintf(dy, ",\n\tchildren: true"); printTdbOutputStructureToDyString(child, subtrackDy, childId); } dyStringPrintf(dy, "\n\t},"); child = child->next; } dyStringPrintf(dy, "];\n"); if (isNotEmpty(dyStringContents(subtrackDy))) dyStringPrintf(dy, "%s", subtrackDy->string); } else dyStringPrintf(dy, "];\n"); } - void printGenomeOutputStructureToDyString(struct genomeOutputStructure *genomeOut, struct dyString *dy, char *genomeNameId) -/* Print a genomeOutputStructure to a dyString */ +/* Print a genomeOutputStructure to a dyString. The structure here is: + * trackData[genome] = [{track 1 obj}, {track2 obj}, {track3 obj}, ... ] + * trackData[track1] = [{search hit text}, {subtrack1 obj}, {subtrack2 obj}, ... ] + * + * if track1, track2, track3 are container tracks, then the recursive function + * tdbOutputStructureToDystring creates the above trackData[track1] = [{}] for + * each of the containers, otherwise a single child of the genome is sufficient */ { struct tdbOutputStructure *tdbOut = NULL; static struct dyString *tdbArrayDy = NULL; // the dyString for all of the tdb objects static struct dyString *idString = NULL; // the special id of this track if (tdbArrayDy == NULL) tdbArrayDy = dyStringNew(0); if (idString == NULL) idString = dyStringNew(0); -// The structure here is: -// trackData[genome] = [{track 1 obj}, {track2 obj}, {track3 obj}, ... ] -// trackData[track1] = [{search hit text}, {subtrack1 search hit}, {subtrack2 search hit}, ... ] -// -// if track1, track2, track3 are container tracks, then the recursive function -// tdbOutputStructureToDystring creates the above trackData[track1] = [{}] for -// each of the containers, otherwise a single child of the genome is sufficient dyStringPrintf(dy, "trackData['%s'] = [", genomeNameId); if (genomeOut->tracks != NULL) { tdbOut = genomeOut->tracks; slReverse(&tdbOut); while (tdbOut != NULL) { dyStringPrintf(idString, "%s", tdbOutputStructureLabelToId(tdbOut)); dyStringPrintf(dy, "\n\t{\n\t'id': '%s',\n\t'parent': '%s',\n\t" "'li_attr': {'nodetype':'track', configlink: '%s'},\n\t'text': \'%s ", idString->string, genomeNameId, dyStringContents(tdbOut->configUrl), idString->string); if (isNotEmpty(dyStringContents(tdbOut->metaTags))) { dyStringPrintf(dy, "<br><span class=\\'descriptionMatch\\'><em>Metadata: %s</em></span>", htmlEncode(dyStringContents(tdbOut->metaTags))); @@ -1254,35 +1089,40 @@ // above we took care of both non-heirarchical tracks and the top-level containers, // now do container children, which also takes care of any deeper heirarchies if (tdbOut->childCount > 0) dyStringPrintf(dy, ",\n\t'children': true"); dyStringPrintf(dy, "\n\t},\n"); if (tdbOut->childCount > 0) printTdbOutputStructureToDyString(tdbOut, tdbArrayDy, idString->string); tdbOut = tdbOut->next; dyStringClear(idString); } } dyStringPrintf(dy, "];\n"); // close off genome node dyStringPrintf(dy, "%s\n", tdbArrayDy->string); dyStringClear(tdbArrayDy); -dyStringClear(idString); } void printHubOutputStructure(struct hubOutputStructure *hubOut, struct hubEntry *hubInfo) -/* Convert a hubOutputStructure to a jstree-readable string */ +/* Convert a hubOutputStructure to a jstree-readable string. This function forms the root + * node for each hub search tree, whose children are the hub description match and each individual + * genome node. A simplified structure is: + * trackData['#_hubId'] = [{id:'descriptionMatch',...},{id:'assembly1',...},...] + * + * The id's become new "trackData[id]" entries with their own arrays later if they have + * sub-trees (via printGenomeOutputStructureToDyString() and printTdbOutputStructureToDyString(). */ { struct dyString *dy = dyStringNew(0); // The leading '#' tells the javascript this is a 'root' node dyStringPrintf(dy, "trackData['#_%d'] = [", hubInfo->id); if (isNotEmpty(dyStringContents(hubOut->descriptionMatch))) { dyStringPrintf(dy, "{'id':'%d_descriptionMatchText','parent':'#_%d'," "'state':{'opened': true},'text': 'Hub Description: " "<span class=\"descriptionMatch\"><em>%s</em></span>'},", hubInfo->id, hubInfo->id, htmlEncode(dyStringContents(hubOut->descriptionMatch))); } struct genomeOutputStructure *genomeOut = hubOut->genomes; struct dyString *genomeDy = dyStringNew(0); if (genomeOut != NULL) {